VPSの不正アクセスを防ぐ!Fail2Banのインストールと設定を徹底解説

せっかく購入したVPSでOSをインストールし、ドメインのDNS設定を完了した瞬間、あなたのサーバーは世界中の数万、数百万という自動実行スクリプトの標的になります。これは決して大げさな話ではありません。

2026年現在、単にSSHポートを変更したり、管理パネルを導入したりするだけでは十分な対策とは言えません。もし /var/log/auth.log を確認すれば、世界中から届くログイン試行(ブルートフォース攻撃)の履歴が画面を埋め尽くしているはずです。たとえパスワードログインを禁止していても、これらの悪意あるリクエストはサーバーのCPUやネットワークコネクションを無駄に消費し続けます。

大切なサーバーがスキャナーによってダウンさせられたり、踏み台にされたりするのを防ぐため、今回は実践的な防御ソリューションであるFail2Banのインストールと設定を徹底的に解説します。

この手法は、SSHの総当たり攻撃を正確にブロックするだけでなく、Nginxと連携して悪質なCC攻撃やWordPressへの攻撃からも保護します。具体的なデータと、すぐに使える設定ファイルを用いて、サーバー管理者の悩みの種である不正スキャンの問題を根本から解決しましょう。

基本知識:Fail2Banの仕組みを理解する

インターネット公開環境において、悪意あるスキャンは主に以下の2つのパターンに分けられます。

  1. ポートスキャンとSSHブルートフォース: ボットが22番などのポートに対して、辞書攻撃を用いて24時間体制でログインを試みます。
  2. Web脆弱性とCC攻撃スキャン: WordPressなどの特定プログラムを狙い、wp-login.php や機密ディレクトリをスキャンしたり、高頻度のリクエスト(CC攻撃)でデータベースのリソースを枯渇させたりします。

Fail2Banのロジックは非常にスマートです。本質的にはログベースの侵入防御システム (IPS)として機能します。SSH、Nginx、システムログなどのログファイルをリアルタイムで監視し、特定のIPアドレスが設定された時間(findtime)内に規定の回数(maxretry)を超えて悪意ある行動をとった場合、システムのファイアウォール(iptables、ufw、またはfirewalld)と連携して、そのIPからの通信をネットワーク層で遮断(Drop)し、一定期間(bantime)「ブラックリスト」へ隔離します。

🔥 Fail2Ban コア防御パラメータ一覧
推奨データ
パラメータ名 機能説明 単位/形式 推奨セキュリティ値 実戦での役割
findtime 統計サイクル 秒 (s) / 分 (m) 10m (600s) 何分間の攻撃をカウント対象とするか
maxretry 最大試行回数 数値 3 ~ 5 この回数を超えると即ブロック
bantime 遮断時間 時間 (h) / 日 (d) 24h または 48h アクセス禁止処分の継続時間

インストールと基本設定の注意点

DebianやUbuntuベースのVPSであれば、インストールは非常に簡単です。

1. クイックインストール

sudo apt update
sudo apt install fail2ban -y

2. 設定ファイルの「暗黙のルール」(トラブル回避)

インストール後、Fail2Banの設定ファイルは /etc/fail2ban/ ディレクトリに保存されます。初心者が陥りやすいミスは、jail.conf ファイルを直接編集することです。

正しい作法: システムはまず jail.conf を読み込み、その次に jail.local を読み込んで、同名の設定があれば後者で上書きします。ソフトウェアがアップデートされる際、jail.conf は上書きされてしまいますが、jail.local に書いた設定は保護されます。

したがって、まずは以下のコマンドでローカル設定ファイルを作成しましょう。

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

3. グローバルポリシーの編集

エディタで /etc/fail2ban/jail.local を開き、 [DEFAULT] セクションでセキュリティの基準値を設定します。

Fail2Banの基本設定画面
  • ignoreip = 127.0.0.1/8 ::1 自分のPCのグローバルIP (誤ブロック防止。非常に重要です)
  • bantime = 24h (ペナルティ期間)
  • findtime = 10m (統計対象時間)
  • maxretry = 3 (許容回数)

実践1:SSH最強の防御コンボ

