Fail2banでownCloudへのブルートフォースアタックを阻止する

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