【AlmaLinux 10】Fail2banのインストールとSSH保護設定

記事内に広告が含まれています。

インターネット上に公開したVPSや自宅サーバーのSSHポート(22番など)には、世界中からボットによる総当たり攻撃(ブルートフォースアタック)や辞書攻撃が24時間頻繁に仕掛けられます。

SSHの公開鍵認証やパスワード認証の無効化を行うだけでも侵入は防げますが、認証失敗のログが大量に記録され、サーバーのリソースや帯域を無駄に消費してしまいます。

そこで今回は、認証失敗を繰り返す不正なIPアドレスを自動的に検出し、ファイアウォール(firewalld)で一定時間アクセスを遮断(BAN)してくれる定番セキュリティツール「Fail2ban」をAlmaLinux 10環境に導入する手順を説明します。

本記事は、サーバーの初期設定等であらかじめ「SELinuxを無効化(Disabled)」している環境を前提としています。

作業工程

作業工程は下記のとおりです。

  1. EPELリポジトリの有効化とFail2banのインストール
  2. 設定ファイル(jail.local)の作成
    • 全般設定([DEFAULT]):BAN時間、試行回数、除外IPなど
    • firewalld連携設定(banaction = firewallcmd-rich-rules)
    • systemdログ監視設定(backend = systemd)
    • SSH保護設定([sshd])の有効化
  3. 設定ファイルの書式・反映内容チェック(fail2ban-client --test / -d)
  4. Fail2banの起動と自動起動設定
  5. 動作確認とステータス確認(fail2ban-client & firewalld)
  6. よく使う運用コマンド(手動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ログインを禁止し、一般ユーザー経由でのみアクセスを許可する

コメント

タイトルとURLをコピーしました