Linuxでfail2banを使った不正アクセス対策

Linuxでfail2banを使った不正アクセス対策

Linuxサーバーをインターネットへ公開すると、SSH、Webログイン、メール、各種管理画面に対して機械的な総当たりや不正アクセス試行がかなり高い頻度で飛んでくる。ファイアウォールだけでは「正しいポートへ大量に試す」攻撃を十分に抑えきれないことも多く、そこで役立つのがfail2banになる。fail2banは、認証失敗などのログを監視し、一定回数を超えたIPアドレスを自動的にBANする仕組みを持つ。特にSSHの総当たり対策として非常に定番で、設定を理解しておくとWebサーバーや独自アプリのログにも応用しやすい。

fail2banとは何か

fail2banは、ログファイルを監視して、不審な失敗パターンを検出したIPアドレスを一時的または継続的に遮断するためのツール。
認証失敗が何回あったか、どのログファイルを監視するか、どのくらいの時間BANするかをルールとして定義できる。
仕組みとしては、
・ログ監視
・失敗回数のカウント
・閾値到達時のBAN
・一定時間後の解除
という流れで動く。

fail2banが向いている場面

特に使われやすいのは次のようなケース。
・SSHへの総当たり対策
・NginxやApacheのログイン系保護
・メールサーバーの認証失敗対策
・管理画面やAPIの不正試行対策
・独自アプリのログを使ったBAN制御
fail2banは「アプリケーションのログを見て判断する」ため、単純なポート遮断ではなく、実際の失敗試行を根拠に動く点が強い。

最初に理解しておくべきこと

fail2banでは「jail」という考え方を使う。
jailは、
・どのログを監視するか
・どの正規表現で失敗を検出するか
・何回失敗したらBANするか
・どのくらいBANするか
をまとめた単位になる。
たとえば sshd jail なら SSH の失敗ログを見てBANする、という形になる。

Ubuntuでのインストール

Ubuntu系では通常のパッケージとして導入できる。
最初はまずインストールして、サービスが起動するか確認するのが分かりやすい。

sudo apt update
sudo apt install -y fail2ban

インストール後はサービス状態を確認する。

sudo systemctl status fail2ban

ここで起きやすい問題は、
・パッケージは入ったがサービスが起動していない
・設定ファイルの誤りで起動失敗する
・既存のログパスと jail 設定が合っていない
といったもの。

設定ファイルの基本

設定では、配布元の jail.conf を直接編集するより、上書き用の jail.local を使う形が一般的。
これにより、パッケージ更新時の差分管理がしやすくなる。
基本の流れとしては、jail.local を作成して必要な jail を有効化していく。

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

全部をコピーせず、最小限だけを書く運用もできるが、初心者にはまず jail.local 側で上書きする流れの方が理解しやすい。

まずはSSH保護から始める

fail2banで最も基本になるのがSSH対策。
多くの環境では sshd jail が代表例になる。
最小限の設定例は次のような形。

[sshd]
enabled = true
port = ssh
logpath = /var/log/auth.log
maxretry = 5
findtime = 10m
bantime = 1h

ここでの意味は、
・10分間のあいだに
・5回失敗したら
・1時間BANする
という内容になる。
SSHを公開しているサーバーでは、まずこの設定を入れるだけでもかなり基本的な防御になる。 :contentReference[oaicite:6]{index=6}

maxretry・findtime・bantime の意味

fail2banの設定で最も重要なのはこの3つ。
maxretry は許容失敗回数
findtime は失敗回数を数える時間幅
bantime はBAN時間
たとえば次の設定なら、

maxretry = 3
findtime = 5m
bantime = 30m

5分以内に3回失敗したIPを30分間遮断する、という意味になる。
この3つはサービスごとに調整しやすく、SSHではやや厳しめ、Webログインでは誤BANを避けるため少し緩め、といった分け方もしやすい。

サービスの再読み込みと起動確認

設定を変更したら、fail2banへ反映させる必要がある。
再起動や reload を使う。

sudo systemctl restart fail2ban

またはクライアント経由で再読み込みする。

sudo fail2ban-client reload

状態確認は次が基本。

sudo fail2ban-client status

特定jailだけ詳しく見るなら次。

sudo fail2ban-client status sshd

ここでは、
・現在有効なjail
・BAN中のIP数
・ログファイル
などが確認できる。 :contentReference[oaicite:7]{index=7}

手動でBAN・解除する方法

一時的に怪しいIPを手動でBANしたいこともある。
その場合は fail2ban-client を使う。

