ModSecurity(mod_security) の Core Rule Set(CRS)を読み解く【その1:global_config, config】

Apache モジュールである ModSecurity*1 の Core Rule Set(CRS)*2となっていた。

  • 確認したバージョン
    • modsecurity-crs v2.0.2(2009年10月2日現在)

CRS v2.0.2 の tar 玉をダウンロードし展開すると、以下のような構成となっている。解凍したディレクトリ直下にある、modsecurity_crs_10_global_config.conf と modsecurity_crs_10_config.conf の 2 つのファイルが、ModSecurity全体の設定ファイルとなる。この日記では、この 2 つの conf ファイルを ModSecurity Reference Manual*3 を基に読み解いてみる。

# tar xzvf modsecurity-crs_2.0.2.tar.gz
# cd modsecurity-crs_2.0.2
# ls -1R
.:
CHANGELOG
LICENSE
README
base_rules
modsecurity_crs_10_config.conf
modsecurity_crs_10_global_config.conf
optional_rules
util

./base_rules:
modsecurity_40_generic_attacks.data
modsecurity_41_sql_injection_attacks.data
modsecurity_46_et_sql_injection.data
modsecurity_46_et_web_rules.data
modsecurity_50_outbound.data
modsecurity_crs_20_protocol_violations.conf
modsecurity_crs_21_protocol_anomalies.conf
modsecurity_crs_23_request_limits.conf
modsecurity_crs_30_http_policy.conf
modsecurity_crs_35_bad_robots.conf
modsecurity_crs_40_generic_attacks.conf
modsecurity_crs_41_phpids_filters.conf
modsecurity_crs_41_sql_injection_attacks.conf
modsecurity_crs_41_xss_attacks.conf
modsecurity_crs_45_trojans.conf
modsecurity_crs_46_et_sql_injection.conf
modsecurity_crs_46_et_web_rules.conf
modsecurity_crs_47_common_exceptions.conf
modsecurity_crs_48_local_exceptions.conf
modsecurity_crs_49_enforcement.conf
modsecurity_crs_50_outbound.conf
modsecurity_crs_60_correlation.conf

./optional_rules:
modsecurity_crs_20_protocol_violations.conf
modsecurity_crs_21_protocol_anomalies.conf
modsecurity_crs_40_generic_attacks.conf
modsecurity_crs_42_comment_spam.conf
modsecurity_crs_42_tight_security.conf
modsecurity_crs_55_marketing.conf

./util:
httpd-guardian.pl
modsec-clamscan.pl
runav.pl

modsecurity_crs_10_global_config.conf

ModSecurity 全体に関連する設定が 5 つ定義されていた。ちなみにここでの設定値は CRS の初期値である。

### HTTP レスポンスの Server ヘッダの変更
# 初期値のままだと、Server ヘッダそのものが出力されない
# http://www.modsecurity.org/documentation/modsecurity-apache/2.5.10/modsecurity2-apache-reference.html#N10BEE
SecServerSignature " "

### ModSecurity 検知ルールのシグネチャ(デバック用)
# ModSecurity の Audit Log に出力される
# http://www.modsecurity.org/documentation/modsecurity-apache/2.5.10/modsecurity2-apache-reference.html#N104DA
SecComponentSignature "core ruleset/2.0.2"

### POST リクエストで送信された form データの分割文字の定義
# 通常は「&」なので、特に変更する必要なし
# http://www.modsecurity.org/documentation/modsecurity-apache/2.5.10/modsecurity2-apache-reference.html#N101DE
SecArgumentSeparator "&"

### initcol アクションで定義したデータの保存ディレクトリの定義
# http://www.modsecurity.org/documentation/modsecurity-apache/2.5.10/modsecurity2-apache-reference.html#N10566
SecDataDir /tmp

### 必ず実行される Action の定義
# Apache が HTTP リクエストヘッダを読み取った段階で実行される(phase:1)
# global, 変数 remote_addr が保存されるらしいが、ドキュメントに大した情報がないな
# initcol
# http://www.modsecurity.org/documentation/modsecurity-apache/2.5.10/modsecurity2-apache-reference.html#N11847
# SecAction
# http://www.modsecurity.org/documentation/modsecurity-apache/2.5.10/modsecurity2-apache-reference.html#N101AD
SecAction "phase:1,t:none,pass,nolog,initcol:global=global,initcol:ip=%{remote_addr}"

modsecurity_crs_10_config.conf

詳細なModSecurity に関連する設定が 24 定義されていた。ちなみにここでの設定値は CRS の初期値である。

