新規に契約したLinux VPSでSSHポートを外部に開放し、認証ログを確認してみてください。世界中から無数のBotが毎分のようにrootのパスワード総当たり(ブルートフォース)を試みているはずです。単純なパスワードを設定していると、いつサーバーを乗っ取られてもおかしくありません。
こうしたリスクを解消する定番のセキュリティツールがFail2banです。システムログを常時監視し、ログイン失敗を繰り返す不審なIPアドレスを検知すると、ファイアウォール(iptablesやnftables)に自動でルールを追加して該当IPからのアクセスを即座にブロックします。
1. クイックスタート:5分でSSH保護を導入・有効化する
Ubuntu/Debian系およびCentOS/AlmaLinux系を対象に、最短でセットアップする手順を解説します。
Fail2banのインストール
UbuntuまたはDebianの場合:
sudo apt update
sudo apt install -y fail2ban
RHEL/AlmaLinux/Rocky Linux系の場合(事前にEPELリポジトリの有効化が必要):
sudo dnf install -y epel-release
sudo dnf install -y fail2ban
カスタム設定ファイルの作成
Fail2banを運用する上で最も重要なルールは、デフォルトの/etc/fail2ban/jail.confを直接編集しないことです。パッケージアップデート時に変更内容が上書きされるため、必ずjail.localを作成して編集します。
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
SSH保護のクイック設定
使い慣れたテキストエディタで/etc/fail2ban/jail.localを開きます:
sudo nano /etc/fail2ban/jail.local
[sshd]ブロックを探すか、ファイルの末尾に以下の内容を追記します:
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = %(syslog_backend)s
maxretry = 5
findtime = 600
bantime = 3600
サービスの起動
ファイルを保存し、以下のコマンドでFail2banサービスを起動・自動起動化します:
sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban
SSH保護用Jailが正常に稼働しているかステータスを確認します:
sudo fail2ban-client status sshd
2. Fail2banの主要パラメータの詳細解説
基本的な防御を構築できたら、次は各パラメータの仕組みを理解し、運用環境に合わせて適切にチューニングしていきましょう。
デフォルトパラメータ(DEFAULTセクション)
jail.localにおける代表的な重要パラメータは以下の通りです:
- ignoreip: ブロック対象外とする信頼済みIPアドレスの一覧。オフィスの固定IP、自宅のグローバルIP、ローカルネットワーク帯(
127.0.0.1/8 ::1 192.168.1.0/24など)を指定します。 - bantime: 違反IPをアクセス遮断する時間(秒単位)。例えば
3600は1時間です。恒久的にブロックしたい場合は負の値(-1)を設定します。 - findtime: ログイン失敗回数をカウントする監視タイムウィンドウ(秒単位)。
- maxretry:
findtime内に許容する最大失敗回数。この回数を超えると対象IPがブラックリストに追加されます。
例:findtime = 600かつmaxretry = 3の場合、あるIPが10分以内にSSH認証を3回失敗すると、即座にbantimeで指定された時間だけアクセスがブロックされます。
JailとFilterのアーキテクチャ
Fail2banは主に2つの要素で成り立っています:
- Filter:
/etc/fail2ban/filter.d/に配置され、ログ内のログイン失敗行を検知するための正規表現(Regex)を定義します。 - Jail: 特定のサービスに対してFilterとAction(iptables/nftablesによる遮断やメール通知などの動作)を結びつける設定ブロックです。
3. 応用:NginxおよびWebサーバーの保護強化
Fail2banの対象はSSHポートだけにとどまりません。ディレクトリトラバーサルなどの脆弱性スキャンや、WordPress(wp-login.phpなど)をはじめとするWeb管理画面へのブルートフォース攻撃の防御にも威力を発揮します。
Nginxへの悪意あるURLスキャンをブロックする
/etc/fail2ban/jail.localを開き、機密ファイルを探し回って404や403エラーを連発するリクエストを遮断するJailを追加します:
[nginx-botsearch]
enabled = true
port = http,https
logpath = /var/log/nginx/access.log
maxretry = 3
findtime = 300
bantime = 86400
WordPressやWebアプリのログイン試行を防御する
認証エンドポイントへの連続POSTリクエストを検知するカスタムFilterを作成します。/etc/fail2ban/filter.d/nginx-login.confを作成します:
[Definition]
failregex = ^<HOST> -.* "POST /wp-login.php HTTP/.*" 200
^<HOST> -.* "POST /login HTTP/.*" 200
ignoreregex =
続いて、/etc/fail2ban/jail.localにJailブロックを追記します:
[nginx-login]
enabled = true
port = http,https
filter = nginx-login
logpath = /var/log/nginx/access.log
maxretry = 5
findtime = 600
bantime = 7200
設定をリロードして新しいJailを即時反映します:
sudo fail2ban-client reload
4. 本番環境での運用管理と実践的なTips
10台以上のLinux VPSを3年間運用してきた経験から言うと、本番環境への適用前には念入りな検証が不可欠です。以前、ホワイトリストの設定を忘れていたために、同僚がVPNやSSHのパスワード入力を誤り、業務のピーク時にオフィス全体のIPがFail2banにブロックされてしまった事例もありました。
日常の運用で役立つ基本コマンド
有効化されているJailの一覧とブロック中のIP数を確認:
sudo fail2ban-client status
sshdのJailで現在ブロックされているIP一覧を詳細表示:
sudo fail2ban-client status sshd
誤って自分やチームメンバーのIPをブロックしてしまった場合の解除コマンド:
sudo fail2ban-client set sshd unbanip 203.0.113.45
Fail2banの動作ログをリアルタイムで追跡・確認:
sudo tail -f /var/log/fail2ban.log
見落としがちな運用の重要ポイント
- オフィスや自宅のIPは必ずホワイトリストに登録する: 長い
bantimeを設定する前に、利用中のIP帯を確実にignoreipへ追加しておきましょう。 - SSHポート変更時の注意点: デフォルトの22番ポートから例えば2222番などに変更した場合、
jail.localの[sshd]ブロック内にあるport = 2222の更新も忘れないでください。更新を怠ると、Fail2banは存在しない22番ポートに対する遮断ルールを作り続け、新しいポートが無防備なままになります。 - 適用前に正規表現(Regex)をテストする: Fail2ban標準のテストコマンドを使い、作成したFilterが実際のログを正しくキャッチできているか確認してから本番に適用しましょう:
sudo fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-login.conf
Fail2banをマスターすることで、サーバーのリソースを無駄に消費することなく、Botnetによる機械的な攻撃の大半をプロアクティブに遮断できる強力な防御層を構築できます。

