インターネット上に公開したVPSや自宅サーバーのSSHポート(22番など)には、世界中からボットによる総当たり攻撃(ブルートフォースアタック)や辞書攻撃が24時間頻繁に仕掛けられます。
SSHの公開鍵認証やパスワード認証の無効化を行うだけでも侵入は防げますが、認証失敗のログが大量に記録され、サーバーのリソースや帯域を無駄に消費してしまいます。
そこで今回は、認証失敗を繰り返す不正なIPアドレスを自動的に検出し、ファイアウォール(firewalld)で一定時間アクセスを遮断(BAN)してくれる定番セキュリティツール「Fail2ban」をAlmaLinux 10環境に導入する手順を説明します。
本記事は、サーバーの初期設定等であらかじめ「SELinuxを無効化(Disabled)」している環境を前提としています。
作業工程
作業工程は下記のとおりです。
- EPELリポジトリの有効化とFail2banのインストール
- 設定ファイル(jail.local)の作成
- 全般設定([DEFAULT]):BAN時間、試行回数、除外IPなど
- firewalld連携設定(banaction = firewallcmd-rich-rules)
- systemdログ監視設定(backend = systemd)
- SSH保護設定([sshd])の有効化
- 設定ファイルの書式・反映内容チェック(fail2ban-client --test / -d)
- Fail2banの起動と自動起動設定
- 動作確認とステータス確認(fail2ban-client & firewalld)
- よく使う運用コマンド(手動BAN解除・手動BAN・ログ確認)
EPELリポジトリの有効化とFail2banのインストール
Fail2banはAlmaLinux 10の標準リポジトリ(BaseOS / AppStream)には含まれていないため、拡張パッケージを提供する「EPEL(Extra Packages for Enterprise Linux)」リポジトリを追加した上でインストールを行います。
EPELリポジトリの追加
「dnf」コマンドを使用してEPELリポジトリをインストールします。
sudo dnf install -y epel-release
Fail2banのインストール
「Fail2ban」本体に加えて、AlmaLinuxの標準ファイアウォール(firewalld)と連携させるためのパッケージ「fail2ban-firewalld」を一緒にインストールします。
sudo dnf install -y fail2ban fail2ban-firewalld
「fail2ban-firewalld」パッケージを導入することで、firewalldの「リッチルール(Rich Rule)」機能を使って効率的に不正IPを遮断できるようになります。
設定ファイル(jail.local)の作成
Fail2banの設定は「/etc/fail2ban」ディレクトリ配下で行います。
最初から用意されている「jail.conf」は、パッケージの更新時に上書きされる可能性があるため、直接編集は行いません。
設定を行う場合は、ローカル設定ファイルである「jail.local」を新規作成して記述するのが「Fail2ban」の仕様となっています。
sudo vi /etc/fail2ban/jail.local
以下の内容を記述します。
記載している設定内容(除外するIPアドレス、検知期間、試行回数、遮断時間など)はあくまでも設定の一例です。
ご自身のサーバー環境やセキュリティ方針に合わせて自由に調整してください。(各項目の意味や調整の目安は後述の「主要な設定項目の解説」を参照してください)
[DEFAULT] # 監視から除外するIPアドレス(ホワイトリスト) # 自身の管理用PCの固定IPやローカルIPがある場合はスペース区切りで追加 ignoreip = 127.0.0.1/8 ::1 # 不正アクセスを検知する期間(10分間) findtime = 10m # 期間内に許容する最大失敗回数(5回失敗でBAN) maxretry = 5 # アクセスを遮断(BAN)する時間(1時間) # 1d(1日)、1w(1週間)などの単位も指定可能 bantime = 1h # systemd-journaldからログを直接読み取る設定(rsyslog未導入環境にも完全対応) backend = systemd # firewalldのリッチルール機能を使用して遮断 banaction = firewallcmd-rich-rules banaction_allports = firewallcmd-rich-rules [sshd] # SSHの保護を有効化 enabled = true # SSHの待ち受けポート(デフォルトの22番以外に変更している場合はそのポート番号を指定) port = ssh
主要な設定項目の解説
[DEFAULT] セクション(全体共通設定)
- ignoreip
-
Fail2banによるBANの対象外とするIPアドレス(ホワイトリスト)を指定します。
「127.0.0.1/8 ::1」(ループバックアドレス)は必須です。
加えて、自宅やオフィスの固定グローバルIP、社内LANのIP範囲などをスペース区切りで指定しておくと、万が一自分がパスワードを打ち間違えた際にサーバーから締め出されるのを防ぐことができます。 - findtime と maxretry
-
「どのくらいの期間内に、何回失敗したら攻撃とみなすか」を定義します。
上記の設定例では、「findtime = 10m」と「maxretry = 5」に設定しているため、「10分間に5回認証に失敗した場合」に遮断(BAN)が発動します。 - bantime
-
アクセスを拒否(遮断)し続ける時間を指定します。
秒単位(例: 3600)のほか、「10m」(10分)「1h」(1時間)「1d」(1日)「1w」(1週間)といった単位指定が可能です。
※一度BANされたら二度とアクセスさせない「恒久BAN」を行いたい場合は、「-1」を指定します。 - backend = systemd
-
AlmaLinux 10の最小構成環境では、従来のSyslogデーモン(rsyslog)が導入されておらず、「/var/log/secure」ファイルが存在しない場合があります。
「backend = systemd」を指定することで、Fail2banが直接「systemd-journald」の認証ログを監視できるようになり、ログファイルに依存せず確実に攻撃を検知できます。 - banaction = firewallcmd-rich-rules
-
特定のポート(例:SSHの22番ポートなど)を対象に遮断を行う際のアクションを指定します。
AlmaLinuxの標準ファイアウォール「firewalld」のリッチルール機能を使ってIPアドレスの遮断を実行するため、nftablesと統合されたfirewalld環境で推奨される設定です。 - banaction_allports = firewallcmd-rich-rules
-
特定のポートに限定せず、すべてのポートへのアクセスを一括で遮断するJail(例:BANを繰り返す再犯IPを長期遮断する「recidive」など)が動作する際に使われるアクションです。
「banaction」と同じくfirewalldのリッチルールを指定しておくことで、将来的に全ポート遮断のルールを追加した際もfirewalldで統一して遮断処理を行えます。
[sshd] セクション(SSH保護設定)
- enabled = true
- SSHに対する保護(Jail)を有効化します。
- port = ssh
-
監視対象のポート番号を指定します。
標準の22番ポートを使用している場合は「port = ssh」(または22)のままで構いませんが、もしセキュリティ対策としてSSHの待受ポートを変更している場合(例: 10022番など)は、「port = 10022」のように変更したポート番号を記述してください。
設定ファイルの書式チェック
設定ファイルの作成が完了したら、サービスを起動する前に構文エラー(INIの文法ミスや存在しないアクション・フィルタの指定など)がないかチェックを行います。
sudo fail2ban-client --test
問題がなければ以下のように表示されます。
OK: configuration test is successful
もし文法ミスやアクション名の指定誤りがある場合は、エラーメッセージとともに該当のファイル名や設定箇所が出力されますので、内容を確認して修正してください。
設定値が正しく反映されているか確認する場合(-d オプション)
「--test」は構文エラーやアクションの存在チェックには有効ですが、Fail2banの仕様上、設定項目名(キー)のスペルミス(例:「maxretry」を「maxrety」と誤記)や、セクション名・有効化設定の誤記があってもエラーにならず無視されて「OK」と判定されてしまいます。
設定した内容がスペルミスで無視されず、意図通りに読み込まれているかを確認したい場合は、「-d」オプションを使用します。
サービス起動前の状態でも設定ファイルを直接読み込み、Fail2banが実際に適用する設定一覧をダンプ表示して確認できます。
sudo fail2ban-client -d | grep sshd
出力結果の中に、設定した「maxretry」「findtime」「bantime」「ignoreip」などの値が正しく反映されているかを確認してください。
['add', 'sshd', 'systemd'] ### 中略 ### ['set', 'sshd', 'maxretry', 5] ['set', 'sshd', 'maxmatches', 5] ['set', 'sshd', 'findtime', '10m'] ['set', 'sshd', 'bantime', '1h'] ['set', 'sshd', 'ignorecommand', ''] ['set', 'sshd', 'addignoreip', '127.0.0.1/8', '::1'] ['set', 'sshd', 'logencoding', 'auto'] ['set', 'sshd', 'addaction', 'firewallcmd-rich-rules'] ### 以下省略 ###
※なお、Fail2banサービス起動後であれば、「sudo fail2ban-client get sshd maxretry」のように「get」サブコマンドを使うことで、現在有効になっている設定値を個別に確認することも可能です。
Fail2banの起動と自動起動設定
設定ファイルの書式チェックで問題がなければ、Fail2banサービスを起動し、サーバー再起動時にも自動で立ち上がるように有効化(自動起動の登録)を行います。
sudo systemctl enable --now fail2ban
サービスが正常に「active (running)」で稼働しているかステータスを確認します。
sudo systemctl status fail2ban
● fail2ban.service - Fail2Ban Service
Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; enabled; preset: disabled)
Active: active (running) since Sun 2026-11-08 19:40:00 JST; 10s ago
...
緑色で「active (running)」と表示されていれば、正常に起動しています。
動作確認とステータス確認
Fail2banが正しくJail(監視ルール)を読み込んで動作しているかを専用ツール「fail2ban-client」で確認します。
全体の稼働ステータス確認
sudo fail2ban-client status
Status |- Number of jail: 1 `- Jail list: sshd
「Jail list」に「sshd」が表示されていれば、SSH監視が正しく有効化されています。
sshd Jailの詳細ステータス確認
現在検知されている失敗回数や、実際にBANされているIPアドレスの一覧を確認するには、Jail名を指定して実行します。
sudo fail2ban-client status sshd
Status for the jail: sshd |- Filter | |- Currently failed: 0 | |- Total failed: 10 | `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd + _COMM=sshd-session `- Actions |- Currently banned: 1 |- Total banned: 3 `- Banned IP list: xxx.xxx.xxx.xxx
悪質な総当たり攻撃が検知されると、「Currently banned(現在BAN中の数)」が増加し、「Banned IP list」に遮断されたIPアドレスがスペース区切りで記録されます。
firewalld側での遮断ルールの確認
実際にIPアドレスがBANされると、firewalldの「リッチルール」に拒否設定が自動追加されます。以下のコマンドでfirewalld側の状態も確認できます。
sudo firewall-cmd --list-rich-rules
BANされているIPが存在する場合、以下のようなルールが自動的に表示されます。
rule family="ipv4" source address="xxx.xxx.xxx.xxx" port port="ssh" protocol="tcp" reject type="icmp-port-unreachable"
よく使う運用・管理コマンド
Fail2ban運用時によく使用する実用的なコマンドをまとめました。
設定ファイルを再読み込みする(reload)
「jail.local」の内容を書き換えた後は、以下のコマンドで設定を再読み込み(reload)して反映させます。
sudo fail2ban-client reload
「sudo systemctl reload fail2ban」を実行しても、内部的には「fail2ban-client reload」が呼び出されるため同様の処理が行われます。
ただし、「fail2ban-client reload sshd」のように特定のJailだけを指定して再読み込みしたり、設定ミスがあった際に具体的なエラー内容をその場で確認しやすい点では「fail2ban-client」の方が便利です。
なお、「systemctl restart fail2ban」による再起動では、サービス停止時に「firewalld」上の遮断ルールがいったん解除されて起動時に再登録されるため、現在BAN中の状態を維持したまま安全に設定を反映できる「reload」の使用が推奨されます。
誤ってBANされたIPを手動で解除する(unbanip)
自分自身や管理者のIPアドレスがパスワード誤入力等で誤ってBANされてしまった場合は、サーバーのコンソール(VPSのWeb管理画面コンソール等)から以下のコマンドで即座にBANを解除できます。
sudo fail2ban-client set sshd unbanip 遮断を解除したいIPアドレス
実行例です。
sudo fail2ban-client set sshd unbanip xxx.xxx.xxx.xxx 1
実行後に「1」が表示されれば解除成功です。
一方、指定したIPアドレスがすでに自動解除済み(bantime経過後など)であったり、IPアドレスの入力間違い等でBANリストに存在しない場合は、以下のように「0」(解除対象なし)が表示されます。
sudo fail2ban-client set sshd unbanip xxx.xxx.xxx.xxx 0
なお、Jail名(sshdなど)を打ち間違えた場合は「Sorry but the jail '〇〇' does not exist」といったエラーが出力されます。
sudo fail2ban-client set ssshd unbanip xxx.xxx.xxx.xxx
2026-11-10 21:39:01,664 fail2ban [47474]: ERROR NOK: ('ssshd',)
Sorry but the jail 'ssshd' does not exist
また、Fail2banサービス自体が停止している場合は、ソケットへの接続エラーが出力されます。
sudo fail2ban-client set sshd unbanip xxx.xxx.xxx.xxx 2026-11-10 21:42:10,416 fail2ban [47506]: ERROR Failed to access socket path: /var/run/fail2ban/fail2ban.sock. Is fail2ban running?
特定の迷惑IPを手動で即時BANする(banip)
明らかに不審な接続を試みているIPアドレスを、試行回数の上限に達するのを待たずに手動で即時BANしたい場合は以下のコマンドを実行します。
sudo fail2ban-client set sshd banip 遮断したいIPアドレス
実行例です。実行後に「1」が表示されれば登録成功です。
sudo fail2ban-client set sshd banip xxx.xxx.xxx.xxx 1
また、単一のIPアドレスだけでなく、CIDR表記(例:xxx.xxx.xxx.0/24)を指定することでネットワーク単位でまとめてBANすることも可能です(解除する際も同様にCIDR表記を指定します)。
sudo fail2ban-client set sshd banip xxx.xxx.xxx.0/24 1
「banip」で手動登録したIPやネットワークも、設定した「bantime」(本記事の例では1時間)が経過すると自動的に解除されます。
特定のネットワークを恒久的に遮断したい場合は、Fail2banではなくfirewalld側の永続設定(--permanent)でブロックすることをおすすめします。
手動BANが反映されたか確認する方法
手動でBANしたIPアドレスが正しく遮断リストに登録されているかは、以下の方法で確認できます。
fail2ban-clientで確認する場合
sshd Jailのステータスを表示し、「Actions」内の「Banned IP list」に指定したIPアドレスが追加されているかを確認します。
sudo fail2ban-client status sshd
Status for the jail: sshd ... `- Actions |- Currently banned: 1 |- Total banned: 1 `- Banned IP list: xxx.xxx.xxx.xxx
firewalld側で確認する場合
firewalldのリッチルール一覧を表示し、指定したIPアドレスに対する拒否ルールが追加されているかを確認します。
sudo firewall-cmd --list-rich-rules
rule family="ipv4" source address="xxx.xxx.xxx.xxx" port port="ssh" protocol="tcp" reject type="icmp-port-unreachable"
Fail2banの動作ログを確認する
Fail2banがいつ、どのIPアドレスを攻撃とみなしてBANしたのか(あるいはBANを解除したのか)のログは「/var/log/fail2ban.log」に記録されます。
sudo tail -f /var/log/fail2ban.log
ログの出力例です。
2026-11-08 19:40:12,345 fail2ban.filter [1234]: INFO [sshd] Found xxx.xxx.xxx.xxx - 2026-11-08 19:40:12 2026-11-08 19:41:05,678 fail2ban.actions [1234]: NOTICE [sshd] Ban xxx.xxx.xxx.xxx 2026-11-08 20:41:05,678 fail2ban.actions [1234]: NOTICE [sshd] Unban xxx.xxx.xxx.xxx
「Found」で認証失敗が検知され、設定した失敗回数(maxretry)に達すると「Ban」が実行され、設定時間(bantime)が経過すると「Unban」で自動解除される流れが分かります。
まとめ
以上で、AlmaLinux 10におけるFail2banの導入とSSH防御設定は完了です。
AlmaLinux 10では、「backend = systemd」でsystemd-journaldから直接ログを監視し、EPELリポジトリの「fail2ban-firewalld」パッケージでfirewalldと連携させることで、強固なアクセス遮断体制を構築できます。
もちろん、Fail2banだけに頼るのではなく、以下のようなSSH自体の基本的なセキュリティ対策と組み合わせることで、より堅牢で安心なサーバー運用が可能になります。
- SSHポート番号の変更:デフォルトの22番ポートから別のポート番号に変更し、無差別なボット攻撃の標的から外す
- パスワード認証の無効化(公開鍵認証への完全移行):パスワードでのログインを禁止し、強固な鍵認証のみを許可することで総当たり攻撃を根本から防ぐ
- rootログインの禁止:管理者(root)での直接SSHログインを禁止し、一般ユーザー経由でのみアクセスを許可する
コメント