※例によって、他人にはどうでもいいかもしれない備忘録
大量のコメントスパムがどうしようもなくひどかったので、昨年末にMovabletype4で標準の"Spamlookup - Keyword Filter" に↓のような登録をした。
/(cool|nice|good|great|useful) (site|work). Thank.+/i
/adderall|ambien|amoxicillin|cialis|ephedra|ephedrine|famvir|fioricet|hoodia|hydrocodone|meridia|oxycodone|paxil|percocet|pharmacy|phemntermine|phentermine|ritalin|soma|tramadol|tylenol|ultram|valium|vicodin|xanax|zoloft/i 4
その後、ほとんどコメントスパムは来なくなって安心してたら、最近になってだいぶ酷くなってきた(過負荷でサーバの温度グラフとかが取れなくなる程)。コメントの中身を見ると、↑にマッチするキーワードが含まれてるのが普通にあった。どうもこのフィルタは機能してないらしい。
新しいスパム対策を導入することにした。
自宅サーバでやってるので、IPアドレスをベースにルータ等で弾くのが最も負荷が掛からないが、可能な限りそういったフィルタはしたくないポリシーなので、apache側で対応させることにした。今回もゴッゴル先生にお世話になりました。
■mod_security の導入
Debianはetchになってからlibapache2-mod-secrityが公式パッケージからはずされたらしいので http://debian-unofficial.org/ を利用する。
# /etc/apt/source.list
...
deb http://ftp.debian-unofficial.org/debian etch main contrib non-free restricted
deb-src http://ftp.debian-unofficial.org/debian etch main contrib non-free restricted
PGP鍵の追加は適宜やっておく。
これでインストール可、と思いきや
#apt-cashe show libapache2-mod-security
Package: libapache2-mod-security
Depends: mod-security-common (= 1.9.4-1duo+etch2), apache2-common libc6 (>= 2.3.6-6)
ウチはapache2.2で動いてるのでapache2-commonではなく、apache2.2-common である。とりあえずapt-get install とかやったけど、依存関係でやっぱりエラーに。。。
ソースからパッケージを作ることにする。
$ mkdir /usr/local/.../UnOffical
$ cd /usr/local/.../UnOffical
$ apt-get source libapache2-mod-security
$ cd libapache-mod-security-1.9.4/
で、依存関係にapahce2.2-commonを追加
$ vi debian/control
....
Package: libapache2-mod-security
....
Depends: mod-security-common (= ${Source-Version}), apache2-common|apache2.2-common, ${shlibs:Depends}
controlファイルにはlibapache-mod-securityの記述もあり、最初はそっちのDependsを変更して「直らね~~」とハマってたorz
ビルドするパッケージに変更を加えたら、それをログに残すのが流儀らしい。 debchange が使えなかったので devscripts をインストール。
$ debchange -i
viでコメントを適当に保存
あとは出来上がったパッケージのインストール
# dpkg -i libapache2-mod-security_1.9.4-1duo+etch2_i386.deb mod-security-common_1.9.4-1duo+etch2_all.deb
無事完了。で、このままでは何も行われないので設定を行う。
対スパム用のセットがこちらにあったのでお世話になる。
「All of the rules for Apache 2.x machines」にあるファイルをとってきて、各設定ファイルを/etc/apache2/conf.d/mod-security/以下に展開。さらに設定ファイルの作成
# /etc/apache2/mods-available/mod-security.conf
# Only inspect dynamic requests
# (YOU MUST TEST TO MAKE SURE IT WORKS AS EXPECTED)
#SecFilterEngine DynamicOnly
SecFilterEngine On
# Reject requests with status 500
SecFilterDefaultAction "deny,log,status:500"
# Some sane defaults
SecFilterScanPOST On
SecFilterCheckURLEncoding On
SecFilterCheckCookieFormat On
SecFilterCheckUnicodeEncoding Off
SecFilterNormalizeCookies On
# enable version 1 (RFC 2965) cookies
SecFilterCookieFormat 1
SecServerResponseToken Off
#If you want to scan the output, uncomment these
#SecFilterScanOutput On
#SecFilterOutputMimeTypes "(null) text/html text/plain"
# Accept almost all byte values
SecFilterForceByteRange 1 255
# Server masking is optional
#fake server banner - NOYB used - no one needs to know what we are using
SecServerSignature "NOYB"
#SecUploadDir /tmp
#SecUploadKeepFiles Off
# Only record the interesting stuff
SecAuditEngine RelevantOnly
#SecAuditLog logs/audit_log
SecAuditLog /var/log/apache2/audit.log
# You normally won't need debug logging
SecFilterDebugLevel 0
#SecFilterDebugLog logs/modsec_debug_log
SecFilterDebugLog /var/log/apache2/modsec_debug.log
#And now, the rules
#Remove any of these Include lines you do not use or have rules for.
#First, add in your exclusion rules:
#These MUST come first!
Include /etc/apache2/conf.d/mod-security/exclude.conf
#Application protection rules
Include /etc/apache2/conf.d/mod-security/rules.conf
#Comment spam rules
Include /etc/apache2/conf.d/mod-security/blacklist.conf
#Bad hosts, bad proxies and other bad players
Include /etc/apache2/conf.d/mod-security/blacklist2.conf
#Bad clients, known bogus useragents and other signs of malware
Include /etc/apache2/conf.d/mod-security/useragents.conf
#Known bad software, rootkits and other malware
Include /etc/apache2/conf.d/mod-security/rootkits.conf
#Signatures to prevent proxying through your server
#only rule these rules if your server is NOT a proxy
Include /etc/apache2/conf.d/mod-security/proxy.conf
#Additional rules for Apache 2.x ONLY! Do not add this line if you use Apache 1.x
Include /etc/apache2/conf.d/mod-security/apache2-rules.conf
#(>= 1.9)
Include /etc/apache2/conf.d/mod-security/jitp.conf
#(>= 1.9)
Include /etc/apache2/conf.d/mod-security/recons.conf
#(>= 2.0dev) replace with a pure RBL based system
#Include /etc/apache2/conf.d/mod-security/badips.conf
これで a2enmod mod-security 、 apache2 restart して完了
が、しばらくすると負荷が一気に上昇↑ ォィォィ
blacklist.confの処理が重いらしいので、該当する設定をコメントアウトしてapache reload
さらに他所を参考に、MT専用で /etc/apache2/sites-enabled/ 以下のファイルに追記。POST で送られてくるやつが ASCII 文字 Onlyの場合に落とす。
SecFilterEngine On
SecFilterScanPOST On
SecFilterDefaultAction "deny,log,status:406"
SecFilterSelective POST_PAYLOAD "^[\x00-\x7F]+$"
SecFilterEngine On
SecFilterScanPOST On
SecFilterDefaultAction "deny,log,status:406"
SecFilterSelective REQUEST_METHOD "^POST$" chain
SecFilterSelective ARG_author "^[\x00-\x7F]+$" chain
SecFilterSelective ARG_email "^[\x00-\x7F]+$" chain
SecFilterSelective ARG_url "^[\x00-\x7F]+$" chain
SecFilterSelective ARG_text "^[\x00-\x7F]+$"
これだと日本語サイトのも落とされるので、/etc/apache2/conf.d/.mod-security/rules.conf を変更
SecFilterSelective HTTP_Content-Type "!(^application/x-www-form-urlencoded.*$|^multipart/form-data;)"
以上で完了。
が、結局負荷の問題で使えない。。。。
なのでさらに、教えてゴッゴル先生
どうやらログを取っているとCPU負荷が大きくなるらしい。なので、/etc/apache2/mods-available/mod-security.confから↓の2行をコメントアウト
SecFilterDebugLevel 0
SecFilterDebugLog /var/log/apache2/modsec_debug.log
様子を見たところ問題なし。
さらに、一度はずしたblacklist.confを戻したけど問題なし。。。というわけでも無いらしい。
スパムはどれをとっても対応が面倒だorz
<2/4 追記>
どうも、サーバーがとろけてしまう一番の原因は、mod_securityが有効な状態でブログに自分の記事をポストするときらしい...。
ミイラ取りがミイラorz