LoginSignup
6
7

More than 5 years have passed since last update.

Fail2Ban でWordPress のセキュリティ対策

Posted at

WordPress を立てると(立てなくても)、どこからともなく管理画面が攻撃されますよね?

一番良いのは、WordPress の管理画面に対してIP 制限したり、表側とドメイン変えたり一般のユーザから普通にはアクセス出来ない設定にするのが良いと思います。

とはいえ、止むに止まれぬ事情でできない場合はあの手この手でセキュアにしていきましょう。今回はFail2Ban を使って雑ですがブルートフォースアタック、辞書攻撃的なやつをやりづらくする設定をしました。

Fail2Ban の設定

/etc/fail2ban/jail.local
[DEFAULT]
ignoreip = 127.0.0.1/8 172.0.0.0/8 192.168.0.0/16 10.0.0.0/16
bantime  = 600
findtime = 600
maxretry = 3
backend  = auto
usedns   = no

[wplogin-iptables]
enabled  = true
filter   = nginx-ltsv-wplogin
action   = iptables[name=HTTPS, port=https, protocol=tcp]
           slack[name=HTTPS]
logpath  = /var/log/nginx/access.log
maxretry = 10
findtime = 1800
bantime  = 3600

これで、 nginx-ltsv-wplogin というフィルタルール(後述)にマッチしたIP からのアクセスを一時的に拒否することができます。30分以内に10回ログインできなかった場合に1時間アクセスを遮断するように設定しています。

Fail2Ban の仕組みとしてはログファイルの中で、フィルタルールに一致したIP が findtime の設定時間内に maxretry の設定回数以上カウントされたら、iptables に該当IP を追加して遮断するようになっています。

ちなみに、 slack[name=HTTPS] は別途設定したBan されたホスト情報の通知用に設定したものです。名前の通り、Slack に通知されます。

独自フィルタ nginx-ltsv-wplogin の設定

/etc/fail2ban/filter.d/nginx-ltsv-wplogin.conf
[Definition]

failregex = host:<HOST>\s.*req:POST /wp-login\.php.*status:200
ignoreregex =

LTSV でログ出力しているので、デフォルト設定の場合は正規表現を適宜書き換えてください。<HOST> と書いた場所にあるIP が遮断対象になります。

このフィルタのテストのやり方がわからなかったのですが、調べてみたら fail2ban-regex を使うとできるようです。

設定したファイルを元にテストする場合

fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-ltsv-wplogin.conf

直接正規表現をテストする場合

fail2ban-regex /var/log/nginx/access.log "host:<HOST>\s.*req:POST /wp-login\.php.*status:200"

slack 通知(おまけ)

/etc/fail2ban/action.d/slack.conf
[Definition]

# Option:  actionstart
# Notes.:  command executed once at the start of Fail2Ban.
# Values:  CMD
#
actionstart =

# Option:  actionstop
# Notes.:  command executed once at the end of Fail2Ban
# Values:  CMD
#
actionstop =

# Option:  actioncheck
# Notes.:  command executed once before each actionban command
# Values:  CMD
#
actioncheck =

# Option:  actionban
# Notes.:  command executed when banning an IP. Take care that the
#          command is executed with Fail2Ban user rights.
# Tags:    See jail.conf(5) man page
# Values:  CMD
#
actionban = curl -X POST --data-urlencode 'payload={"channel": "#<channel>", "username": "<username>", "text": "`<hostname>` *[<name>]* IP <ip> has been banned by Fail2Ban filter.", "icon_emoji": "<icon_emoji>"}' <webhook_url>

# Option:  actionunban
# Notes.:  command executed when unbanning an IP. Take care that the
#          command is executed with Fail2Ban user rights.
# Tags:    See jail.conf(5) man page
# Values:  CMD
#
actionunban =

[Init]
hostname = wordpress-server

# Webhook URL
webhook_url = https://xxxxx

channel     = fail2ban
username    = fail2ban
icon_emoji  = :boom:

[Init] のあたりをよしなに書き換えて使ってください。 hostname は複数台サーバーがある時などにどのサーバーかわかるようにすると良いと思います。

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7