## -- Configuration ----------------------------------------------------------
### ModSecurity の Rule エンジンの動作設定
# On  = Rule エンジンの有効化
# Off = Rule エンジンの無効化
# DetectionOnly = Rule エンジンの有効化(Request, Response の intercept なし)
# http://www.modsecurity.org/documentation/modsecurity-apache/2.5.10/modsecurity2-apache-reference.html#N10AD4
SecRuleEngine On

### HTTP リクエスト・ボディ検査設定
# この設定を有効にすることで、Rule にて POST_PAYLOAD、REQUEST_BODY 変数を指定できる
# http://www.modsecurity.org/documentation/modsecurity-apache/2.5.10/modsecurity2-apache-reference.html#N107D5
SecRequestBodyAccess On

### HTTP レスポンス・ボディ検査設定
# この設定を有効にすることで、Rule にて RESPONSE_BODY 変数を指定できる
# ただし有効にしたとしても、バッファリング対象である、SecResponseBodyMimeType で
# 指定した MIME タイプしか、HTTP レスポンス・ボディを検査できない
# http://www.modsecurity.org/documentation/modsecurity-apache/2.5.10/modsecurity2-apache-reference.html#N1094B
SecResponseBodyAccess On

### バッファリングする HTTP レスポンス の MIME タイプの指定
# http://www.modsecurity.org/documentation/modsecurity-apache/2.5.10/modsecurity2-apache-reference.html#N108E4
SecResponseBodyMimeType (null) text/html text/plain text/xml

### バッファリングする HTTP レスポンスの上限バイト値
# この上限値以上の HTTP レスポンスをバッファリングしようとすると、
# SecResponseBodyLimitAction で指定したアクションを実行する模様。
# ハードウェアコーディングにより、上限値は 1GB。
# http://www.modsecurity.org/documentation/modsecurity-apache/2.5.10/modsecurity2-apache-reference.html#N1088D
SecResponseBodyLimit 524288

### バッファリング上限値以上の HTTP レスポンスを受信した時の処理
# Reject、ProcessPartial に関して、ドキュメントに大した記述がない。
# SecResponseBodyLimitAction の description を読む限りでは、以下と推測。
# Reject = 500 Internal Server Error を発生させ、Reject する
# ProcessPartial = SecResponseBodyLimit で指定した値まで検査する
# http://www.modsecurity.org/documentation/modsecurity-apache/2.5.10/modsecurity2-apache-reference.html#N108B9
SecResponseBodyLimitAction ProcessPartial

### HTTP リクエスト処理時における XML プロセッサの有効化
# Content-Type: text/xml の場合のみ、XML プロセッサを有効にする
# 初期設定ではコメントアウトされているため、無効
# ctl
# http://www.modsecurity.org/documentation/modsecurity-apache/2.5.10/modsecurity2-apache-reference.html#N116EB
#SecRule REQUEST_HEADERS:Content-Type "text/xml" \
#"phase:1,pass,nolog,ctl:requestBodyProcessor=XML"

### Rule のデフォルトアクションの設定
# SecRule にて Action が何も定義されていなかった場合に
# 設定されるデフォルトアクションの定義
# http://www.modsecurity.org/documentation/modsecurity-apache/2.5.10/modsecurity2-apache-reference.html#N10610
SecDefaultAction "phase:2,pass"

## -- File uploads configuration -----------------------------------------------
### intercept されたファイルの保存先ディレクトリの定義
# http://www.modsecurity.org/documentation/modsecurity-apache/2.5.10/modsecurity2-apache-reference.html#N10C3C
SecUploadDir /tmp

### intercept したファイル削除の定義
# ModSecurity で HTTP トランザクションの検査が完了した後で、
# intercept したファイルを削除するか否かを定義する
# On  = 削除しない
# Off = 削除する
# RelevantOnly = 関連なしを判断された(Rule に一致しない?)ファイルのみ削除する
# http://www.modsecurity.org/documentation/modsecurity-apache/2.5.10/modsecurity2-apache-reference.html#N10C95
SecUploadKeepFiles Off

### アップロードファイルの検査 Rule
# アップロードされたファイルを外部スクリプトで検査する Rule
# 初期設定ではコメントアウトされているため、無効
# inspectFile
# http://www.modsecurity.org/documentation/modsecurity-apache/2.5.10/modsecurity2-apache-reference.html#N11C5B
# SecRule FILES_TMPNAMES "@inspectFile /opt/apache/bin/inspect_script.pl" \
#       "t:none"

