ブルートフォース攻撃(パスワードクラック)からサーバーを守るためには、Fail2Banの活用が欠かせません。
本記事では、Fail2Banの設定ファイルについて、基本的な書き方からホワイトリストの登録、Banの解除方法まで、Fail2Banの設定に必要なノウハウを詳しく解説しています。
まだFail2Banをインストールしていない場合、下記の記事でインストール方法を解説していますので、あわせてご覧ください。

前提条件
この記事で使用する環境
この記事では、Debian系のUbuntu Server、及びRHEL系のAlmaLinux、Rocky Linuxを用いて解説しています。
OS | Fail2Banのバージョン |
---|---|
Ubuntu Server 24.04.2 LTS | 1.0.2 |
AlmaLinux 9.5 | 1.1.0 |
Rocky Linux 9.5 | 1.1.0 |
※Fail2Banのバージョンは、各ディストリビューションのパッケージマネージャが提供している2025年5月11日時点のバージョンを採用しています。
Ubuntu Server
$ cat /etc/os-release
PRETTY_NAME="Ubuntu 24.04.2 LTS"
$ fail2ban-client -V
1.0.2
AlmaLinux
# cat /etc/redhat-release
AlmaLinux release 9.5 (Teal Serval)
# fail2ban-client -V
1.1.0
Rocky Linux
# cat /etc/redhat-release
Rocky Linux release 9.5 (Blue Onyx)
# fail2ban-client -V
1.1.0
コマンドを実行するユーザー・権限
Fail2Banの操作には、ファイルの参照を除き、rootユーザーまたはsudo権限が必要です。この記事では、以下の形式で記載しています。
rootユーザーの場合
# 〜 コマンド 〜
一般ユーザーの場合(sudo権限)
$ sudo 〜 コマンド 〜
Fail2Banの設定ファイルの構成
ディストリビューションが提供する標準のパッケージマネージャを使用してFail2Banをインストールすると、設定ファイルは/etc/fail2ban
ディレクトリに配置され、各ディストリビューションに応じた初期設定が自動的に適用されます。
Fail2Banの設定ファイルは、
- 基本設定(fail2ban.conf / fail2ban.local)
- 監視対象設定(jail.conf / jail.local)
- フィルタ設定(filter.d/*.conf)
- アクション設定(action.d/*.conf)
に分類され、それぞれが連携することで攻撃検知からBanまでの一連の処理を実現しています。
基本設定
- fail2ban.conf
- fail2ban.local(カスタム用)
fail2ban.conf
は、Fail2Ban自体の動作に関する設定を定義するもので、ログレベルやログファイルの保存場所などの設定が含まれています。
fail2ban.confの冒頭部分
$ cat /etc/fail2ban/fail2ban.conf
# Fail2Ban main configuration file
#
# Comments: use '#' for comment lines and ';' (following a space) for inline comments
#
# Changes: in most of the cases you should not modify this
# file, but provide customizations in fail2ban.local file, e.g.:
#
# [DEFAULT]
# loglevel = DEBUG
fail2ban.confの冒頭部分に書かれているように、設定を変更する際はfail2ban.conf
を直接編集するのではなく、fail2ban.local
を作成してそちらにカスタム設定を記述する方法が推奨されています。
監視対象設定
- jail.conf
- jail.d/*.conf
- jail.local(カスタム用)
- jail.d/*.local(カスタム用)
最も重要なのがjail.conf
です。このファイルには、Fail2Banがどのサービスを監視し、どのような条件でIPアドレスをBanするかといった、各jailのデフォルト設定が記述されています。
jail.confの冒頭部分
$ cat /etc/fail2ban/jail.conf
#
# WARNING: heavily refactored in 0.9.0 release. Please review and
# customize settings for your setup.
#
# Changes: in most of the cases you should not modify this
# file, but provide customizations in jail.local file,
# or separate .conf files under jail.d/ directory, e.g.:
#
# HOW TO ACTIVATE JAILS:
#
# YOU SHOULD NOT MODIFY THIS FILE.
#
# It will probably be overwritten or improved in a distribution update.
#
# Provide customizations in a jail.local file or a jail.d/customisation.local.
# For example to change the default bantime for all jails and to enable the
# ssh-iptables jail the following (uncommented) would appear in the .local file.
# See man 5 jail.conf for details.
#
# [DEFAULT]
# bantime = 1h
#
# [sshd]
# enabled = true
#
# See jail.conf(5) man page for more information
jail.conf
の冒頭部分にもfail2ban.conf
と同様の注意書きがあり、jail.conf
を直接編集することは推奨されていません。その代わりとして用いられるのがjail.local
やjail.d/*.local
です。これらのファイルに記述されたカスタム設定はjail.conf
の内容を上書きします。
- jail.conf
- jail.d/*.conf (アルファベット順)
- jail.local
- jail.d/*.local (アルファベット順)
の順番で設定ファイルを読み込み、あとから読み込んだ設定が有効になります。(オーバーライド、上書き方式)
個別のjail設定を変更・追加する場合、jail.d
ディレクトリが使用されます。
- Ubuntuの場合、jail.d/defaults-debian.conf
- AlmaLinuxの場合、jail.d/00-firewalld.conf
- Rocky Linuxの場合、jail.d/00-firewalld.conf
がデフォルトで用意されています。
フィルタ設定
- filter.d/*.conf
フィルタとは、Fail2Banがログファイルから不正な動作を検出するための正規表現ルールを定義したもので、filter.d
ディレクトリに格納されています。例えば、filter.d/sshd.conf
には、SSH接続の失敗に関連するログパターンが正規表現で記述されており、これに一致するログが検出されるとBan処理を実行します。
アクション設定
- action.d/*.conf
不正アクセスを検出した際に実行する処理が、action.d/*.conf
に定義されています。Ban対象のIPアドレスに対してiptablesやfirewalldでの遮断処理をどのように行うか、あるいはメール通知を送信するかといった設定が可能です。
Fail2Banは、デフォルトの設定で基本的な動作が可能です。運用環境に応じた調整はfail2ban.local
で行い、監視対象の指定はjail.local
で行います。
フィルタ設定filter.d/*.conf
およびアクション設定action.d/*.conf
は通常変更の必要はありませんが、必要に応じて修正することもできます。
次のセクションでは、fail2ban.local
とjail.local
の書き方について解説します。
設定ファイルの書き方
Fail2Banの設定ファイルはINI形式で書かれており、構造がシンプルで可読性が高いのが特徴です。INI形式では、セクションを中括弧 [] で囲んで明示的に区切り、その中にキーと値のペアを key = value
の形式で記述します。
INI形式で書かれたjail.localの例
[DEFAULT]
ignoreip = 127.0.0.1/8
bantime = 600
findtime = 600
maxretry = 5
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
fail2ban.local(基本設定)
fail2ban.local
は、Fail2Ban全体の動作設定を定義するための設定ファイルです。fail2ban.conf
にデフォルト設定が書かれており、それを上書きしたい場合にfail2ban.local
を作成します。このファイルは、Fail2Banのサービス全体に関わるログレベルやログファイルの出力先などを変更する際に使用します。
fail2ban.localの設定例
[DEFAULT]
loglevel = DEBUG
logtarget = /home/test-user/fail2ban.log
たとえば、デバッグ用途でログの詳細を確認したい場合には、loglevel
をDEBUG
に設定することで、Fail2Banの処理内容をより詳細に把握できます。
また、ログ出力先を標準の/var/log/fail2ban.log
から別の場所に変更したい場合も、fail2ban.local
でlogtarget
を設定します。logtarget
にはファイルパスのほか、SYSLOG
やSTDOUT
といった指定も可能です。
【補足】ログレベルの種類
ログレベル | 用途 |
---|---|
CRITICAL | 致命的なエラーのみを記録 |
ERROR | エラーを記録 |
WARNING | 警告も記録 |
INFO | 通常動作のログ |
DEBUG | 詳細なデバッグ情報(検証・開発時向け) |
jail.local(監視対象設定)
jail.local
ファイルは、Fail2Ban における各種jail(対象サービスごとのBanルール)を定義・管理する主要な設定ファイルです。Fail2Ban では、jail.conf
がデフォルト設定として用意されていますが、前述の通り、これを直接編集することは推奨されていません。
jail.local
ファイルでは、対象となるサービス(例:SSH、Postfix、Nginx)ごとに個別のセクションを設けて設定を行います。全体に共通する設定項目については、[DEFAULT]
セクションにまとめて定義します。
セクション内では、次のようなパラメータを設定します。
パラメータ | 意味 |
---|---|
ignoreip | 監視しないIPアドレス(ホワイトリスト) |
enabled | このJailを有効にするか(true:有効、false:無効) |
port | 監視対象のサービス名またはポート番号 ※IANAの標準ポートを使用している場合は、サービス名でも可能。 ※カスタムポートを使用している場合は、その番号を指定。 |
filter | 使用するフィルタ名(filter.d/*.confに対応) |
logpath | 監視対象となるログファイルのパス ※ディストリビューションにより、ログファイルのパスが異なるので、注意が必要。 例)SSHログの場合 ・Debian系の場合、/var/log/auth.log ・RHEL系の場合、/var/log/secure |
maxretry | 何回失敗したらBanするか |
findtime | maxretry回の失敗をカウントする時間(デフォルト:秒単位) |
bantime | Banする時間(デフォルト:秒単位) ※ bantime = -1 とすることで永久Banも可能。 |
findtime
やbantime
の設定時に単位を省略した場合、デフォルトで秒単位が適用されます。可読性の向上のため、「m(分)」や「h(時間)」などを付けて指定することもできます。
- 年:y
- 月:mon
- 週:w
- 日:d
- 時:h
- 分:m
- 秒:s
設定した時間のフォーマットが正しいかどうかは、fail2ban-client --str2sec
コマンドで確認できます。
$ sudo fail2ban-client --str2sec 3mon
7889400.0
$ sudo fail2ban-client --str2sec 1d
86400
$ sudo fail2ban-client --str2sec 12h
43200
$ sudo fail2ban-client --str2sec 10m
600
特定のIPアドレスをホワイトリストに登録する方法
自社の運用拠点やVPN経由でのアクセス元など、業務に支障が出るようなIPがBanされると、即時の復旧対応が必要となり、重大なオペレーションリスクにつながります。こうしたリスクを避けるために、特定のIPアドレスをホワイトリスト(Ignore List)としてFail2Banに事前登録しておきます。
設定を行うには、jail.local
ファイルを編集します。IPアドレス、CIDRマスク、ホスト名で指定でき、複数指定する場合は、半角スペースで区切って列挙します。
jail.localの設定例
[DEFAULT]
ignoreip = 127.0.0.1
[sshd]
ignoreip = 192.168.1.11 192.168.20.0/24 example.com
[DEFAULT]
セクションに記述すると、全てのjailに対して有効になります。特定のjailだけに適用したい場合は、個別のjailセクション内で再定義します。
SSHのブルートフォース攻撃(パスワードクラック)をBanする方法
SSHへのブルートフォース攻撃をブロックしたい場合、[sshd]
セクションを以下のように記述します。
jail.localの設定例
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log # Ubuntuの場合
logpath = /var/log/secure # AlmaLinux、Rocky Linuxの場合
maxretry = 5
findtime = 10m
bantime = 1h
この設定の場合、10分以内(findtime=10m)に5回のログイン失敗(maxretry=5)を検出すると、1時間(bantime=1h)、該当のIPアドレスからのSSHログインをBanします。不正アクセスの傾向や誤Banの発生状況に応じて、maxretry
やfindtime
を調整することで、より適切な防御レベルを維持できます。
Fail2Banの設定変更で使うコマンド
- サービスの起動、再起動、停止、ステータス確認、自動起動ON、自動起動OFF
- systemctl 【start / restart / stop / status / enable / disable】 fail2ban
- jailのステータスを確認
- fail2ban-client status
- fail2ban-client status 【jail名】
- jailの再読み込み
- fail2ban-client reload
- fail2ban-client reload 【jail名】
- BanしたIPアドレスを解除する
- fail2ban-client set 【jail名】 unbanip 【IPアドレス】
- fail2ban-client unban --all
サービスの起動、再起動、停止、ステータス確認、自動起動ON、自動起動OFF
Fail2Banは、Linux上で稼働するサービス(デーモン)であるため、起動や停止、ステータスの確認といった基本的な操作は、systemctl
コマンドを用いて行います。これは他の多くのシステムサービスと同様であり、Ubuntu、AlmaLinux、Rocky Linuxなど、systemdを採用している主要なLinuxディストリビューションで共通です。
$ sudo systemctl start fail2ban # サービスの起動
$ sudo systemctl restart fail2ban # サービスの再起動
$ sudo systemctl stop fail2ban # サービスの停止
$ sudo systemctl status fail2ban # ステータス確認
$ sudo systemctl enable fail2ban # 自動起動を有効化
$ sudo systemctl disable fail2ban # 自動起動を無効化
jailのステータスを確認
fail2ban-client status
コマンドで、Fail2Ban全体の状態と稼働中のjail一覧を確認することができます。
$ sudo fail2ban-client status
Status
|- Number of jail: 1
`- Jail list: sshd
さらに、特定のjailの詳細なステータスを確認するには、jail名を指定します。指定したjailが正しく動作しているか、何件のアクセスをBanしているかといった運用状況を把握できます。
SSHの場合
$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 5
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: 192.168.10.11
jailを再読み込み(リロード)
変更したjailを反映させるためには「jailの再読み込み」が必要です。Fail2Banサービスを再起動する方法もありますが、すべてのjail(監視ルール)に対する一時的な停止を伴うため、影響範囲を最小限に抑えたい場合には、jailを再読み込みします。
$ sudo fail2ban-client reload # jailを再読み込み
$ sudo fail2ban-client reload 【jail名】 # 指定したjailを再読み込み
例えば、sshd
のjailだけをリロードしたい場合は、sudo fail2ban-client reload sshd
を指定します。
なお、リロードと再起動の違いについて誤解されがちですが、リロードはあくまで設定の再読み込みであり、Ban状態やjailの稼働状態には影響を与えません。既にBanされたIPアドレスはそのまま維持され、処理中のログ監視も継続されます。一方、再起動(systemctl restart fail2ban
)では、サービスが一旦停止し、すべてのjailが再構築されるため、Banの一時解除やログの監視が一時的に中断される点に留意が必要です。
軽微な設定変更、たとえばBan期間や試行回数の調整といった変更であれば、fail2ban-client reload
を使うことで、Fail2Ban全体のプロセスを止めずに設定変更を反映することができます。
BanしたIPアドレスを解除する
現在、Ban中のIPアドレスは前述のfail2ban-client statusコマンドにて、確認することができます。
SSHの場合
$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 5
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: 192.168.10.11
出力結果の中に、Banned IP list
という項目があり、そこに現在BanされているIPアドレスが表示されます。
以下のコマンドを使用すると、誤ってBanしてしまったIPアドレスや、状況が変わってアクセスを許可したいIPアドレスを手動で解除(unban)することができます。
$ sudo fail2ban-client set 【jail名】 unbanip 【IPアドレス】
例)
$ sudo fail2ban-client set sshd unbanip 192.168.10.11
この操作により、Fail2Banは該当のIPアドレスに対してBanを解除し、アクセスが可能な状態になります。ただし、Fail2Banはログを常に監視しているため、問題のある挙動が再度ログに記録されれば、再Banされる可能性があります。そのため、意図的に解除したい場合は、jail設定の見直し(ホワイトリストに登録)もあわせて実施しましょう。
sudo fail2ban-client unban --all
を使用すると、すべてのBanを解除することができます。
SSHブルートフォース攻撃をBanできるか検証してみた
Fail2BanによってSSHブルートフォース攻撃をどの程度防止できるかを確認するため、実際に検証環境を構築して実験を行いました。検証環境には、仮想マシン上のUbuntu Server、AlmaLinux、Rocky Linuxを使用し、攻撃側にはKali Linuxを使用しています。
検証環境のシステム構成
- SSH実行マシン
- Kali Linux 2025.1(192.168.10.11)
- Fail2Ban実行マシン
- Ubuntu Server(192.168.10.102)
- AlmaLinux(192.168.10.103)
- Rocky Linux(192.168.10.104)
いずれもWindows10にインストールしたVirtualBox上の仮想マシンで動作しています。
Jail設定の有効化
Fail2Banの設定では、maxretry=5
、findtime=1m
、bantime=10m
を指定しています。これは「1分間に5回認証に失敗すると、そのIPを10分間ブロックする」設定です。※他のパラメータは、デフォルト設定をそのまま使用します。
jail.localの設定例
[sshd]
enabled = true
maxretry = 5
findtime = 1m
bantime = 10m
SSHブルートフォース攻撃のシミュレーション
SSHアクセスには、Kali Linuxに標準で搭載されているツール「Hydra」を用いました。Hydraは、ブルートフォース攻撃(パスワードクラック)に特化したツールであり、SSHにも対応しています。
Kali LinuxでHydraを実行
$ cat target.list
192.168.10.102
192.168.10.103
192.168.10.104
$ hydra -L user.list -P password.list -M target.list -t 2 ssh
不正アクセスの検知とBanの確認
ブルートフォース攻撃を開始後、Fail2Banのログ/var/log/fail2ban.log
を確認すると、不正アクセスを検知し、Ban処理が行われたことが確認できます。また、fail2ban-client
コマンドでもBan状態を確認できます。
Ubuntu Server
$ tail -100 /var/log/fail2ban.log
〜 省略 〜
2025-05-12 17:42:01,732 fail2ban.filter [2499]: INFO [sshd] Found 192.168.10.11 - 2025-05-12 17:42:01
2025-05-12 17:42:02,568 fail2ban.filter [2499]: INFO [sshd] Found 192.168.10.11 - 2025-05-12 17:42:02
2025-05-12 17:42:02,569 fail2ban.filter [2499]: INFO [sshd] Found 192.168.10.11 - 2025-05-12 17:42:02
2025-05-12 17:42:05,317 fail2ban.filter [2499]: INFO [sshd] Found 192.168.10.11 - 2025-05-12 17:42:04
2025-05-12 17:42:05,318 fail2ban.filter [2499]: INFO [sshd] Found 192.168.10.11 - 2025-05-12 17:42:04
2025-05-12 17:42:05,414 fail2ban.actions [2499]: NOTICE [sshd] Ban 192.168.10.11
$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 5
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: 192.168.10.11
AlmaLinux
# tail -100 /var/log/fail2ban.log
〜 省略 〜
2025-05-12 17:42:02,184 fail2ban.filter [2545]: INFO [sshd] Found 192.168.10.11 - 2025-05-12 17:42:01
2025-05-12 17:42:02,635 fail2ban.filter [2545]: INFO [sshd] Found 192.168.10.11 - 2025-05-12 17:42:02
2025-05-12 17:42:02,636 fail2ban.filter [2545]: INFO [sshd] Found 192.168.10.11 - 2025-05-12 17:42:02
2025-05-12 17:42:04,855 fail2ban.filter [2545]: INFO [sshd] Found 192.168.10.11 - 2025-05-12 17:42:04
2025-05-12 17:42:04,856 fail2ban.filter [2545]: INFO [sshd] Found 192.168.10.11 - 2025-05-12 17:42:04
2025-05-12 17:42:05,074 fail2ban.actions [2545]: NOTICE [sshd] Ban 192.168.10.11
2025-05-12 17:42:07,385 fail2ban.filter [2545]: INFO [sshd] Found 192.168.10.11 - 2025-05-12 17:42:07
# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 6
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd + _COMM=sshd-session
`- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: 192.168.10.11
Rocky Linux
# tail -100 /var/log/fail2ban.log
〜 省略 〜
2025-05-12 17:42:02,244 fail2ban.filter [2546]: INFO [sshd] Found 192.168.10.11 - 2025-05-12 17:42:01
2025-05-12 17:42:02,246 fail2ban.filter [2546]: INFO [sshd] Found 192.168.10.11 - 2025-05-12 17:42:02
2025-05-12 17:42:02,246 fail2ban.filter [2546]: INFO [sshd] Found 192.168.10.11 - 2025-05-12 17:42:02
2025-05-12 17:42:05,238 fail2ban.filter [2546]: INFO [sshd] Found 192.168.10.11 - 2025-05-12 17:42:04
2025-05-12 17:42:05,238 fail2ban.filter [2546]: INFO [sshd] Found 192.168.10.11 - 2025-05-12 17:42:04
2025-05-12 17:42:05,750 fail2ban.actions [2546]: NOTICE [sshd] Ban 192.168.10.11
2025-05-12 17:42:08,974 fail2ban.filter [2546]: INFO [sshd] Found 192.168.10.11 - 2025-05-12 17:42:08
# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 6
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd + _COMM=sshd-session
`- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: 192.168.10.11
AlmaLinux、Rocky Linuxでは、Ban処理の後もログイン認証失敗のログが数回記録されています。これは、Fail2BanのBan処理がブルートフォース攻撃の速度に追いつかなかったことが推測できます。
検証結果
Ban後、同一IPからのSSH接続試行はConnection refused
となり、攻撃の継続が困難となりました。この結果から、Fail2Banは事前に適切な設定を施しておけば、SSHブルートフォース攻撃に対して一定の防御効果を持つことが確認できます。
ただし注意点として、低速や分散型攻撃の場合、Fail2Banでは検知できず、効果が限定的になる可能性があります。したがって、本番環境ではFail2Banだけに依存せず、多層防御の観点からポート変更、公開鍵認証、rootログイン禁止、GeoIP制限など複数の防御手段を組み合わせることが推奨されます。
運用上の注意
設定ファイルは直接編集しない
Fail2Banでは、設定ファイルの直接編集は推奨されていません。fail2ban.conf
やjail.conf
といった初期設定ファイルが存在しますが、これらは将来的なアップデートで上書きされる可能性があるため、カスタム設定が失われる危険があります。代わりに、カスタム設定は*.local
ファイル(例:fail2ban.local
、jail.local
)に記述するのが推奨されています。
設定変更後は必ず再起動orリロード
設定の反映にはFail2Banの再起動またはリロードが必要です。設定ファイルを編集しただけでは新しいルールは有効にならないため、作業後には必ずsystemctl restart fail2ban
あるいはfail2ban-client reload
コマンドを実行してください。
自分自身が誤Banされる
設定ミスによる自分自身のIPアドレスの誤Banには特に注意が必要です。たとえば、SSHログインに失敗した回数がしきい値を超えると、自分の管理端末からの接続も遮断されてしまう恐れがあります。そのため、設定ファイルには自身のIPアドレスを明示的にホワイトリスト(ignoreip
)に登録しておきましょう。
DosやDDosには効果が薄い
Fail2Banは、不正ログインやブルートフォース攻撃など、ログに記録される特定の不審な動作を検出してIPアドレスを一時的にブロックするツールです。そのため、DoSやDDoS攻撃のように大量のリクエストでシステム資源を使い果たすタイプの攻撃にはあまり効果がありません。特にDDoS攻撃は攻撃元が多数に分散しているため、Fail2Banでは検知されにくく、検知しても膨大な数の攻撃を防ぎきれない可能性があります。