ModSecurityのオペレータを読み解く
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’”
自分なりにまとめてみたものの、英語力&技術力不足による誤訳/認識違いが、
きっとある。絶対ある。気付いた時点で修正するつもりだが、その辺りは了承願いたい。