fail2ban
『fail2ban』は SSH・Nginx・Apache などへのブルートフォース攻撃を自動的に検知し、不正な送信元 IP を一定時間バンするセキュリティツールです。ログファイルを監視して失敗回数が閾値を超えた IP を 『iptables』、『nftables』のルールでブロックします。バン対象の定義は「ジェイル(jail)」と呼ばれる設定単位で管理し、サービスごとに細かくチューニングできます。
構文
# -----------------------------------------------
# /etc/fail2ban/jail.local — 基本設定([DEFAULT])
# -----------------------------------------------
# [DEFAULT] セクション
# → 全ジェイル共通のデフォルト値を設定します
# → 個別ジェイルで同名キーを書くと上書きされます
# bantime = {秒数 | 期間文字列}
# → バン持続時間を指定します
# → 負の値(-1)を指定すると永続バンになります
# 例: bantime = 1h
# 例: bantime = -1
# findtime = {秒数 | 期間文字列}
# → maxretry 回の失敗を「この時間内」にカウントします
# 例: findtime = 10m
# maxretry = {整数}
# → findtime 内にこの回数を超えると BANします
# 例: maxretry = 5
# ignoreip = {CIDR | IPアドレス} [{CIDR | IPアドレス} ...]
# → バン対象から除外するアドレスを空白区切りで列挙します
# → ラボや管理端末の IP は必ずここに追加してください
# 例: ignoreip = 127.0.0.1/8 ::1 203.0.113.10
# -----------------------------------------------
# /etc/fail2ban/jail.local — ジェイル設定
# -----------------------------------------------
# [{ジェイル名}] セクション
# → サービスごとのバン設定を記述します
# → enabled = true で有効化します
# enabled = {true | false}
# → このジェイルを有効化するかどうかを指定します
# 例: enabled = true
# filter = {フィルター名}
# → /etc/fail2ban/filter.d/{フィルター名}.conf を参照します
# → 組み込みフィルターが多数用意されています
# 例: filter = sshd
# logpath = {ログファイルのパス}
# → 監視対象のログファイルを指定します
# 例: logpath = /var/log/auth.log
# port = {ポート番号 | サービス名}
# → バン時にブロックするポートを指定します
# 例: port = ssh
# 例: port = http,https
# -----------------------------------------------
# fail2ban-client — 管理コマンド
# -----------------------------------------------
# fail2ban-client status
# → 有効なジェイルの一覧を表示します
# fail2ban-client status {ジェイル名}
# → 指定したジェイルの詳細(バン数・バン中 IP)を表示します
# 例: fail2ban-client status sshd
# fail2ban-client set {ジェイル名} unbanip {IPアドレス}
# → バンされた IP を手動で解除します
# 例: fail2ban-client set sshd unbanip 198.51.100.42
# fail2ban-client set {ジェイル名} banip {IPアドレス}
# → 指定した IP を手動でバンします
# 例: fail2ban-client set sshd banip 198.51.100.99
# fail2ban-client reload
# → 設定ファイルを再読み込みします(サービス再起動不要)
構文一覧
| 設定項目 / コマンド | 説明 |
|---|---|
bantime | バン持続時間を指定します。秒数または『1h』、『10m』などの期間文字列が使えます。『-1』で永続バンになります。 |
findtime | 失敗回数を集計する時間窓を指定します。この時間内に『maxretry』回を超えるとバンされます。 |
maxretry | 『findtime』内に許容する失敗回数の上限です。この値を超えた送信元 IP がバン対象になります。 |
ignoreip | バン対象から除外する IP アドレスまたは CIDR を空白区切りで指定します。管理端末・踏み台サーバーは必ず登録してください。 |
enabled | ジェイルを有効化するかどうかを 『true』、『false』で指定します。 |
filter | 使用するフィルター名を指定します。『/etc/fail2ban/filter.d/』にある設定ファイルを参照します。 |
logpath | 監視対象のログファイルパスを指定します。複数行に分けて複数ファイルを指定することもできます。 |
port | バン時にブロックするポートを指定します。サービス名(『ssh』等)またはポート番号が使えます。 |
fail2ban-client status | 有効なジェイルの一覧を表示します。どのジェイルが動いているかを手早く確認できます。 |
fail2ban-client status {ジェイル名} | 指定したジェイルのバン数・現在バン中の IP アドレスなど詳細情報を表示します。 |
fail2ban-client set {ジェイル名} unbanip {IP} | バンされた IP を手動で解除します。自分の IP が誤ってバンされた場合に使用します。 |
fail2ban-client set {ジェイル名} banip {IP} | 指定した IP を手動でバンします。ログに残っていない攻撃元を即座にブロックしたい場合に使います。 |
fail2ban-client reload | 設定ファイルを再読み込みします。サービスを再起動せずに変更を反映できます。 |
fail2ban-client stop / start | fail2ban サービスをクライアントから停止・起動します。『systemctl』経由でも操作できます。 |
使用例
/etc/fail2ban/jail.local
# ----------------------------------------------- # [DEFAULT] — 全ジェイル共通の設定 # ----------------------------------------------- [DEFAULT] # バン持続時間: 1時間 bantime = 1h # 10分以内に失敗が maxretry 回を超えたらバン findtime = 10m # 許容する失敗回数(5回まで) maxretry = 5 # バン対象から除外する IP / CIDR を指定します # 岡部ラボの管理端末と踏み台サーバーを除外しています ignoreip = 127.0.0.1/8 ::1 203.0.113.10 10.0.0.0/8 # ----------------------------------------------- # [sshd] — SSH のブルートフォース対策 # ----------------------------------------------- [sshd] # このジェイルを有効化します enabled = true # 組み込みの sshd フィルターを使用します filter = sshd # SSH ポートをブロックします port = ssh # Ubuntu / Debian 系のログパス logpath = /var/log/auth.log # SSH は maxretry を厳しめに設定します maxretry = 3 # ----------------------------------------------- # [nginx-http-auth] — Nginx Basic認証の失敗対策 # ----------------------------------------------- [nginx-http-auth] enabled = true filter = nginx-http-auth port = http,https # Nginx のエラーログを監視します logpath = /var/log/nginx/error.log # ----------------------------------------------- # [nginx-limit-req] — Nginx レートリミット超過対策 # ----------------------------------------------- [nginx-limit-req] enabled = true filter = nginx-limit-req port = http,https logpath = /var/log/nginx/error.log # レートリミット超過は検知感度を下げて誤検知を減らします maxretry = 10
実行するコマンドは次の通りです。
$ sudo systemctl restart fail2ban $ sudo fail2ban-client status Status |- Number of jail: 3 `- Jail list: nginx-http-auth, nginx-limit-req, sshd $ sudo fail2ban-client status sshd Status for the jail: sshd |- Filter | |- Currently failed: 2 | |- Total failed: 17 | `- File list: /var/log/auth.log `- Actions |- Currently banned: 1 |- Total banned: 3 `- Banned IP list: 198.51.100.42 $ sudo fail2ban-client set sshd unbanip 198.51.100.42 1 $ sudo fail2ban-client status sshd Status for the jail: sshd |- Filter | |- Currently failed: 0 | |- Total failed: 17 | `- File list: /var/log/auth.log `- Actions |- Currently banned: 0 |- Total banned: 3 `- Banned IP list:
概要
『fail2ban』はログベースの侵入防止フレームワークです。デーモンがバックグラウンドでログを tail し、フィルター(正規表現)にマッチした失敗エントリを集計します。『findtime』内に『maxretry』を超えると、アクション(デフォルトは『iptables』、『nftables』へのルール追加)が実行され、『bantime』経過後に自動解除されます。設定は 『/etc/fail2ban/jail.conf』を直接編集せず、『/etc/fail2ban/jail.local』に差分だけ書くのがベストプラクティスです。パッケージ更新で『jail.conf』が上書きされてもローカル設定が保護されます。『ignoreip』への管理端末登録を忘れると、自分自身がサーバーからロックアウトされる危険があるため、設定前に必ず確認してください。SSH の設定強化については ssh-keygen や sshd_config(passwd_shadow) のページも合わせて参照してください。ファイアウォールルールとの連携については ufw / iptables のページを参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。