CentOS7:Fail2banでWordPress(Nginx)への不正アクセスを防ぐ

WordPressサーバーのセキュリティ対策の一つとして「不正アクセス対策」があります。

対策方法には何通り(IPS機能を持つネットワーク機器で対策・WordPressプラグインで対策・ソフトウェアで対策)もありますが、WordPressプラグインは入れすぎると動作に影響がでるため、なるべくプラグイン以外で対応したいところです。

そこで、ここではWordPressが稼働しているサーバーOS(CentOS7)にソフトウェア(Fail2ban)をインストールし対策する方法を紹介します。

Fail2banとは

Fail2banは、アプリケーションのログを監視し、不正なパターンにマッチしたIPアドレスをfirewalldのルールに追加し、アクセスを遮断(BAN)するセキュリティツールです。

インストール

まずは、以下のコマンドでインストールします。「jwhois」は、BANされたIPアドレスの詳細を調べる時に利用するソフトウェアです。

yum -y install epel-release
yum -y install --enablerepo=epel fail2ban fail2ban-systemd gamin-python
yum -y install jwhois

設定

次にフィルター設定ファイルとジェイル設定ファイルを作成します。

フィルター設定

フィルター設定では、監視するログのパターンを設定します。ここでは「ログインページへのアクセスログ」と「存在しないページや、閲覧が禁止されているページヘのアクセスログ」を設定しています。

vi /etc/fail2ban/filter.d/wordpress_filter.conf
[Definition]
failregex = ^<HOST>.*POST.*(wp-login\.php|xmlrpc\.php).*$
            ^<HOST>.*"(GET|POST).*" (404|403) .*$
ignoreregex =

フィルターの設定が完了したら、監視するログに対して作成したフィルタが機能しているかを、以下のコマンドで確認します。コマンドの実行結果で、監視したいログが抽出されていればOKです。

fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/wordpress_filter.conf  --print-all-matched

ジェイル設定

ジェイル設定では、フィルター設定で定義したパターンに一致するアクセスがあった場合の動作を定義します。

vi /etc/fail2ban/jail.d/wordpress_jail.conf
[DEFAULT]
bantime  = 43200
findtime  = 3600
maxretry = 3
banaction = firewallcmd-ipset
backend = gamin
action = %(action_mwl)s
ignoreip = 127.0.0.1/8 192.168.1.0/24

[recidive]
enabled = true
bantime = -1
findtime = 259200
maxretry = 2

[sshd]
enabled = true
port = 2345

[wordpress]
enabled = true
filter = wordpress_filter
logpath = /var/log/nginx/*access.log

「DEFAULT]セクションの設定

  • 1時間(findtime)に3回(maxretry)を超えてフィルターにマッチするアクセスを試みたIPアドレスを、12時間(bantime)BAN
  • BANする方法は、firewalldにルール登録(banaction)
  • ログの監視方法(backend)は、ファイルの変化を検出する「gamin」を使用 ※ログローテーション等のタイミングで監視対象ログを追尾できなくなる場合を考慮し、gaminとしました。
  • 通知内容は「BANしたIPアドレス」「IPアドレスのWHOIS情報」「そのときに記録されたログ」(action)※既定の通知先はroot宛メールです。
  • 自分自身と、192.168.1.0./24のネットワークからのアクセスは監視の対象外(ignoreip)

「recidive」セクションの設定

  • この設定を有効化(enabled)
  • 3日間で2回(maxretry)BANされたことがあるIPアドレスに対して、次にBANされた場合、永久的(bantime)にBANする設定

「wordpress」セクションの設定

  • この設定を有効化(enabled)
  • フィルター「wordpress_filter」を使用(filter)して、ログファイル「/var/log/nginx/access.log」を監視(logpath)

起動

自動起動設定して、Fail2banを起動します。

systemctl enable fail2ban
systemctl start fail2ban
systemctl status fail2ban

動作確認

WordPressのログインページにアクセスし、ログイン試行を繰り返すと設定どおり4回目でBANされていることがわかります。

tail -f /var/log/fail2ban.log 
2018-03-20 19:40:13,162 fail2ban.filter         [237169]: INFO    [wordpress] Found XXX.XXX.XXX.198
2018-03-20 19:40:18,169 fail2ban.filter         [237169]: INFO    [wordpress] Found XXX.XXX.XXX.198
2018-03-20 19:40:19,171 fail2ban.filter         [237169]: INFO    [wordpress] Found XXX.XXX.XXX.198
2018-03-20 19:40:20,002 fail2ban.actions        [237169]: NOTICE  [wordpress] Ban XXX.XXX.XXX.198

ここでは記載しませんが、「recidive」についても動作していることを確認しましょう。

おまけ

BANされているIPアドレスを確認するには以下のコマンドで

fail2ban-client status <jail名>

BANされているIPアドレスを解除するには以下のコマンドで

fail2ban-client set <jail名> unbanip ***.****.***.***

まとめ

これで不正アクセスの状況をある程度把握できるようになり、不安はかなり解消された感じです。

スポンサーリンク