いろいろ対策した結果スパムはかなり減ってきたのですが、やはりコメントスパムが一日数通はMovableTypeやWordPressまで届いてしまいます。ここまできたら満足いくまでやってやろうと、IPアドレスからアクセスしてきた国を判別して拒否することにしたのでメモ。
スパム対策はユーザには対策を意識させない&なるべくapacheで判別し負荷を減らすという方針でやってきましたが、この対策は比較的ドラスティックなやりかたです。geoipというIPアドレスから国を調べることのできるライブラリを使ったapacheモジュールmod_geoip2を使いスパムの多い国からのコメント投稿・トラックバックを拒否するようにします。
参考サイト:
このgeoipというのはMaxMind社がオープンソースで提供している有名なライブラリで、IPアドレスを渡すと国情報を返してくれます。ローカルにデータベースを持っていてネットワークアクセスなしで高速に調べてくれるのが特徴です。
私のところの場合コメント自体少ないですが海外からとなるとさらにこないと思うので、ざっとコメントスパムのアドレスから国のリストを作りスパムの多い順からアクセスを禁止にするようにします。
- geoioライブラリのインストール。
RedHat系(Fedora/CentOSなど)の場合rpmforgeリポジトリから
yum -y install geoip geoip-devel
debian/Ubuntuの場合
aptitude install libapache2-mod-geoip geoip-bin
- mod_geoio2をインストール(RedHat系)
MaxMind - GeoIP Apache APIからapache2用の1.1.8をダウンロード
アーカイブを展開後以下のようにしてコンパイル・インストール。
sudo /usr/sbin/apxs -i -c -lGeoIP mod_geoip.c
- 設定ファイルの編集
/etc/httpd/conf.d/geoip.conf (RedHat系)LoadModule geoip_module modules/mod_geoip.so
<IfModule geoip_module>
GeoIPEnable On
GeoIPDBFile /usr/share/GeoIP/GeoIP.dat
</IfModule>
- httpdのリスタート
- apacheログからmt-commentへのアクセス順位を調べて拒否のリストを作成(USがダントツトップで30%強。次はKR,JP,CN)。調べた合計1600のスパム中、上位3国で約半数、下のリストの15国で80%位です。
MTのcgiディレクトリの.htaccess(テンプレートで生成)
SetEnvIf GEOIP_COUNTRY_CODE KR BlockCountry
#SetEnvIf GEOIP_COUNTRY_CODE JP BlockCountry
SetEnvIf GEOIP_COUNTRY_CODE CN BlockCountry
SetEnvIf GEOIP_COUNTRY_CODE BR BlockCountry
SetEnvIf GEOIP_COUNTRY_CODE CA BlockCountry
SetEnvIf GEOIP_COUNTRY_CODE DE BlockCountry
SetEnvIf GEOIP_COUNTRY_CODE IN BlockCountry
SetEnvIf GEOIP_COUNTRY_CODE RO BlockCountry
SetEnvIf GEOIP_COUNTRY_CODE FR BlockCountry
SetEnvIf GEOIP_COUNTRY_CODE TW BlockCountry
SetEnvIf GEOIP_COUNTRY_CODE GB BlockCountry
SetEnvIf GEOIP_COUNTRY_CODE RU BlockCountry
SetEnvIf GEOIP_COUNTRY_CODE PL BlockCountry
SetEnvIf GEOIP_COUNTRY_CODE ES BlockCountry
SetEnvIf GEOIP_COUNTRY_CODE AR BlockCountry
...
<Files "mt-tb.*cgi">
Order Allow,Deny
...
deny from BlockCountry
...
<Files "mt-comment.*cgi">
Order Allow,Deny
...
deny from BlockCountry
deny from BlockCountry2
コメントの場合JP以外は全部拒否でも良いかも知れませんね。私のところでは基本的にOrder Allow, Denyしているので、同じようにしている方は以下のような条件で日本以外を拒否できると思います。ついでにローカルIPと不明な国も許可しておきます。
SetEnvIf GEOIP_COUNTRY_CODE JP !BlockCountry
SetEnvIf GEOIP_COUNTRY_CODE N/A !BlockCountry
SetEnvIf GEOIP_COUNTRY_CODE -- !BlockCountry
以上でスパムの多い国からのトラックバック・コメントが禁止できます。(とおもったら何故か出来ていない様子...)
USからのトラックバックは許可してありますが、ブログサービスからのアクセスがあるためです。
# 24時間様子を見た結果、トラックバックスパム/コメントスパム両方0。二日で1通。SEからのものでした。
#現在スパムが見つかったら国をぼちぼち追加して言っているところです。
#geoipはライブラリ形式でdnslookupがないのがトラフィック的に安心ですね。