WordPress を立てると(立てなくても)、どこからともなく管理画面が攻撃されますよね?
一番良いのは、WordPress の管理画面に対してIP 制限したり、表側とドメイン変えたり一般のユーザから普通にはアクセス出来ない設定にするのが良いと思います。
とはいえ、止むに止まれぬ事情でできない場合はあの手この手でセキュアにしていきましょう。今回はFail2Ban を使って雑ですがブルートフォースアタック、辞書攻撃的なやつをやりづらくする設定をしました。
Fail2Ban の設定
[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
の設定
[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 通知(おまけ)
[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
は複数台サーバーがある時などにどのサーバーかわかるようにすると良いと思います。