読者です 読者をやめる 読者になる 読者になる

M.C.P.C. (Mamesibori Creation Plus Communication)

印刷屋から五反田のWeb屋に転職したCLのブログです。

fail2banでmt-comments.cgiのコメントスパムをIP的にBANする

Linux Server Engineering fail2ban

最近Movable Typeコメントスパム投稿のbotが喧しいですね。Movable TypeCGIで動かしている限り、POSTされていると反映しなくても負荷が高くなりますよね。というわけで、botをやっつけましょう!

CentOS 6.4とEPELのfail2ban v0.8.8です。もう既にfail2banによるアクセス制限が稼働しているとします。なお、fail2banはiptablesというLinux内蔵のファイアウォールを使いますので、fail2banを稼働させるまでにはちょっとハードルが高いかもしれません。

Apacheの設定

実ホストでApacheを動かしているなら、アクセスログは/var/log/httpd/access_log に入りますけれども、バーチャルホストでMovable Typeを提供していて、さらにログの書き出し場所も指定している場合は、ログの書き出しが分散されてしまいます。これでは、fail2banでログを監視するには具合が悪いので、旧来の /var/log/httpd/access_log にも書き込みます。

CustomLog行を2行書くと、1アクセスでそれぞれのCustomLog行で指定したログファイルに書き込みます。

※ストレージが遅いと、Apacheのパフォーマンスが落ちますので注意です。

# blog.dtpwiki.jp
<VirtualHost *:80>
    ServerAdmin webmaster@dtpwiki.jp
    DocumentRoot /home/www/blog.dtpwiki.jp/html
    ServerName blog.dtpwiki.jp
    CustomLog logs/access_log combined
    CustomLog "|/usr/sbin/cronolog /var/log/virtualhosts/blog.dtpwiki.jp/%Y/%m/access_log.%Y%m%d" combined
</VirtualHost>

fail2banの設定変更

/etc/fail2ban/jail.conf に以下を追加

[apache-mtcommentsbot]

enabled  = true
filter   = apache-mtcommentsbot
action   = iptables-multiport[name=mtcommentsbot, port="http,https"]
           sendmail-buffered[name=BadBots, lines=10, dest=you@example.com]
logpath  = /var/log/httpd/access_log
findtime = 420
bantime  = 172800
maxretry = 6

同じIPから7分間(420秒)で6回POSTされたら、そのIPからのアクセスを2日間(172800秒)禁じます。

/etc/fail2ban/filter.d/apache-mtcommentsbot.conf を新規作成

failregex = ^<HOST> -.*"POST /.*mt-comments.cgi.*$
ignoreregex =

fail2banを再起動

/sbin/service fail2ban restart

ログがちゃんと監査できるか確認

fail2ban-regexコマンドを使います。

コマンド:

fail2ban-regex /var/log/httpd/access_log /etc/fail2ban/filter.d/apache-mtcommentsbot.conf

出力:

Running tests
=============

Use regex file : /etc/fail2ban/filter.d/apache-mtcommentsbot.conf
Use log file   : /var/log/httpd/access_log


Results
=======

Failregex: 119 total
|- #) [# of hits] regular expression
|  1) [119] ^<HOST> -.*"POST /.*mt-comments.cgi.*$
`-

Ignoreregex: 0 total

Summary
=======

Addresses found:
[1]
    110.86.184.27 (Wed Apr 17 00:47:45 2013)
    110.86.184.27 (Wed Apr 17 00:47:46 2013)
    110.86.184.27 (Wed Apr 17 00:48:09 2013)
    110.86.184.27 (Wed Apr 17 00:48:31 2013)
    110.86.184.27 (Wed Apr 17 00:48:43 2013)
    110.86.184.27 (Wed Apr 17 00:49:10 2013)
    110.86.184.27 (Wed Apr 17 00:49:17 2013)
    110.86.184.27 (Wed Apr 17 00:49:18 2013)
    110.86.184.27 (Wed Apr 17 00:49:34 2013)
    110.86.184.27 (Wed Apr 17 00:49:53 2013)
...
   27.153.250.49 (Wed Apr 17 09:46:39 2013)
    27.153.250.49 (Wed Apr 17 09:47:18 2013)
    27.153.250.49 (Wed Apr 17 09:47:25 2013)
    27.153.250.49 (Wed Apr 17 09:47:58 2013)
    27.153.250.49 (Wed Apr 17 09:48:03 2013)
    27.153.250.49 (Wed Apr 17 09:48:11 2013)
    125.76.229.177 (Wed Apr 17 09:58:25 2013)
    125.76.229.177 (Wed Apr 17 10:02:02 2013)

Date template hits:
26022 hit(s): Day/MONTH/Year:Hour:Minute:Second

Success, the total number of match is 119

However, look at the above section 'Running tests' which could contain important
information.

iptablesでBANできているか確認

コマンド:

/sbin/iptables-save

実行結果:

# Generated by iptables-save v1.4.7 on Wed Apr 17 10:23:44 2013
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [30593:51765437]
:RH-Firewall-1-INPUT - [0:0]
:fail2ban-mtcommentsbot - [0:0]
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-mtcommentsbot 
...
-A fail2ban-mtcommentsbot -s 27.153.250.49/32 -j DROP 
-A fail2ban-mtcommentsbot -s 121.204.243.19/32 -j DROP 
-A fail2ban-mtcommentsbot -s 122.228.160.175/32 -j DROP 
-A fail2ban-mtcommentsbot -s 1.80.251.198/32 -j DROP 
-A fail2ban-mtcommentsbot -s 110.86.184.27/32 -j DROP 
-A fail2ban-mtcommentsbot -j RETURN 
COMMIT
# Completed on Wed Apr 17 10:23:45 2013
広告を非表示にする