当ブログは最近アクセス数も増えていて、それに比例してスパムも多くなってきた。
定期的にアクセスログをGrepしたり
アクセスログをSQLiteで管理しているのでSQLで怪しげなアクセスを調べてはいる。
その中で明らかな攻撃目的の頻繁なアクセスは、そのIPを含むその国に払い出されたIPブロックごとIPTABLESでDROPしている。
※もちろん日本やアメリカなどまとめてDROPしてはサイト運営に支障が出そうな国は除外。日本人相手のブログだからできる行為だね。
でも、スパムコメントってのは中々アドレスからはわからないんだな。
通常のコメントの場合もあるし
当ブログではakismetというWordPressのプラグインを使っていて、これは驚くべき精度でスパムコメントをスパムフォルダにぶち込んでくれる。
だから、スパムコメントは放っておいても実害はあまりない。
が、アクセスログにゴミがはいってしまう。
それにスパム業者にはこのブログの敷居をまたいでほしくない。
WordPressのDBからスパムコメントのIPを取得
ありがたいことにakismetがスパムコメントをスパム箱に入れてくれるんだけれども、
WordPressのダッシュボードからはコメントのIP抽出はできそうにない。
というわけで、WordPressのデータベースを見てみることにした。
スパムコメントのIPを集めるには下のSQLを実行してみてくれ。
select comment_author_IP , count(*) from wp_comments where comment_approved = 'spam' group by comment_author_IP order by 2;
ちなみに、テーブルの接頭語は上のSQLではwpと書いてあるが、各々のユーザーが自由に変えていると思うので、自分の環境に合わせて買える必要がある。もちろん僕も変えている。
わからなければ show tables と打てばテーブル一覧がでる。
調べてみたらほぼ一つのIPで100アクセスくらいしていることが判明。
そのIPはつい昨日、その国に払い出されているIPブロックごとDROPしたけれど
他の50とか30とかアクセスしてきているスパムもブロックしよう。
ただ、スパムIPを見ていると結構同じIPが何度もきているようなので、IPブロックごとDROPせずにひとつずつ追加していく方式にしよう。
INPUTのチェインに追加していくとIPTABLESの設定が見えづらくなるので、ユーザー定義チェインを作ることにした。
#チェインを作成 iptables -N SPAMWALL #適切な場所にチェインにジャンプするように設定 iptables -I INPUT 10 -j SPAMWALL #チェイン内にDROPするIPを追加 iptables -A SPAMWALL -s 203.0.113.1 -j DROP
あとはsaveしてrestartをする。
ユーザー定義チェインの処理の流れ
図を書いてみた
このようにユーザー定義のチェインにジャンプしたら、そのチェインに設定されているルールが評価される。
そのチェインで最後まで引っかからなかったら、元のチェインに戻る。
チェインにジャンプする場所を適切にしなければザルになる。
たとえば上の図のルール1が『ポート80でアクセスしてきた場合はすべて許可』となっていれば、
WEBページへのアクセスはすべて許可され、ユーザー定義のチェインまで評価されなくなる。
せっかくSPAMアクセスを阻止しようとしているのに本末転倒。
だから許可系のルールの上の方に挿入しなくちゃならない。