## -- Logging ----------------------------------------------------------------
### ModSecurity audit logging engine の設定
# audit log に記録する HTTP トランザクションを設定する
# On  = すべての HTTP トランザクションを audit log に記録する
# Off = すべての HTTP トランザクションを audit log に記録しない
# RelevantOnly = 警告やエラーとなった HTTP トランザクションや
#                SecAuditLogRelevantStatus で定義した HTTP トランザクションのみ
#                audit log に記録する
# http://www.modsecurity.org/documentation/modsecurity-apache/2.5.10/modsecurity2-apache-reference.html#N10213
SecAuditEngine RelevantOnly

### audit log を記録する HTTP レスポンス・ステータスの定義
# SecAuditEngine RelevantOnly の場合、ここで定義した
# ステータスコードに合致する HTTP トランザクションのみ
# audit log に記録する
# 初期値:404 を除く 4xx、および 5xx 
# http://www.modsecurity.org/documentation/modsecurity-apache/2.5.10/modsecurity2-apache-reference.html#N103B1
SecAuditLogRelevantStatus "^(?:5|4(?!04))"

### audit log の保存形式の定義
# Serial = すべての audit log entry を 1 つのファイルに保存する
# Concurrent = audit log entry をそれぞれ別のファイルに保存する
#              SecAuditLogStorageDir にて、保存先ディレクトリの指定が必要
# http://www.modsecurity.org/documentation/modsecurity-apache/2.5.10/modsecurity2-apache-reference.html#N1040B
SecAuditLogType Serial

### audit log のメインファイルの定義
# SecAuditLogType Serial の場合、すべての audit log の保存先
# SecAuditLogType Concurrent の場合、各ファイルの Index 情報が保存される模様
# http://www.modsecurity.org/documentation/modsecurity-apache/2.5.10/modsecurity2-apache-reference.html#N10260
SecAuditLog logs/modsec_audit.log

### audit log の保存先ディレクトリの定義
# SecAuditLogType Concurrent の各ファイルを保存するディレクトリ
# 初期設定ではコメントアウトされているため、無効
# http://www.modsecurity.org/documentation/modsecurity-apache/2.5.10/modsecurity2-apache-reference.html#N103E2
# SecAuditLogStorageDir logs/modsec_audit

### audit log entry の定義
# audit log に記録する entry を定義する。
# 各 entry はアルファベットに対応している。
# http://www.modsecurity.org/documentation/modsecurity-apache/2.5.10/modsecurity2-apache-reference.html#N1031E
SecAuditLogParts "ABIFHKZ"

### パフォーマンス測定目的のログファイルの定義
# LogFormat、CustomLog はそれぞれ Apache で定義されているディレクティブ
# http://www.modsecurity.org/documentation/modsecurity-apache/1.9.3/html-multipage/06-special_features.html
# Performance measurement を参照
# 初期設定ではコメントアウトされているため、無効
#
# 以下、Apache HTTP サーバ バージョン 2.2 のドキュメント
# LogFormat ディレクティブ
# http://httpd.apache.org/docs/2.2/ja/mod/mod_log_config.html#logformat
# CustomLog ディレクティブ
# http://httpd.apache.org/docs/2.2/ja/mod/mod_log_config.html#customlog
#
# LogFormat "%V %h %t %{UNIQUE_ID}e \"%r\" %>s %X | %I %O | %<{mod_security-time1}n %<{mod_security-time2}n %<{mod_security-time3}n %D" mperformance
# CustomLog logs/modsec_performance.log mperformance

## -- Tuning and debugging ---------------------------------------------------

### Cookie フォーマットの定義
# 0: version 0 cookie(Netscape 形式)
# 1: version 1(RFC2109 で定義されているバージョンと推測)
# http://www.modsecurity.org/documentation/modsecurity-apache/2.5.10/modsecurity2-apache-reference.html#N10530
SecCookieFormat 0

### メモリに保存する HTTP リクエストの上限バイト値
# http://www.modsecurity.org/documentation/modsecurity-apache/2.5.10/modsecurity2-apache-reference.html#N10861
SecRequestBodyInMemoryLimit 131072

### ModSecurity debug log の定義
# http://www.modsecurity.org/documentation/modsecurity-apache/2.5.10/modsecurity2-apache-reference.html#N10589
SecDebugLog             logs/modsec_debug.log

### ModSecurity debug log に記録するログレベルの定義
# http://www.modsecurity.org/documentation/modsecurity-apache/2.5.10/modsecurity2-apache-reference.html#N105B0
SecDebugLogLevel        3

### 一時ファイルの保存先ディレクトリの定義
# http://www.modsecurity.org/documentation/modsecurity-apache/2.5.10/modsecurity2-apache-reference.html#N10C15
SecTmpDir /tmp

【収集用メールアドレス】:q1w2e3w2@gmail.com