sudo fail2ban-client set sshd banip 192.168.1.100

解除は次。

sudo fail2ban-client set sshd unbanip 192.168.1.100

運用中に、誤って自分のIPをBANした場合の解除にも使える。
そのため、SSHだけで管理しているサーバーでは、別経路のコンソールや管理画面を確保しておく方が安全。 :contentReference[oaicite:8]{index=8}

ログを確認して正しく検出できているかを見る

fail2banが想定通りに動いているかを見るには、サービスログの確認が重要。
systemd環境なら次のように見られる。

sudo journalctl -u fail2ban -f

また、個別jailの状態と一緒に確認すると、
・失敗がカウントされているか
・BANが実行されたか
・設定ミスで jail がロードされていないか
を追いやすい。
「設定したのにBANされない」場合は、ログパス不一致、フィルタ不一致、対象サービスのログ形式違いを疑うと整理しやすい。 :contentReference[oaicite:9]{index=9}

jail.local を全部書きすぎない方が扱いやすい

初心者がやりがちなのが、jail.conf 全体を丸ごとコピーして大量に編集してしまうこと。
それでも動くことはあるが、どこを自分で変えたのか分かりにくくなりやすい。
実務では、
・有効化したい jail
・共通の bantime
・無視したいIP
など、必要な差分だけを意識して管理する方が後で読みやすい。
特に ignoreip は自分の管理端末を保護する意味で重要になる。

自分のIPを誤BANしないための ignoreip

管理者自身のIPや信頼できるネットワークを誤ってBANしないために、ignoreip を設定しておくと安全。
たとえば次のように書ける。

[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24

これにより、ローカルや管理ネットワークからの接続はBAN対象から外しやすくなる。
ただし、固定IPでない環境では広く除外しすぎると防御効果が落ちるため、必要最小限にした方がよい。

NginxやWebサービスへ広げる考え方

fail2banはSSHだけでなく、NginxやApacheのログを使った保護にも広げられる。
たとえば、
・存在しないURLへの大量アクセス
・ログイン失敗の繰り返し
・Bad Bot系
などを検出対象にできる。
ただし、Web系は正常アクセスとの境目が曖昧になりやすく、誤BANリスクも上がるため、最初はSSHで動作を理解してから広げる方が安全。 :contentReference[oaicite:10]{index=10}

独自アプリへ応用する考え方

fail2banは、ログ形式さえ合わせれば独自アプリにも応用できる。
基本的には、
・アプリが失敗ログを残す
・そのログを fail2ban の filter で拾う
・ jail で監視する
という流れになる。
つまり、fail2ban はSSH専用ではなく、「失敗ログを一定ルールで検出してBANする仕組み」と考えると応用しやすい。 :contentReference[oaicite:11]{index=11}

よくある失敗と注意点

fail2ban運用でよくある失敗はかなり典型的。
jail.conf を直接編集して更新時に混乱する
・ログパスが実際の環境と違う
・サービス名だけ有効化してフィルタが合っていない
・reload を忘れて設定が反映されない
・自分のIPをBANしてSSH不能になる
・BAN時間を長くしすぎて誤BAN時の復旧が面倒になる
・syslog入力を信頼しすぎてローカルユーザー由来のログ注入リスクを考慮しない
特に最後の点は、syslogを読む jail ではローカルユーザーが syslog へ書き込めると DoS 的に悪用されうるため、環境によっては注意が必要。 :contentReference[oaicite:12]{index=12}

最初の実運用で進めやすい手順

Linuxでfail2banを使い始めるなら、進めやすい順番は次の流れ。

  1. fail2ban をインストールする
  2. jail.local を用意する
  3. まず sshd jail を有効化する
  4. ignoreip を設定する
  5. サービス再起動または reload
  6. fail2ban-client status で確認する
  7. ログを見て正しくBANされるか確認する
    この順で進めると、最初から広げすぎず、事故も比較的起きにくい。

まとめ

Linuxでfail2banを使った不正アクセス対策を行う場合、重要なのは、
・fail2banはログ監視ベースで不審IPをBANする仕組みであること
・基本単位は jail であること
・まずは SSH 対策から始めると理解しやすいこと
maxretryfindtimebantime が中核設定になること
fail2ban-client statusjournalctl で状態確認すること
ignoreip を適切に設定して誤BANを避けること
この流れを押さえることになる。
単純に導入するだけでも一定の防御効果はあるが、ログパスや対象サービスを自分の環境に合わせて確認しながら使うことで、実運用でかなり役立ちやすい。