「パスワードログインを禁止して公開鍵(SSH Key)認証にしていれば、Fail2Banは不要だ」と考える人がいますが、これは危険な認識です。鍵認証のみにしていても、悪意あるスクリプトはTCP接続を試み続け、auth.log に膨大なログが生成され、SSHサーバーはハンドシェイク処理のためにリソースを消費し続けます。

推奨される防御コンボ:SSHデフォルトポートの変更 + Rootパスワードログインの無効化 + 公開鍵認証 + Fail2Banによる最終防御。 最初の3つで攻撃の成功率を99%削減し、Fail2Banが残りの不要なリクエストを遮断することで、サーバー負荷を最小限に抑えます。

jail.local 内の [sshd] ボックスを探し、有効化します。

[sshd]
enabled = true
port    = 2222  # SSHポートを変更している場合はその値を指定
logpath = %(sshd_log)s
backend = %(sshd_backend)s
maxretry = 3

実践2:WordPressの保護とプリセットルール

WordPressの wp-login.php へのブルートフォースや XML-RPC 攻撃に対して、最新のFail2Banにはあらかじめ定義されたフィルタルールが備わっています。古いマニュアルにあるような複雑な正規表現を自分で書く必要はありません。

jail.local の末尾に以下を追記するだけで有効になります。

[wordpress]
enabled = true
port = http,https
filter = wordpress  # 標準搭載のルールを呼び出し
logpath = /var/log/nginx/access.log # お使いの環境に合わせてログパスを確認してください
maxretry = 5
findtime = 10m
bantime = 24h

実践3:Nginx CC攻撃と悪質なクローラー対策

これは多くの初心者向けガイドで見落とされがちなポイントです。CC攻撃(Challenge Collapsar)は、大量のボットを使って正常なユーザーを装い、高頻度でサイトにアクセスすることでPHPやデータベースをダウンさせます。Nginxの limit_req モジュールとFail2Banを組み合わせることで、これに対処できます。

1. 高頻度リクエストの遮断

Nginxの limit_req が作動すると、error.log に記録が残ります。このログを監視して悪質なIPを排除します。

[nginx-limit-req]
enabled = true
port    = http,https
filter  = nginx-limit-req
logpath = /var/log/nginx/error.log
findtime = 1m
maxretry = 10  # 1分間に10回リミットにかかったIPを即ブロック
bantime = 24h

2. 脆弱性スキャン(404エラー)への対応

ハッカーは機密ファイル(.env, backup.zip など)を探すために網羅的なスキャンを行います。これにより大量の404エラーが発生するため、これらをトリガーにしてブロックします。

[nginx-botsearch]
enabled = true
port     = http,https
filter   = nginx-botsearch
logpath  = /var/log/nginx/access.log
maxretry = 3

設定後、sudo systemctl restart fail2ban でサービスを再起動します。sudo fail2ban-client status nginx-limit-req と入力すれば、現在何件の攻撃がブロックされているか確認できます。

運用のコツと多層防御戦略

セキュリティ設定で最も避けるべきは「過剰な設定」と「戦略の欠如」です。運用における鉄則を2つお伝えします。

💡 VPS運用のヒント:

  • 永久BANを避ける (bantime = -1): 初心者は永久にブロックしたがりますが、これは推奨されません。現代のマルチコアCPUでは数万条のファイアウォールルールを処理する負荷はわずかですが、ルールが肥大化しすぎると誤認時の調査が困難になり、自動解除もされません。 通常は24~48時間のブロックで、ボットは「コストがかかりすぎる」と判断して諦めます。
  • 「多層防御」の考え方: Fail2Banはアプリケーション層で動作します。もし数百Gbps規模のDDoS攻撃を受けた場合、Fail2Banだけでは防げません(ネットワーク帯域自体が埋まるため)。正しい戦略は: DDoSプロテクションを備えたデータセンターを選び、ネットワーク層での大規模クリーンニングを行い、その上でFail2Banを用いてCC攻撃やSSHスキャンのような「精密な攻撃」を排除することです。

この対策をサーバーに施すだけで、あなたのウェブサイトのセキュリティレベルは、何も対策をしていない大多数のサーバーよりも格段に向上します。

記事の終わり
 0
コメント(コメントはまだありません)