以前にも書いたけど、mod-security1と2では文法自体がかなり異なる。 詳細なドキュメントはあるのだが 正直膨大すぎて読むのが大変だ。
SPAM抑止には標準のルールセットに頼るという手もあるようだが、会員登録が必要らしく、最新のものは素ではダウンロードできなくなっている(ように見える)。
この文章は、よりピンポイントに「今荒らされている掲示板を救いたい!」という人のためのメモである。
例えば ともりん先生の掲示板。 一時期はバイアグラ.comだの何だので 荒れ放題 であった。 むろん掲示板をバージョンアップしたりすれば良いのだが、 他人の書いたCGIのコードを読んで穴塞ぎするのも面倒臭すぎる。 派手なSPAMは大抵海外からのものなので、良くある手法として「1バイト文字のみのタイトルを弾く」というルールが考えられる。
YY-BOARDのHTMLを見るとタイトル名の欄は変数名subで受け取る仕様。
<input type=text name=sub size=36 value="" class=f>
なので、ルールの記述は以下のようになる。正規表現で^と$は最初から最後までという意味、\\000-\\177は8進数で7bitキャラ範囲全てという意味になる(16進数なら0x00〜0x7Fということ)。
SecRule ARGS:sub "^[\\000-\\177]+$"
しかし・・・ これではうまくいかなかった。 security2のデフォルトはURLデコード前の符号化文字列を比較するようになっていた。世の中大半のmod-security1向けのページは、デコード後の比較を書いているので動かない。
mod-security2では t:urlDecode を追加しなければならないようだ。
SecDefaultAction deny,log,status:406,phase:2,t:urlDecode
余談だがリファレンスマニュアルのTransformation functionsの項は余さず読んでおいたほうがいいかも。compressWhitespaceがデフォルトで、タブやコントロールコードも全てスペースに置換されてるとか知らなかった・・・
Debian etchの場合は ここらへんからパッケージを落としておくこと。 標準のリポジトリからはインストールできなかった。
mod-security2.loadは作成されるが設定ファイルは一切作成されないので、/etc/mods-enable/mod-security2.confをvi等で作成。
<IfModule mod_security2.c> <Directory "/home/*/public_html"> SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess Off SecUploadKeepFiles Off SecDebugLog /var/log/apache2/modsec_debug.log SecDebugLogLevel 0 SecAuditEngine RelevantOnly SecAuditLogRelevantStatus ^5 SecAuditLogParts ABIFHZ SecAuditLogType Serial SecAuditLog /var/log/apache2/modsec_audit.log SecRequestBodyLimit 4096000 SecRequestBodyInMemoryLimit 4096000 SecResponseBodyLimit 4096000 SecDefaultAction deny,log,status:406,phase:2,t:urlDecode SecRule ARGS:blog_name "^[\\000-\\177]+$" SecRule ARGS:sub "^[\\000-\\177]+$" SecRule ARGS:CommentName "^[\\000-\\177]+$" SecRule ARGS:CommentMsg "^[\\000-\\177]+$" </Directory> </IfModule>
ぱぱサーバは上記のようになっています。「えっ?これだけかよ?」と思うでしょうが・・・いや突破しようと思えば簡単に突破できるんでしょうけど、そもそも日本語読めない連中を相手にするのが嫌なだけなので、これでいいのです。