Fail2Banは、ブルートフォース攻撃からサーバを保護するためのログ監視型の侵入防止システム(IPS)です。
本記事では、Ubuntu Server、AlmaLinux、Rocky Linuxそれぞれの環境におけるFail2Banのインストール手順を、わかりやすく解説します。
- Debian系
- Ubuntu Server
- RHEL系
- AlmaLinux
- Rocky Linux
Fail2Banを初めて導入する方にも理解しやすいように、用語解説から動作確認まで、段階的に理解できる構成となっています。
Fail2Banとは
Fail2Banは、不正アクセスの試行を検知し、自動的に該当IPアドレスをブロックすることでサーバのセキュリティを高めるログ監視型の侵入防止システム(IPS)です。不正なログイン試行や攻撃と見なされるアクセスが一定回数以上繰り返された場合に、攻撃元のIPアドレスを一時的または恒久的にブロックすることで、サーバーへの侵入リスクを大幅に低減します。特に、ブルートフォース攻撃への対策として広く利用されており、システム管理者やセキュリティエンジニアの間で高く評価されています。
Fail2Banの最大の特徴は、システムのログファイルをリアルタイムに監視し、そこに記録されたアクセスログに基づいて自動的に対処を行う点にあります。たとえば、SSHのログイン失敗が連続して記録されると、それをトリガーとして攻撃元のIPアドレスをブロックします。この動作は、「jail」と呼ばれる設定単位によって柔軟に制御でき、監視対象のサービスごとに異なる条件やアクションを指定することが可能です。
Fail2Banの基本的な仕組み
ログファイルを監視
指定されたサービス(例:SSH、Postfix、nginxなど)のログファイルを継続的に監視します。
攻撃パターンを検出
事前に定義された正規表現パターン(フィルタ)に基づき、不正アクセス(例:ログイン失敗の連続)を検出します。
攻撃元のIPアドレスをブロック
一定回数以上の不正アクセスがあったIPアドレスに対し、iptables
や firewalld
などのファイアウォールを介してアクセスを遮断します。
Fail2Banを導入するメリット
メリット | 解説 |
---|---|
自動化された防御 | 手動でブラックリスト管理をする必要がなく、リアルタイムで攻撃をブロックできます。 |
誤検知が少ない | フィルタルールは柔軟にカスタマイズ可能で、実運用に適した誤検知率の低い構成が可能です。 |
幅広いサービスに対応 | SSHだけでなく、Apache、Dovecot、ProFTPDなど多数のサービスに対応しています。 |
軽量でシンプル | Pythonベースで動作し、システムへの負荷も小さいため、低スペックなサーバでも導入可能です。 |
オープンソース・無料 | 低コストで導入することができます。 |
ブルートフォース攻撃の対策に有効
Fail2Banは、特にSSHやFTP、Webアプリケーションなどを対象としたブルートフォース攻撃に対して、極めて効果的な対策ツールです。
ブルートフォース攻撃とは、攻撃者が無数のパスワードを自動的に試行し、認証を突破しようとする手法です。脆弱な認証機構を狙われると短時間で侵入を許すリスクがあります。
たとえば、5分間に5回のログイン失敗が発生した際、そのIPアドレスを一時的にブロックすることで、攻撃者は数千回、数万回と試行を繰り返すことができず、侵入のリスクを大幅に低減できます。
Fail2Banで使用する用語
Fail2Banでは、多くの専門用語が用いられています。ここでは、Fail2Banを理解するために必要な主要用語を簡単に説明します。
用語 | 説明 |
---|---|
Jail | 攻撃を検知・対処するための監視単位。どのログを監視し、どのアクションを取るかを定義。 |
Filter | ログファイルから不正アクセスを検出するための正規表現ルールを定義。 |
Action | 不正アクセスを検出した際に実行する処理を定義。(例:IPアドレスのブロック、通知メールの送信など) |
Ban | 不正な動作を検出したIPアドレスに対してアクセス制限を行う。 |
Unban | 一定時間経過後または管理者の判断でアクセス制限を解除する。 |
Backend | ログの監視方法を指定。(例:systemd、polling など) |
Findtime | 不正アクセスの試行回数をカウントする時間。(Maxretry回の失敗が許容される時間) |
Maxretry | Banの対象となるまでに許容される失敗回数。(例:ログイン失敗など) |
Bantime | IPアドレスをBanする時間。 |
Jail(ジェイル)は、Fail2Banにおける最も重要な構成要素の一つであり、監視対象のサービス(例:SSH、Apache、Postfixなど)ごとの監視ルールを定義します。
インストール環境・前提条件
Fail2BanはPythonで開発されており、多くのLinuxディストリビューションに対応しています。本記事ではDebian系のUbuntu Server、およびRHEL系のAlmaLinux、Rocky Linuxを対象に解説しています。
なお、CentOSは公式サポートが終了しているため、対象外としております。
OS | バージョン |
---|---|
Ubuntu Server | 24.04.2 LTS |
AlmaLinux | 9.5 |
Rocky Linux | 9.5 |
Fail2Banは「ログファイルへのアクセス」「ファイアウォール設定」といった一般ユーザーには許可されていない操作を行うため、rootユーザー
またはそれに相当するsudo権限
が必要です。本記事では、Ubuntuはsudo権限
、AlmaLinuxとRocky Linuxは、rootユーザー
を使用します。
Ubuntu Server
$ cat /etc/os-release
PRETTY_NAME="Ubuntu 24.04.2 LTS"
AlmaLinux
# cat /etc/redhat-release
AlmaLinux release 9.5 (Teal Serval)
Rocky Linux
# cat /etc/redhat-release
Rocky Linux release 9.5 (Blue Onyx)
次のセクションでは、実際のインストール手順について解説します。
Fail2Banをインストール
Fail2Banのインストールは非常にシンプルですが、対象となるLinuxディストリビューションによって手順が異なります。ここでは、Debian系のUbuntu Server、およびRHEL系のAlmaLinux、Rocky Linuxへのインストール方法を解説します。
- Debian系
- Ubuntu Server
- RHEL系
- AlmaLinux
- Rocky Linux
Fail2Banのパッケージは比較的軽量で、依存関係も少ないため、インストールは1分程度で完了します。
Ubuntu Serverにインストール
Ubuntuの場合、Fail2Banは標準リポジトリに含まれているため、APTパッケージマネージャを使って簡単にインストールできます。
システムの最新化
古いパッケージとの互換性問題や依存関係のエラーを避けるため、システムを最新の状態にします。
$ sudo apt update
$ sudo apt upgrade
Fail2Banをインストール
Fail2BanはUbuntuの標準リポジトリに含まれているため、aptコマンド
を用いて、インストールします。
$ sudo apt install fail2ban
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
python3-pyasyncore python3-pyinotify whois
Suggested packages:
mailx monit sqlite3 python-pyinotify-doc
The following NEW packages will be installed:
fail2ban python3-pyasyncore python3-pyinotify whois
0 upgraded, 4 newly installed, 0 to remove and 1 not upgraded.
Need to get 496 kB of archives.
After this operation, 2,572 kB of additional disk space will be used.
Do you want to continue? [Y/n]
パッケージ情報を読み込んで、依存関係をチェックし、Fail2Banを動かすために必要なパッケージも自動インストールしてくれます。
インストール後の状態確認
インストール後、Fail2Banのサービスが立ち上がり、自動起動設定も有効になります。
$ sudo systemctl status fail2ban
● fail2ban.service - Fail2Ban Service
Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; enabled; preset: enabled)
Active: active (running) since Tue 2025-04-15 06:31:51 UTC; 2h 14min ago
〜 省略 〜
$ sudo systemctl is-enabled fail2ban
enabled
バージョンを確認
Ubuntu Server 24.04.2 LTSでは、Fail2Banのバージョン1.0.2がインストールされます。(2025年4月15日時点)
$ fail2ban-client -V
1.0.2
Fail2Banの稼働状況を確認
稼働中のjailの一覧など、全体の稼働状況を確認します。
$ sudo fail2ban-client status
Status
|- Number of jail: 1
`- Jail list: sshd
上記の通り、Ubuntu ServerにFail2Banをインストールすると、デフォルトでsshdのjailが稼働しています。
AlmaLinux、Rocky Linuxにインストール
AlmaLinux、およびRocky LinuxなどのRHEL系ディストリビューションでは、dnfコマンド
を使用します。ただし、Fail2Banは標準リポジトリに含まれていないため、EPEL(Extra Packages for Enterprise Linux)リポジトリを使う必要があります。
システムの最新化
まず、依存関係のトラブルを防ぐため、既存パッケージを更新します。
# dnf check-update
# dnf upgrade
EPELリポジトリの有効化
Fail2BanはEPEL(Extra Packages for Enterprise Linux)リポジトリに含まれているため、EPELリポジトリがシステムに登録されていて、有効になっているか確認します。
# dnf repolist all | grep epel
AlmaLinux、Rocky Linuxいずれも、初期状態ではEPELリポジトリが導入されていないため、EPELリポジトリをインストールします。
# dnf install epel-release
Fail2Banをインストール
Fail2Banをインストールします。依存関係のあるパッケージも同時にインストールされます。
# dnf install fail2ban
EPELリポジトリを導入していない状態でFail2Banをインストールすると、エラーになります。
# dnf install fail2ban
引数に一致する結果がありません: fail2ban
エラー: 一致するものが見つかりません: fail2ban
インストール後の状態確認
Ubuntu Serverとは異なり、AlmaLinux、Rocky Linuxの場合、インストール直後の状態ではFail2Banは起動しておらず、自動起動設定もされていません。
# systemctl status fail2ban
○ fail2ban.service - Fail2Ban Service
Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; disabled; preset: disabled)
Active: inactive (dead)
Docs: man:fail2ban(1)
# systemctl is-enabled fail2ban
disabled
サービスの起動と自動起動設定
手動でFail2Banを起動し、OS起動時に自動的にサービスが立ち上がるよう設定します。
Fail2Banを起動
# systemctl start fail2ban
自動起動を設定
# systemctl enable fail2ban
--nowオプション
を使うと、サービスの自動起動設定と即時起動が一度に行えます。
# systemctl enable --now fail2ban
サービス起動後の状態確認
# systemctl status fail2ban
● fail2ban.service - Fail2Ban Service
Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; enabled; preset: disabled)
Active: active (running) since Tue 2025-04-15 17:28:54 JST; 45s ago
〜 省略 〜
# systemctl is-enabled fail2ban
enabled
active (running)
のステータスが表示され、正常に起動していることが確認できます。また、自動起動も有効になっています。
バージョンを確認
2025年4月15日現在、AlmaLinux、Rocky Linuxいずれも「1.1.0」がインストールされます。
# fail2ban-client -V
1.1.0
Fail2Banの稼働状況を確認
インストール後のFail2Banの稼働状況を確認します。
# fail2ban-client status
Status
|- Number of jail: 0
`- Jail list:
Ubuntu Serverとは異なり、インストール後の初期状態では何も設定されていないことが確認できます。
Fail2Banの主な構成
設定ファイル
Fail2Banの設定ファイルは、/etc/fail2banディレクトリ
に格納されており、特に重要なのがfail2ban.conf
とjail.conf
、およびカスタム設定用のjail.local
です。
Fail2Banの主な設定ファイル
ファイル | 役割 |
---|---|
fail2ban.conf | Fail2Banの基本的な動作設定を定義 例:ログレベルやログファイル出力先など |
jail.conf | jailのデフォルト設定(どのサービスを監視し、どんな条件で対処するか) |
jail.d/*.conf | jail単位のカスタム設定 |
filter.d/*.conf | 不正アクセスをログから検出するためのルールを定義 |
action.d/*.conf | 不正アクセスを検知した際に実行するアクションを定義 |
fail2ban.conf
はログ出力先やログレベルなど、全体的な動作に関わる設定を含んでいます。一方、jail.conf
は各種サービス(SSH、Postfix、Apacheなど)に対する監視設定を記述しています。
Fail2Banにはjail.conf
という設定ファイルは存在しますが、直接編集することは推奨されていません。理由としては、パッケージアップデート時にこのファイルが上書きされる可能性があるためです。そのため、jail.local
を作成し、こちらにカスタム設定を行います。
- jail.conf:デフォルト設定(※編集は非推奨)
- jail.local:カスタム設定を記述し、jail.confを上書きする
コマンド
Fail2Banのコマンドは、/usr/binディレクトリ
に格納されています。
Fail2Banの各種コマンド
コマンド | 用途 |
---|---|
fail2ban-client | Fail2Banの制御・管理を行う主要なインターフェース |
fail2ban-server | ログ監視やBan処理を行うバックグラウンドプロセス |
fail2ban-regex | フィルター設定(正規表現)が意図した通りに機能するかを検証するためのコマンド |
fail2ban-python | Fail2Banが内部で使うPythonインタプリタ |
fail2ban-testcases | ユニットテスト用 |
Fail2Banの運用において、日常的に使用するコマンドはfail2ban-client
です。このクライアントツールはfail2ban-server
と通信を行い、各種設定や制御を行います。
ログファイル
Fail2Banのログは通常、/var/log/fail2ban.log
に出力されます。このファイルには、どのIPアドレスが、どのjailで、どのような理由でBanされたのかが記録されています。
Fail2Banの動作テスト
Fail2Banの挙動を検証するためには、意図的に失敗したログインを試行する方法が最も確実です。例えば、sshでわざと誤ったパスワードで数回ログインを試みることで、Fail2Banがログを検知し、設定した閾値に達した時点でアクセス元IPが遮断されるかどうかを観察します。
検証環境
ssh実行マシン | Fail2Ban実行マシン | |
---|---|---|
OS | Kali Linux 2025.1 | Ubuntu Server 24.04.1 LTS |
IPアドレス | 192.168.10.11 | 192.168.10.102 |
$ ssh -l root 192.168.10.102
ssh: connect to host 192.168.10.102 port 22: Connection refused
パスワードを5回間違えたため、接続が拒否されました。
Fail2Ban実行マシン(Ubuntu Server)
$ 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: 0
|- Total banned: 1
`- Banned IP list:
$ more /var/log/fail2ban.log
〜 省略 〜
2025-04-16 13:48:31,070 fail2ban.server [768]: INFO Starting Fail2ban v1.0.2
2025-04-16 13:48:31,070 fail2ban.observer [768]: INFO Observer start...
2025-04-16 13:48:31,919 fail2ban.database [768]: INFO Connected to fail2ban persistent database '/var/lib/fail2ban/fail2ban.sqlite3'
2025-04-16 13:48:31,920 fail2ban.jail [768]: INFO Creating new jail 'sshd'
2025-04-16 13:48:38,954 fail2ban.jail [768]: INFO Jail 'sshd' uses systemd {}
2025-04-16 13:48:38,955 fail2ban.jail [768]: INFO Initiated 'systemd' backend
2025-04-16 13:48:38,957 fail2ban.filter [768]: INFO maxLines: 1
2025-04-16 13:48:38,983 fail2ban.filtersystemd [768]: INFO [sshd] Added journal match for: '_SYSTEMD_UNIT=sshd.service + _COMM=sshd'
2025-04-16 13:48:38,983 fail2ban.filter [768]: INFO maxRetry: 5
2025-04-16 13:48:38,983 fail2ban.filter [768]: INFO findtime: 600
2025-04-16 13:48:38,983 fail2ban.actions [768]: INFO banTime: 600
2025-04-16 13:48:38,983 fail2ban.filter [768]: INFO encoding: UTF-8
2025-04-16 13:48:39,166 fail2ban.jail [768]: INFO Jail 'sshd' started
2025-04-16 13:48:50,051 fail2ban.filtersystemd [768]: INFO [sshd] Jail is in operation now (process new journal entries)
2025-04-16 20:04:15,582 fail2ban.filter [768]: INFO [sshd] Found 192.168.10.11 - 2025-04-16 20:04:15
2025-04-16 20:05:53,118 fail2ban.filter [768]: INFO [sshd] Found 192.168.10.11 - 2025-04-16 20:05:52
2025-04-16 20:05:58,867 fail2ban.filter [768]: INFO [sshd] Found 192.168.10.11 - 2025-04-16 20:05:58
2025-04-16 20:06:03,118 fail2ban.filter [768]: INFO [sshd] Found 192.168.10.11 - 2025-04-16 20:06:02
2025-04-16 20:06:14,368 fail2ban.filter [768]: INFO [sshd] Found 192.168.10.11 - 2025-04-16 20:06:13
2025-04-16 20:06:14,536 fail2ban.actions [768]: NOTICE [sshd] Ban 192.168.10.11
2025年4月16日 20時6分、192.168.10.11からのsshログインに5回失敗したため、Fail2Ban によってブロックされたことが確認できます。