ModSecurityのAuditLog覚え書き
AuditLogはModSecurityでコア要素となる重要なログなので、この項目だけで
専用に記事をまとめておく。以下はAuditLogに関する基本設定例。
SecAuditEngine RelevantOnly
SecAuditLogRelevantStatus ^(?:5|4\d[^4])
SecAuditLog logs/audit.log
SecAuditLogType Serial
SecAuditLogParts ABCFHKZ
SecAuditEngineはOn/Off/RelevantOnlyから選択。
インストールの記事では動作確認のためにOnにしておいたが、稼働時は必要なものだけ
ロギングさせるためRelevantOnlyにしておく。
これにより、SecAuditLogRelevantStatusにマッチしたステータスコードの
トランザクションだけがロギングされるようになる。
SecAuditLogはログの出力先。上記の例だとApacheのlogsディレクトリに
(Apacheのログと一緒に)格納されることになる。この辺りはおまかせで。
SecAuditLogTypeはSerialまたはConcurrentかを指定。
Serialはひとつのファイルにすべてのトランザクションが記録されていく。
Concurrentはひとつのトランザクションが1ファイルに格納されていく。
ここでConcurrentを指定した場合、格納先となるSecAuditLogStorageDirも別途設定する。
SecAuditLogPartsはどのパートをロギングするかを以下から選択して指定する。
AとZは必須。Reservedとなっているパートは将来利用される。
A AuditLogヘッダー
B リクエストヘッダー
C リクエストボディ
D Reserved
E レスポンスボディ
F レスポンスヘッダー
G Reserved
H 追加情報。パターンにマッチしたアクセスだとここにタグが付与される。
I ファイルを除外した、コンパクトなリクエストボディ
J Reserved
K トランザクションにマッチした全てのルール
Z 最後の境界線
AuditLogにセンシティブなデータを記録しない
ModSecurityではリクエストボディの中身をフルにロギングすることが可能だが、
パスワードやIDなどの機密データは除外しておくべきだろう。適宜ルールを設定しておけば、
平文がアスタリスクに変換された状態でロギングされるとのことだ。
この場合、phaseは常に5にしておく。
(と、オフィシャルハンドブックには書いてあるが、Webリファレンスマニュアル
を見ると必ずしもそうでない。。)
ベーシック認証を利用している場合、以下の設定が有効。
SecAction phase:5,nolog,pass, ¥
sanitizeRequestHeader:Authorization
Password,oldPassword,newPasswordに対するロギングを抑止する。
SecAction phase:5,nolog,pass, ¥
sanitiseArg:Password, ¥
sanitiseArg:oldPassword, ¥
sanitiseArg:newPassword
以下はpasswordを含む文学列の引数をすべてサニタイズの対象にする。
SecRule ARGS_NAMES password phase:5,nolog,pass,sanitiseMatched
サニタイズのアクションはdebug_logには適用されないことに注意。
debug_logのレベルを高くしている場合、パスワードデータが記録されてしまう。
また、ログのローテーションは別途対応が必要。
参考
http://www.modsecurity.org/documentation/
※現時点ではReference Documentation: v2.5.12