ModSecurityのオペレータを読み解く

6月 30, 2010

ModSecurityのオペレータ(演算子)の話。
ModSecurityの英文ハンドブックを読み始めて「@rxだの@pmって一体何・・・」
と、いきなり未知との遭遇に先行きが危ぶまれたが、うっすら掴めてきたような気
がするので、例によって頭を整理するために書いておく。
前回からの繰り返しになるが、ModSecurityのルール基本構文は以下の通り。

SecRule VARIABLES OPERATOR [ACTION]


上記の[OPERATOR]にてフィルタリングルールを指定するわけだが、そこに
当てはめる値にどんなものがあるか見て行く。正規表現の他にも便利なオペレータ
が用意されているようだ。ModSecurityのルールで利用するオペレータには、
以下のようなものがある。なお、例はリファレンスマニュアルから引用した。

String Matching Operators(文字列比較演算子)

@rx
正規表現によるパターンマッチングを行う。デフォルトのオペレータとなる。

SecRule REQUEST_HEADERS:User-Agent “@rx nikto”

@pm
パラレルパターンマッチングを行う。複数の文字列を平行して指定する。

SecRule REQUEST_HEADERS:User-Agent “@pm WebZIP WebCopier WebStripper SiteSnagger ” “deny,status:403


@pmFromFile
対象文学列をリスト化したファイルを対象にパターンマッチングを行う。

SecAction “phase:1,pass,nolog,setvar:tx.remote_addr=/%{REMOTE_ADDR}/”
SecRule TX:REMOTE_ADDR “@pmFromFile ip-blacklist.txt” “deny,status:403


@beginsWith
対象文学列の始まりにおいてパターンマッチングを行う。

SecRule REQUEST_LINE “!@beginsWith GET” t:none,deny,status:403


@contains
対象文学列の全体からパターンマッチングを行う。

SecRule REQUEST_LINE “!@contains .php” t:none,deny,status:403


@endWith
対象文学列の終わりにおいてパターンマッチングを行う。

SecRule REQUEST_LINE “!@endsWith HTTP/1.1″ t:none,deny,status:403


@streq
対象文学列が完全一致しているかどうかをチェックする。(string-equal)

SecRule ARGS:foo “!@streq bar” t:none,deny,status:403


@within
指定した範囲内でパターンマッチングを行う。
・・・が、正直、リファレンスマニュアルを見てもオフィシャルハンドブック
を見てもよく分からない。以下の例はリクエストメソッドがget,post,headに
マッチしなかったら拒否する、という風に解釈していいのだろうか・・・?

SecRule REQUEST_METHOD “!@within get,post,head” t:lowercase,deny,status:403



Numerical Operators(数値比較演算子)
以下は説明するまでもない気が。
各種プログラミング言語の数値比較とまったく同じ。

@eq Equal
@ge Greater or equal
@gt Greater than
@le Less than
@lt Less than


Validation Operators
直訳すると検証演算子?・・・

@validateByteRange
利用頻度が高そうなオペレータ。指定バイト数に一致するかを検証する。
以前のバージョンにおける”SecFilterForceByteRange”がバージョンアップ
したような感じで、より細かい設定が可能らしい。

SecRule ARGS:text “@validateByteRange 10, 12, 32-128″

@validdateDTD
DTDにおけるXMLペイロードを検証する。
XMLとして処理されるリクエストボディにおいて有効。

@validateSchema
スキーマにおけるXMLペイロードを検証する。
XMLとして処理されるリクエストボディにおいて有効。

@validateUrlEncoding
URLエンコーディングの有効性を検証する。

@validateUtf8Encoding
UTF-8エンコーディングの有効性を検証する。



Miscellaneous Operators
その他の「多種便利な演算子」ってところかな。

@geoLookup
IPアドレスの物理的な位置を確定する。SecGeoLookupDbとともにセットする
必要がある。詳しくはリファレンスマニュアルを。

@inspectFile
指定したスクリプトファイルを実行して検査する。

SecRule FILES_TMPNAMES “@inspectFile bin/inspect_script.pl”

@rbl
RBL(real-time block list)と比較してチェックする。
パラメータはIPv4のIPアドレスかホストネームであること。

SecRule REMOTE_ADDR “@rbl spam.com”

@verifyCC
有効なクレジットカードの番号として妥当であるかチェックする。

SecRule ARGS “@verifyCC \d{13,16}” \
“phase:2,sanitiseMatched,log,auditlog,pass,msg:’Potential credit card number’”


自分なりにまとめてみたものの、英語力&技術力不足による誤訳/認識違いが、
きっとある。絶対ある。気付いた時点で修正するつもりだが、その辺りは了承願いたい。

Categories: ModSecurity

No Responses so far | Have Your Say!

Comments are closed.