fail2ban で Wordpress のログイン攻撃を防ぐ

## fail2ban とは
fail2ban はログ監視ツールです。さまざまなログを監視しながら特定の正規表現パターンが出現する様子を監視します。設定した単位時間内に設定した回数以上のパターンにマッチするログが現れたら、設定したコマンドを実行することができます。

## インストール
CentOS6 ではepelレポジトリにあります。

```bash
$ yum install fail2ban
```
### 初期設定
* logtargetをsyslog から単独のファイルに変更します

```text:/etc/fail2ban/fail2ban.conf
-logtarget = SYSLOG
+logtarget = /var/log/fail2ban.log
```

* logtargetの変更にあわせてlogrotateの設定を変更します。

```text:/etc/logrotate.d/fail2ban
/var/log/fail2ban.log {
    missingok
    notifempty
    size 30k
    create 0600 root root
    postrotate
        /sbin/service fail2ban reload 2> /dev/null || true
    endscript
}
```
## Wordpress用のjail

```text:/etc/fail2ban/jail.conf
[wplogin-iptables]
enabled = true
filter = apache-wplogin
action = iptables[name=HTTP, port=http, protocol=tcp]
logpath = /var/log/httpd/access_log
maxretry = 5
findtime = 60
bantime = 1800
```

+ enabled : 当該jailを有効（=true）/無効（=false）を設定
+ filter : ログパターンの指定（後述）
+ action : パケットフィルタによるアクセスの遮断を実現する
+ logpath : Apacheのアクセスログを指定
+ maxretry : パターンの出現回数閾値を設定
+ findtime : パターンの出現回数を数えるときの単位時間（秒）
+ bantime : アクセス遮断を行う時間（秒）

このjail設定では同一のIPアドレスから 60秒間に5回以上 filter指定にマッチするログが出現したら 1800秒間 iptablesによる 80番ポートのアクセス遮断を実行する…という設定になります。

### wordpress用のfilter

```text:/etc/fail2ban/filter.d/apache-wplogin.conf
[Definition]

failregex = ^<HOST> -.*"POST /wp-login.php HTTP.*$
ignoreregex =
```

/etc/fail2ban/filter.d/apache-badbots.conf にあるaccess_logのパターンを参考に作成しました。注意としてはwordpressのログインが成功してもfailregexにマッチします。jail.conf の ignoreip で監視の対象外リストにIPアドレスと登録する。あるいは、findtime, maxretry を調整する等の対策をしてください。

### 遮断のログの例
以下はapache-wploginによるアクセス遮断のログです。

```bash
# tail /var/log/fail2ban.log
2014-06-18 10:17:03,972 fail2ban.actions: WARNING [wplogin-iptables] Ban 5.61.35.34
2014-06-18 10:47:04,235 fail2ban.actions: WARNING [wplogin-iptables] Unban 5.61.35.34
2014-06-18 13:20:16,918 fail2ban.actions: WARNING [wplogin-iptables] Ban 193.169.195.67
2014-06-18 13:50:17,053 fail2ban.actions: WARNING [wplogin-iptables] Unban 193.169.195.67
2014-06-18 13:53:27,274 fail2ban.actions: WARNING [wplogin-iptables] Ban 5.61.35.34
2014-06-18 14:23:27,418 fail2ban.actions: WARNING [wplogin-iptables] Unban 5.61.35.34
2014-06-18 16:51:30,829 fail2ban.actions: WARNING [wplogin-iptables] Ban 64.251.31.112
2014-06-18 17:21:30,966 fail2ban.actions: WARNING [wplogin-iptables] Unban 64.251.31.112
2014-06-18 17:51:31,147 fail2ban.actions: WARNING [wplogin-iptables] Ban 23.19.47.66
2014-06-18 18:21:31,384 fail2ban.actions: WARNING [wplogin-iptables] Unban 23.19.47.66
```


### しつこい相手は長期のbanで防ぐ

アクセス遮断が解除されるとまた不正ログインを試みる不届きな奴等がいます。しつこい相手には通常よりも長期の遮断を実行します。

```text:/etc/fail2ban/jail.conf
[recidive]
enabled  = true
filter   = recidive
logpath  = /var/log/fail2ban.log
action   = iptables-allports[name=recidive]
           sendmail-whois-lines[name=recidive, logpath=/var/log/fail2ban.log]
bantime  = 604800  ; 1 week
findtime = 86400   ; 1 day
maxretry = 5
```

1日のうちに5回banを食らったIPアドレスには1週間のbanを実行します。さらにその様子をメール送信で知らせます。このjailが実行されると以下のようなメールが届きます。

```text:
Hi,

The IP 198.27.67.188 has just been banned by Fail2Ban after
5 attempts against recidive.


Here are more information about 198.27.67.188:




Lines containing IP:198.27.67.188 in /var/log/fail2ban.log

2014-06-17 00:17:24,485 fail2ban.actions: WARNING [wplogin-iptables] Ban 198.27.67.188
2014-06-17 00:47:24,577 fail2ban.actions: WARNING [wplogin-iptables] Unban 198.27.67.188
2014-06-17 01:30:05,543 fail2ban.actions: WARNING [wplogin-iptables] Ban 198.27.67.188
2014-06-17 02:00:05,637 fail2ban.actions: WARNING [wplogin-iptables] Unban 198.27.67.188
2014-06-17 04:43:43,022 fail2ban.actions: WARNING [wplogin-iptables] Ban 198.27.67.188
2014-06-17 05:13:43,146 fail2ban.actions: WARNING [wplogin-iptables] Unban 198.27.67.188
2014-06-17 07:39:10,327 fail2ban.actions: WARNING [wplogin-iptables] Ban 198.27.67.188
2014-06-17 08:09:10,434 fail2ban.actions: WARNING [wplogin-iptables] Unban 198.27.67.188
2014-06-17 10:31:09,388 fail2ban.actions: WARNING [wplogin-iptables] Ban 198.27.67.188
2014-06-17 10:31:10,389 fail2ban.actions: WARNING [recidive] Ban 198.27.67.188


Regards,

Fail2Ban
```

## 自分でfilterを作成するコツ
これから書く予定