ownCloudへのブルートフォースアタックは、TOTPによる2段階認証を導入することで制限が可能です。
ただし、それぞれのアカウントで 2段階認証の設定をしなければならないので、すべてのアカウント対してログイン画面へのブルートフォースアタックを完全に防ぐことは難しいです。
2段階認証を設定しない人とかたぶんいるでしょうし。
今回は、複数回のログイン試行の失敗ログを検知し、動的に一定時間システムへのアクセス制限を行う方法について、まとめてみます。
ちなみに、派生版の Nextcloud には、複数回のログイン試行があった際に、接続をブロックする機能が既に実装されていますので、この対策は必要ないかもしれません。
概要
- Fail2ban というパッケージを使います
- Fail2ban は、ログファイルから指定したパターンを探し、条件にマッチした場合に動的にFirewallの設定を変更する凄いソフトウェアです
- firewalld や iptables などが動いていないと動作しません
- ownCloudのログ出力は、level2 以下に設定する必要があります
- ownCloudのタイムゾーンは、システムのタイムゾーンと一致させる必要があるようです
- CentOS7.2 環境でのまとめです
インストール
fail2ban は EPELリポジトリで提供されています。
EPELリポジトリが入っていない場合は、インストールしてください。
# yum install epel-release
fail2ban をインストールします。
# yum install fail2ban
とても簡単です。
フィルタルールの設定
/etc/fail2ban/filter.d/ 配下に、あらかじめ色々なフィルタが登録されており、このフィルタを、jail.local ファイルの中で有効にして使用します。
残念ながら、ownCloud用のフィルタは存在しないようなので、まずフィルタを作成します。
# vi /etc/fail2ban/filter.d/owncloud.conf
owncloud.conf に、下記の条件を追加します。
owncloud.log に記録されるログイン失敗のログ出力をマッチさせる内容です。
[Definition] failregex={"reqId":".*","remoteAddr":".*","app":"core","message":"Login failed: '.*' \(Remote IP: ''\)","level":2,"time":".*"}
初めて fail2ban を設定する場合は、jail.local がないので作成します。
# vi /etc/fail2ban/jail.local
下記の内容を追加します。
[owncloud] enabled = true filter = owncloud port = http,https bantime = 3600 findtime = 600 maxretry = 5 logpath = /home/data/owncloud.log
logpath には、ownCloudのログファイルを指定します。
bantime は、対象ホストをブロックする秒数です。デフォルトは600秒です。
findtime で指定した時間内(秒)に maxretry で指定した回数分のログがあれば、対象のホストをブロックします。
fail2banサービスの起動
# systemctl start fail2ban.service
動作テスト
ブラウザ上から、ownCloudへのログインを 5回(maxretryの回数)失敗してみます。
ログイン失敗の記録が ownCloud のログに記録されてから、実際にファイアーウォールに反映されるまで少し時間がかかるようです。
owncloud.log にログイン失敗が記録されました。
/home/data/owncloud.log {"reqId":"iHNI754Mc+ti6gi9w9iz","remoteAddr":"192.168.1.15","app":"core","message":"Login failed: 'testuser' (Remote IP: '192.168.1.15')","level":2,"time":"2017-07-27T17:48:31+09:00","method":"POST","url":"\/index.php\/login?user=testuser","user":"--"}
/var/log/fail2ban.log を見ると、ログイン失敗を検知しているのがわかります。
そして最後の行でBan!されています。
/var/log/fail2ban.log 2017-07-27 18:06:36,576 fail2ban.filter [16264]: INFO [owncloud] Found 192.168.1.15 2017-07-27 18:06:37,578 fail2ban.filter [16264]: INFO [owncloud] Found 192.168.1.15 2017-07-27 18:06:38,580 fail2ban.filter [16264]: INFO [owncloud] Found 192.168.1.15 2017-07-27 18:06:39,583 fail2ban.filter [16264]: INFO [owncloud] Found 192.168.1.15 2017-07-27 18:06:40,585 fail2ban.filter [16264]: INFO [owncloud] Found 192.168.1.15 2017-07-27 18:06:41,192 fail2ban.actions [16264]: NOTICE [owncloud] Ban 192.168.1.15
ブロック(ban)されたIPアドレスの確認方法
ブロックが適用されているフィルタの確認
# fail2ban-client status
出力例
Status |- Number of jail: 1 `- Jail list: owncloud
ブロックされているIPアドレスの確認
# fail2ban-client status owncloud
出力例
Status for the jail: owncloud |- Filter | |- Currently failed: 1 | |- Total failed: 26 | `- File list: /home/data/owncloud.log `- Actions |- Currently banned: 1 |- Total banned: 2 `- Banned IP list: 192.168.1.15
ブロック(ban)されたIPアドレスの解除方法
即座にブロックを解除したい場合は、次のようにします。
# fail2ban-client set owncloud unbanip IP_ADRESS
ブロックが解除される場合も、/var/log/fail2ban.log にアクションが記録されます。
/var/log/fail2ban.log 2017-07-27 18:09:12,664 fail2ban.actions [16264]: NOTICE [owncloud] Unban 192.168.1.15