CentOS Stream 9のVPSを契約した直後、まず何をすべきでしょうか?Webサーバーやデータベースのインストールを急いではいけません。統計によると、パブリックIPは平均してわずか3〜5分でボットネットの標的になります。ポート22に対して1時間に数千回の不正ログイン試行(総当たり攻撃)が行われることも珍しくありません。Fail2banは、こうした攻撃者を自動的にブロックする、非常に軽量かつ強力なツールです。
総当たり攻撃を阻止する3つのステップ(クイックスタート)
Fail2banはRHEL/CentOSのデフォルトのリポジトリには含まれていません。まず EPELリポジトリをインストールする必要があります。以下は、60秒で完了するクイックデプロイの手順です:
# 1. EPELリポジトリのインストール
sudo dnf install epel-release -y
# 2. Fail2banとFirewalldサポートパッケージのインストール
sudo dnf install fail2ban fail2ban-firewalld -y
# 3. サービスの有効化とシステム起動時の自動開始設定
sudo systemctl enable --now fail2ban
実行後、Fail2banの準備は整いました。しかし、デフォルト設定のままではまだ不十分です。SSHに対して真に効果を発揮させるために、いくつかの微調整が必要です。
CentOS Stream 9での動作メカニズムの変更点
多くの人がFail2banをファイアウォールそのものだと勘違いしていますが、実際にはログファイルを常に監視する「検査官」のようなものです。CentOS Stream 9では、システムはsystemd-journaldの使用を優先します。Fail2banは、テキストファイルである/var/log/secureを低速で読み取る代わりに、journalと直接通信するようになりました。これにより、ログが肥大化してもリソースを節約しつつ、ほぼ即座に反応することが可能になります。
黄金律:jail.confには触れないこと
実践的なアドバイスとして、/etc/fail2ban/jail.confを直接編集するのは絶対に避けてください。パッケージが更新されるたびにこのファイルは上書きされ、設定がすべて失われてしまいます。独自の設定を適用するには、jail.localファイルを作成して設定を上書きします:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo vi /etc/fail2ban/jail.local
SSH保護のための実践的な構成
jail.localファイルの[sshd]セクションを探し、セキュリティを最適化するために以下のように修正します:
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = systemd
maxretry = 3
findtime = 15m
bantime = 24h
- maxretry = 3: 3回までの失敗を許可。4回目でブロック(「仏の顔も三度まで」)。
- findtime = 15m: 15分以内に3回失敗した場合にのみブロック。
- bantime = 24h: 24時間の「投獄」。この時間は、ボットネットにIPを諦めさせるのに十分な長さです。
修正が完了したら、設定を適用するために再起動します:sudo systemctl restart fail2ban。
Firewalldとの統合とSELinuxエラーの解決
ここが最も重要な部分です。CentOS Stream 9では、SELinuxとFirewalldの動作が非常に厳格です。
SELinuxがFail2banをブロックする場合
5台の本番サーバーをCentOS 9に移行した際、Fail2banがSELinuxによってFirewalld의呼び出しをブロックされるケースに遭遇しました。その結果、IPは禁止リストに記録されているのに、ファイアウォールは開いたままという状態になります。確認するには、ausearch -m avc -ts recentコマンドを使用してください。dbusやfirewalldに関連するエラーが表示される場合、それが原因です。
Firewalldバックエンドの最適化
Fail2banを最もスムーズに連携させるには、rich-rulesを使用するように設定します。jail.localファイルの[DEFAULT]セクションに以下の行を追加してください:
[DEFAULT]
banaction = firewallcmd-rich-rules
banaction_allports = firewallcmd-rich-rules
rich-rulesを使用することで、禁止リストが個別に管理され、ファイアウォールのメインのルールセットが煩雑になるのを防げます。
IPの確認方法とブロック解除(Unban)
作業中、自分自身やクライアントを誤ってロックアウトしてしまうことがあります。そんな時の唯一の救世主がfail2ban-clientです。
有効な「刑務所(jail)」を確認する: fail2ban-client status
SSHのブラックリストを確認する: fail2ban-client status sshd
誤ってロックされたIPを救出する: fail2ban-client set sshd unbanip 1.2.3.4
サーバーを安全に保つためのヒント
- 常に個人のIPをホワイトリストに入れる: 自分の固定IPを
jail.localのignoreip行に追加してください。これはサーバーから締め出されないための保険です。 - デフォルトのSSHポートを変更する: ポートを22から2289のようなランダムな番号に変更します。これだけで、日々のボットスキャンを9割削減できます。
- ログをリアルタイムで監視する:
tail -f /var/log/fail2ban.logを試してみてください。見知らぬIPが次々と「無効化」されていくのを見るのは、安心感があり興味深いものです。
CentOS Stream 9でのFail2banの導入は難しくありません。肝心なのは、ツールが適切に実行権限を持てるようSELinuxへの対処法を知ることです。これらの実践的な知識が、パスワード試行攻撃からサーバーを守る一助となれば幸いです。

