ModSecurityのProcessing Phasesを紐解く
ModSecurityの実行プロセスにおいて、phaseという概念がある。
Apacheのプロセスとも連動しているわけだが、ルールをどのphaseに適用させるかを
指定することができる。このphaseについてまとめてみたい。
(リファレンスマニュアルから引用。なお現時点での最新版。)
phaseは以下のように指定する。
SecRule REQUEST_HEADERS:Host “!^$” “deny,phase:1″
ModSecurityではルールを以下の5つのフェーズにセットすることができる。
1.Request headers (REQUEST_HEADERS)
2.Request body (REQUEST_BODY)
3.Response headers (RESPONSE_HEADERS)
4.Response body (RESPONSE_BODY)
5.Logging (LOGGING)
順番に見ていってみよう。
Phase Request Headers
Apacheがリクエストヘッダーを読み取った後、ただちに処理されるフェーズとなる。
このポイントにおいては、リクエストボディはまだ読み込まれていない。
早い段階、つまりApacheがリクエストに対して処理を実行する前にルールを適用したい
場合、このフェーズを指定する。
リクエストボディをバッファリングするかどうか決定したり、リクエストボディがどのように
処理されるかを決める(XMLとして解析するのかそう出ないのか、等)
なお、このフェーズはApacheのスコープディレクティブ(Directory, Location, LocationMatch等)
には適用できない。
ModSecurityのルールをApacheのロケーションにて実行させたい場合、phase2を指定する。
Phase Request Body
汎用的な入力解析フェーズとなる。ほとんどのアプリケーション志向のルールはここに置かれる。
ここではリクエストの引数を受け取ることが保証される。
ModSecurityは以下3つのエンコーディングタイプをサポートしている。
* application/x-www-form-urlencoded フォームデータの転送に使用される
* multipart/form-data ファイル転送に使用される
* text/xml XMLデータを渡す
Phase Response Headers
このフェーズはクライアントにレスポンスヘッダーを返す直前に実行される。
404など一部のレスポンスステータスコードはApacheのプロセスサイクルにより
これより早い段階で処理されるため、予想通りに動かない可能性がある。
(すいません、この辺ちょっと怪しいです)
Phase Response Body
汎用的なアウトプット解析フェーズとなる。このポイントではレスポンスボディに
対してルールを適用することができる。エラーメッセージや失敗した認証の情報など、
HTMLアウトバウンドに関して検査したい場合に利用するフェーズとなる。
Phase Logging
ログが記録される直前に実行されるフェーズで、ロギングの処理に関してのみ影響がある。
このフェーズにおいてコネクションのブロックや拒否はできない。
・・・他にもいろいろ書いてあるのだが、これ以上怪しい訳を並べても仕方がないの
でやめておく。分かったことがあれば都度追記、ということで。