Spamコメント対策 (力技)


Creative Commons License photo credit: threefingeredlord

ちょっと前からRRDToolでSpamのカウントを取ってるんだけど、通常頂くコメントと比較してもありえないくらいSpamコメントとSpam Trackbackで溢れていた。

Akismetは本当に強力で、たまーにすり抜けるくらいで99%以上の確率でSpamは排除してくれる。
ただ、Yuriko.Net » 唸るほどスパムが来るので対策の、

Akismet に頼ってもいいのですが、コメント ID がインフレするのは少し癪です。そこで、明らかに不正だと思うコメントを排除すべく対策を打ちました。

を読んで、このサイトのコメントIDを見てみると3000超。超インフレ。ハァ。。。
ということで、自宅サーバならではの対策をすることに。

やったことは 「iptables で拒否する」。うーん、力技。
最初は上位のルータで拒否しようとしたんだけど、ルータがへぼすぎてフィルタ書くくらいで毎回再起動しやがるので、サーバ側で対応することに。

やり方としては、確実に必要なコメントが付いてない期間のApacheのログを集めておいて、 wp-comments-post.php か wp-trackback.php にアクセスしているIPアドレスを収集して、iptablesで拒否するだけ。
このサイトのようにS/N比がアレゲなサイトのログならやりやすい! 涙!
具体的には、

$ cat access.log | grep -e ‘POST /wp-comments-post.php’ -e ‘trackback’ | awk ‘{print $1}’ | sort | uniq -c | sort -r

※パーマリンクの形式で若干違うかも

こんな感じで実行すると、

1416 89.149.205.199
178 58.65.238.26
37 206.51.238.46
22 200.65.127.161
18 206.53.55.5
16 222.122.249.5
13 66.232.118.177
13 148.233.159.58
12 195.229.242.146
7 85.255.120.58

こんな結果が返ってくるので、大目のIPアドレスを拒否してあげるだけでSpamが減らせます。
しかし1400回超はやりすぎだろう。節度を持ったSpam希望。。

あとは、気に入らないIPアドレスを拒否するだけ。

iptables -P INPUT ACCEPT
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -F
iptables -A INPUT -p tcp -s 89.149.205.199 –destination-port 80 -j LOG
iptables -A INPUT -p tcp -s 89.149.205.199 –destination-port 80 -j DROP
iptables -A INPUT -p tcp -s 85.255.120.58 –destination-port 80 -j LOG
iptables -A INPUT -p tcp -s 85.255.120.58 –destination-port 80 -j DROP
iptables -A INPUT -p tcp -s 58.65.238.26 –destination-port 80 -j LOG
iptables -A INPUT -p tcp -s 58.65.238.26 –destination-port 80 -j DROP

本当はHTTP以外も全部拒否しても良いかも。

Ubuntuの場合は、/var/log/kern.log に

kernel: [5484170.866200] IN=eth0 OUT= MAC=00:0d:60:f5:2d:87:00:16:01:2f:50:79:08:00 SRC=89.149.205.199 DST=hoge LEN=48 TOS=0x00 PREC=0x00 TTL=118 ID=21632 DF PROTO=TCP SPT=2205 DPT=80 WINDOW=65535 RES=0x00 SYN URGP=0
kernel: [5484176.878496] IN=eth0 OUT= MAC=00:0d:60:f5:2d:87:00:16:01:2f:50:79:08:00 SRC=89.149.205.199 DST=hoge LEN=48 TOS=0x00 PREC=0x00 TTL=118 ID=25189 DF PROTO=TCP SPT=2205 DPT=80 WINDOW=65535 RES=0x00 SYN URGP=0
kernel: [5484226.567339] IN=eth0 OUT= MAC=00:0d:60:f5:2d:87:00:16:01:2f:50:79:08:00 SRC=206.51.238.46 DST=hoge LEN=48 TOS=0x00 PREC=0x00 TTL=49 ID=22825 DF PROTO=TCP SPT=61232 DPT=80 WINDOW=65535 RES=0x00 SYN URGP=0
kernel: [5484229.566491] IN=eth0 OUT= MAC=00:0d:60:f5:2d:87:00:16:01:2f:50:79:08:00 SRC=206.51.238.46 DST=hoge LEN=48 TOS=0x00 PREC=0x00 TTL=49 ID=25699 DF PROTO=TCP SPT=61232 DPT=80 WINDOW=65535 RES=0x00 SYN URGP=0

みたいなログが出るので、拒否したことが確認できる。
iptablesの設定はもっとスマートな方法があるけど、暫定措置ならこれで十分でしょ。

対策を取ったのが16日なので、それ以前に比べるとかなり減った。
意外とリピーターが多いようです。嬉しくないです。

まあ、botnetみたいに、アクセス元のIPアドレスがバラバラだと全く意味の無い対策ですな。

上記のようなRRDToolでのグラフの書き方も別の機会でメモする予定。
だけど、Google Chart APIが秀逸なので、これから実装するならこっちで作ったほうが楽だとは思うけど。

ちなみに、Akismetで捕獲したSpamの総数は、
SELECT option_value FROM wp_options WHERE option_name = 'akismet_spam_count';
で取得可能っす。

コメント

タイトルとURLをコピーしました