fail2ban導入
導入背景
以前の記事でセキュリティ対策としてdenyhostsというサービスを導入していると紹介しました。
https://memoran.net/about-security/
sshのポート番号を変更を行っているので、あまり攻撃は受けずほとんど活躍ができていませんでした。 そんな中、wordpressの方で攻撃を受けているらしいというlogwatchからのメールで通知がありました。
Requests with error response codes(クリックで開きます)
400 Bad Request /: 1 Time(s) /x: 1 Time(s) 401 Unauthorized /wp-login.php: 454 Time(s) 404 Not Found /robots.txt: 14 Time(s) /wp-content/force-download.php?file=../wp-config.php: 4 Time(s) /wp/wp-content/force-download.php?file=../wp-config.php: 4 Time(s) /PMA/index.php: 3 Time(s) /PMA2/index.php: 3 Time(s) /admin/PMA/index.php: 3 Time(s) /admin/index.php: 3 Time(s) /admin/mysql/index.php: 3 Time(s) /admin/mysql2/index.php: 3 Time(s) /admin/phpMyAdmin/index.php: 3 Time(s) /admin/phpmyadmin/index.php: 3 Time(s) /admin/phpmyadmin2/index.php: 3 Time(s) /admin/pma/index.php: 3 Time(s) /claroline/phpMyAdmin/index.php: 3 Time(s) ...(以下続々と)
注目すべきは401 Unauthorizedの行でwordpressのログイン画面に454回もログイン試行を行っていました。 既存のdenyhostsの方はssh(セキュアシェル)の対策しかできない?(別の対策もできるらしい)ので、httpの対策を行えるサービスを探していました。 なので別の手段で対策を行う必要があります。
fail2banとは?
そこで見つけたのが、fail2banというサービスです。fail2banとはdenyhostsのssh以外にも対応した拡張版という感じで、httpやメールサーバやその他のサービスにも対応できるというサービスです。 仕組みとしては、各サービスが出力するログファイルを監視して、設定したルールに則って違反したIPアドレスをBAN(接続拒否)します。 つまりログファイルを出すサービスなら応用ができるサービスです。
早速導入を行ったのですが、デフォルトでは全てのルールがオフになっているので必要なものだけをオンに設定します。 sshのルールはあったのですぐに設定しましたが、今回やりたかったwordpressへの不正アクセスが用意されていなく、自分で設定ファイルを書く必要がありました。
不正アクセス対策
下記のページを参考にさせてもらって、今回の不正アクセス対策を行いました。 https://4thsight.xyz/991
参考にしたページはNginxという別Webサーバを使っていたので、私はApache用の設定に修正しました。 設定した後、わざと存在しないページに複数回アクセスをして、アクセスができなくなることが確認できました。 (自分のIPをBANされた場合は、別の回線などからアクセスして、BANされたIPの解除を行う必要があります)
運用方法
fail2banでは監視するログのパターンを設定するフィルターと、フィルターで設定したパターンに一致するアクセスがあった場合の動作を定義するジェイルという設定があります。 ジェイルファイルは通常、初めから用意されているjail.confというファイルをコピーして、jail.localというファイルに記述していきます。
問題
参考にしたサイトの通りfilterファイルwordpress_filter.confとjailファイルwordpress_jail.confを作成しました。 jailファイルの方はそのままで問題ないのですが、filterファイルで問題がありました。
$ vim /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
actionの項目でメールの送信処理を行っているみたいですが私の環境では届きませんでした。 それで、以下のようにメール送信の記述に変えるとメールは届くのですが、今度はbanされていないようでした。
action = sendmail-whois[name=apache, dest=root@mydomain.local, sender=fail2ban@mydomain.local, sendername="Fail2Ban"]
一度環境をリセットしようと思い、設定ファイルなどがあるフォルダを全削除しました。
rm -rf /etc/fail2ban
その後、再度インストールを行えば、フォルダが再び作成されるだろうとの目論見でした。
yum install fail2ban
しかし、目論見は外れてフォルダが作られていませんでした。
解決
ネットで調べたところ、下記のコマンドでフォルダが作成されるとの情報があり、フォルダが出来上がりました。
yum reinstall fail2ban-server
すると、banはされているようでしたが、やはりメールが届きません。 エラー内容を詳しく見ていくと、
action = %(action_mwl)s
上記コードで指しているファイルが存在していないようでした。(上記アクションは、BANしたIPアドレス+IPアドレスのWHOIS情報+ログ情報をメールで通知) 更にネットで調べたところ、fail2banのgithubにてファイルを見つけました。 https://github.com/fail2ban/fail2ban/blob/0.11/config/action.d/sendmail-whois-lines.conf
上記をaction.dフォルダに追加したところ、無事にメールも届くようになりました。
Try & Error
試行錯誤を繰り返して、どうにか期待通りに動きをしてくれるようになりました。 こういう環境構築などの設定はやっていてあまり苦ではありませんが、何度もやっていると時間を気にしたり、設定している間にも不正アクセスをされていたので、それを考えると少し難儀な作業だったと思います。 Try & Errorはプログラマの基本だと思いますので、これに懲りずに更に挑戦を続けていこうと思います。
その後...
その後無事に不正アクセスを一定回数以上行ったIPに対してBANすることが出来ています。 数時間後には一度BANは解除されるのですが、一定期間BANを受けたIPに関しては永久にアクセス出来ないよう設定しているので、しつこい攻撃に関しても対策できています。
しかし、接続元のIPが膨大で、すべてのIPに関して対処することは難しいです。 100以上のIPから1~3回ずつしかログインされていないので、自分もログインを間違った場合にBANされることを想定してルール化ができませんでした。 なので、とりあえずの対策としてwordpressへのログイン画面には日本のドメイン(.jp)からしかアクセスできないように、webサーバの設定ファイルに記述しました。 翌日以降のlogwatchからのレポートを見てみると見事に激減したので、ひとまず一安心といったところです。