このページでは、Linux サーバーに Fail2Ban を導入し、Apache の認証失敗ログを監視して攻撃元 IP を自動的に遮断するまでの手順を説明する。
公開サーバーでは、ログイン画面や Basic 認証に対してパスワードを繰り返し試す、いわゆるブルートフォース攻撃が発生することがある。このような攻撃は短時間に多数の認証試行が行われるため、対策を行わない場合はログイン情報が推測されるリスクが高まる。
Fail2Ban はログファイルを継続的に監視し、一定回数以上の認証失敗を検知すると Firewall にルールを追加して攻撃元 IP を遮断する仕組みである。ログをもとに攻撃を判定するため構成は比較的シンプルでありながら効果が高く、公開サーバーでは基本的なセキュリティ対策の一つとして広く利用されている。
この手順では次の構成を作成する。
・Fail2Ban をインストールする
・Apache の認証失敗ログを監視する
・一定回数以上の認証失敗を検知した IP を自動遮断する
・必要に応じてメール通知を行う
Fail2Ban は Apache のログを監視し、攻撃と判断した IP を Firewall に登録して接続を遮断する。
Fail2Ban は、いくつかの設定要素を組み合わせて動作する。
| 要素 | 役割 |
|---|---|
| logpath | 監視するログファイル |
| filter | ログの中から攻撃パターンを検知する |
| jail | 監視設定をまとめたルール |
| maxretry | 失敗を何回まで許容するか |
| findtime | 失敗回数を数える時間 |
| bantime | BAN を継続する時間 |
| action | BAN 時に実行する処理 |
このページの手順では、Apache が出力する認証失敗ログを Fail2Ban が読み取り、条件に一致したアクセス元を遮断する構成を作る。
まず Fail2Ban パッケージをインストールする。
dnf install fail2ban
Fail2Ban を起動し、OS 起動時に自動起動するよう設定する。
systemctl enable --now fail2ban
Fail2Ban が正常に起動していることを確認する。
systemctl status fail2ban
active (running) と表示されていれば正常。
Fail2Ban の設定は jail.local に記述する。
デフォルト設定の jail.conf はパッケージの更新で上書きされる可能性があるため、通常は直接変更しない。
vi /etc/fail2ban/jail.local
Apache の認証失敗ログを監視するため、apache-auth jail を有効化する。
[apache-auth]
enabled = true
port = http,https
logpath = /var/log/httpd/*error_log
maxretry = 3
findtime = 600
bantime = 86400
ignoreip = 127.0.0.1/8 192.168.X.0/24
| 設定 | 内容 |
|---|---|
| enabled | jail を有効化する |
| port | 対象ポートを指定する |
| logpath | 監視対象ログを指定する |
| maxretry | 指定回数失敗したらBANする |
| findtime | 失敗回数を集計する時間範囲 |
| bantime | BAN を継続する時間 |
| ignoreip | BAN対象から除外するIP |
この設定では、10分以内に3回認証失敗した IP を 24時間遮断する動きになる。
ignoreip は BAN 対象から除外する IP を指定する設定である。
例
ignoreip = 127.0.0.1/8 192.168.X.0/24
この設定では localhost や管理ネットワークからのアクセスは BAN されない。
サーバー管理中に誤って自分自身の端末を遮断してしまうと復旧が面倒になるため、管理ネットワークは ignoreip に入れておくのが一般的である。
10分以内に3回認証失敗
↓
攻撃と判断
↓
24時間IP遮断
↓
ignoreip に含まれるIPは除外
apache-auth は Fail2Ban に標準で用意されている jail であり、Apache の認証失敗ログを検知する。
関連ファイル
/etc/fail2ban/jail.conf
/etc/fail2ban/filter.d/apache-auth.conf
この filter は Apache の error_log に出力される認証失敗メッセージを検知する。
AH01617: user example-user: authentication failure for "/protected/": Password Mismatch
Fail2Ban はこのようなログを検知し、失敗回数をカウントする。
apache-auth は標準で用意されている jail であり、Apache の Basic 認証失敗に対してそのまま利用しやすい。
独自 filter を最初から作り込まなくても導入できるため、まずはこの標準 jail から始めると構成を理解しやすい。
Fail2Ban はログを監視するだけのツールではない。
攻撃と判断された IP は Firewall に自動的に登録され、以後その IP からの接続は拒否される。
処理の流れ
ログ監視
↓
攻撃判定
↓
Firewallルール追加
↓
接続拒否
Fail2Ban は攻撃を検知すると Firewall にルールを追加して接続を遮断する。
概念的には、BAN された IP を拒否するルールが Firewall 側に追加されるイメージになる。
処理の流れ
1 Fail2Ban が攻撃を検知
2 Firewall に遮断ルールを追加
3 BAN対象IPの接続を拒否
4 bantime 経過後に自動解除
この仕組みにより、同じ送信元からの総当たり攻撃を継続しにくくできる。
最近の Linux では Firewall 管理に firewalld が使われることが多い。
Fail2Ban は環境に応じて action を通じて Firewall と連携するため、iptables コマンドを直接使っていなくても動作させることができる。
つまり、このページで説明している「Fail2Ban が Firewall にルールを追加する」という考え方自体は、firewalld を利用している環境でもそのまま成り立つ。
設定変更後は Fail2Ban を再起動して内容を反映する。
systemctl restart fail2ban
現在有効な jail を確認する。
fail2ban-client status
表示例
Status
|- Number of jail: 1
`- Jail list: apache-auth
apache-auth が表示されていれば、設定が読み込まれている。
fail2ban-client status apache-auth
表示例
Status for the jail: apache-auth
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- File list: /var/log/httpd/error_log /var/log/httpd/ssl_error_log
`- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list:
この出力では、失敗回数や現在の BAN 状態を確認できる。
Basic 認証が有効な公開ページにアクセスし、意図的に認証を複数回失敗させる。
例
https://portal-demo.example.invalid/secure
ここでは実在しない架空ホスト名を使っている。
テスト時は ignoreip に含まれないネットワークから実施する。
管理ネットワーク内から実施すると BAN されないことがある。
fail2ban-client status apache-auth
表示例
Status for the jail: apache-auth
|- Filter
| |- Currently failed: 1
| |- Total failed: 4
`- Actions
|- Currently banned: 1
`- Banned IP list: 203.0.113.10
Banned IP list に例 IP が表示されていれば、Fail2Ban による遮断が動作している。
テスト後は BAN を解除する。
fail2ban-client set apache-auth unbanip 203.0.113.10
BAN 発生時に管理者へ通知する場合は DEFAULT セクションを追加する。
vi /etc/fail2ban/jail.local
追加内容
[DEFAULT]
destemail = security@example.invalid
sender = fail2ban@example.invalid
mta = sendmail
action = %(action_mwl)s
| 設定 | 内容 |
|---|---|
| destemail | 通知先メールアドレス |
| sender | 送信元メールアドレス |
| mta | メール送信方式 |
| action = %(action_mwl)s | メール通知 + whois 情報 + ログ添付 |
動作イメージ
攻撃IPを検知
↓
IPをBAN
↓
関連情報を取得
↓
管理者へ通知
systemctl restart fail2ban
手動で BAN を発生させ、通知動作を確認する。
fail2ban-client set apache-auth banip 203.0.113.20
メール例
Subject: [Fail2Ban] apache-auth: banned 203.0.113.20
メールには次のような情報が含まれる。
・攻撃元 IP
・関連情報
・Apache の認証失敗ログ
Fail2Ban はログを監視して動作する仕組みのため、問題が発生した場合はログ確認が重要になる。
状況を切り分けるときは、次の3つを見ると流れを追いやすい。
・Apache のログ
・Fail2Ban の状態
・Fail2Ban サービスログ
Fail2Ban が監視するのは Apache の error_log である。
認証失敗が発生している場合、このログに記録される。
tail -f /var/log/httpd/error_log
認証失敗ログ例
AH01617: user example-user: authentication failure for "/protected/": Password Mismatch
このログが出ていなければ、Fail2Ban 側ではなく Apache 側の設定や認証方式を見直す必要がある。
現在の BAN 状態や失敗回数は fail2ban-client コマンドで確認できる。
fail2ban-client status
特定の jail 状態確認
fail2ban-client status apache-auth
表示例
Status for the jail: apache-auth
|- Filter
| |- Currently failed: 2
| |- Total failed: 10
`- Actions
|- Currently banned: 1
`- Banned IP list: 203.0.113.10
ここでは、現在の失敗回数、BAN された IP、累計の失敗回数などを確認できる。
Fail2Ban 自体の動作ログは systemd の journal で確認できる。
journalctl -u fail2ban
リアルタイム確認
journalctl -u fail2ban -f
ログ例
NOTICE [apache-auth] Ban 203.0.113.10
このログが出ていれば、Fail2Ban による BAN 処理は実行されている。
Fail2Ban は Firewall にルールを追加することで接続を遮断する。
firewalld を利用している環境では、Firewall 側の設定状況もあわせて確認しておくと切り分けしやすい。
firewall-cmd --list-all
Fail2Ban が動作していても、Firewall 側の反映状態によっては期待した遮断結果にならないことがあるため、ログだけでなく Firewall 側も確認しておくと安全である。
Fail2Ban のトラブルは次の順番で確認すると原因を切り分けやすい。
1 Apache のログに認証失敗が出ているか
2 Fail2Ban がそのログを検知しているか
3 Firewall に遮断ルールが反映されているか
Fail2Ban はログベースの仕組みであるため、ログ形式が変わると検知できなくなる場合がある。
例えば次のような変更を行った場合は、filter 設定や logpath を見直す必要がある。
・Apache のログフォーマット変更
・認証方式の変更
・リバースプロキシ構成の変更
・アプリケーション側の応答仕様変更
Fail2Ban を導入すると Apache の認証失敗ログを監視し、ブルートフォース攻撃を自動的に遮断できる。
さらにメール通知を組み合わせることで、攻撃発生時の状況を管理者が把握しやすくなる。
公開サーバーでは、基本的なセキュリティ対策として導入しておきたい。