shintaro.info infra

Fail2ban (不正アクセス遮断)

作成: Shintaro / Acia
対象OS: Debian 13 (Sakura VPS)


目的

SSH やメールサービス(Postfix / Dovecot)への総当たり攻撃や不正アクセスを自動検出・自動遮断し、
ログイン試行の失敗回数に応じて一定時間ブロックする。

本ドキュメントは、Debian 13 上での sshd / Postfix / Dovecot を対象にした Fail2ban 構成を
「再現性のある手順」として残すことを目的とする。


設定方針

  • ルールは **/etc/fail2ban/jail.local に集約**(配布既定の jail.conf は直接編集しない)。
  • Debian 13 / Fail2ban 1.0 系では **postfix-sasl フィルタは廃止**されており、

Postfix の認証失敗(SASL)は **postfix[mode=auth]** で扱う。

  • 監視対象サービス:
  • SSH: [sshd]
  • Postfix(SMTP/Submission/SMTPS + SASL 認証): [postfix]
  • Dovecot(IMAP/POP3/各種 SSL/TLS): [dovecot]
  • Debian 13 では backend = systemd により systemd-journald 経由の監視が安定(logpath は補助的扱い)。

導入

Fail2ban 本体のインストールと起動:

sudo apt update
sudo apt install -y fail2ban
sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban --no-pager

現行設定例(2025-11-21 時点)

Fail2ban のローカル設定は **/etc/fail2ban/jail.local** に集約する。

5.1 /etc/fail2ban/jail.local

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

[postfix]
enabled  = true
port     = smtp,ssmtp,submission
filter   = postfix[mode=auth]
logpath  = /var/log/mail.log
backend  = systemd
maxretry = 5
bantime  = 1h
findtime = 10m

[dovecot]
enabled  = true
port     = imap,imaps,pop3,pop3s
filter   = dovecot
logpath  = /var/log/mail.log
backend  = systemd
maxretry = 5
bantime  = 1h
findtime = 10m

5.2 設定のポイント

  • [sshd]
  • SSH ログイン失敗を監視し、5 回失敗で 1 時間 BAN(maxretry=5, bantime=1h)。
  • backend=systemd により journald を参照しつつ、/var/log/auth.log も補助的に利用。
  • [postfix]
  • filter = postfix[mode=auth]重要
  • 旧世代の postfix-sasl フィルタは Debian 13 / Fail2ban 1.0 系では提供されないため使用しない。
  • これにより Submission(587) / SMTPS(465) / SMTP(25) での 認証失敗ログ(SASL LOGIN authentication failed 等) を検知して BAN できる。
  • ポートは smtp,ssmtp,submission とし、25/465/587 を一括監視。
  • [dovecot]
  • IMAP/IMAPS/POP3/POP3S のログイン失敗を監視し、POP3S/IMAPS での総当たり攻撃を遮断。
  • Postfix と同じく backend=systemd で journald 監視。

メモ: - backend=systemd の場合、Fail2ban は journald からログを読むため、logpath主にフィルタ上のメタ情報として扱われる。 - /var/log/mail.log が存在しない場合は、rsyslog 導入と mail ログ有効化を 07_postfix.md / 08_dovecot.md の手順で実施しておく。


検証

6.1 Fail2ban 全体の状態

sudo fail2ban-client status

出力例(要約):

  • StatusACTIVE
  • Jail list:sshd, postfix, dovecot が含まれていること。

6.2 個別ジェイルの状態

sudo fail2ban-client status sshd
sudo fail2ban-client status postfix
sudo fail2ban-client status dovecot

各ジェイルについて、以下を確認する:

  • Filter:
  • Currently failed: 最近の失敗回数
  • Total failed: 累計失敗回数
  • Actions:
  • Currently banned: 現在 BAN 中の IP 数
  • Total banned: 累計 BAN 数

6.3 動作確認(テストの一例)

  • SSH:
  • 意図的に誤パスワードで複数回 SSH ログインを試行し、sshd ジェイルで Total failed が増加することを確認。
  • maxretry 回数を超えた後、対象 IP が Currently banned に入ることを確認。
  • Postfix:
  • 存在しないユーザ名や誤パスワードで Submission(587) に対して SMTP AUTH を複数回試行。
  • fail2ban-client status postfixTotal failed が増加し、一定回数で BAN されることを確認。
  • Dovecot:
  • POP3S(995) または IMAPS(993) に対して、誤パスワードで複数回ログインを試行。
  • fail2ban-client status dovecot で同様にカウント・BAN を確認。

運用ノート

7.1 遮断解除(アンバン)

特定 IP を BAN 解除する:

sudo fail2ban-client set sshd unbanip <IPアドレス>
sudo fail2ban-client set postfix unbanip <IPアドレス>
sudo fail2ban-client set dovecot unbanip <IPアドレス>

7.2 現在のブロック一覧

sudo fail2ban-client status sshd
sudo fail2ban-client status postfix
sudo fail2ban-client status dovecot

Banned IP list: に現在遮断中の IP が列挙される。

7.3 ホワイトリスト(除外 IP)

管理端末など、絶対に BAN したくない IP は ignoreip で除外する。

/etc/fail2ban/jail.local の先頭などで [DEFAULT] セクションを定義:

[DEFAULT]
ignoreip = 127.0.0.1/8 ::1
  • グローバル IP や自宅回線を追加する場合は CIDR で追記(例: ignoreip = 127.0.0.1/8 ::1 203.0.113.4)。
  • 誤って広範囲(例: 0.0.0.0/0)を指定しないように注意。

7.4 感度調整

  • 攻撃が多い場合:
  • bantime を延長(例: 12h, 1d)。
  • findtime を延長(例: 1h)して「短時間の連続攻撃」に対する感度を上げる。
  • 誤検知が気になる場合:
  • maxretry を増やす(例: 10)。
  • findtime を短縮することで「1 回ミスしただけのユーザ」が BAN されにくくなる。

7.5 バックエンドについて

  • Debian 13 では backend=systemd が標準的かつ安定。
  • /var/log/auth.log/var/log/mail.log を主軸にしたい場合は、backend=auto も選択肢だが、

journald との二重管理になるため本構成では systemd を採用している。

7.6 UFW との連携

  • UFW は 静的なポリシー層(どのポートを開けるか)
  • Fail2ban は 動的な遮断層(不正な IP を一時 BAN)

として併用する。

  • UFW は、サービス完成後に開放したいポートのみ許可(例: 22/25/465/587/993/995)。
  • Fail2ban は、その上で 総当たり攻撃など悪意ある接続元を自動遮断する役割。

将来の拡張・注意点

  • Postfix 側のログフォーマットや Dovecot 側のログレベルを変更した場合、Fail2ban フィルタと整合が取れているか fail2ban-regex で確認すること。
  • 新たな公開サービス(例: HTTP API、管理用パネルなど)を追加する場合は、必要に応じて専用のジェイル(filter + jail)を追加する。

変更履歴

日付編集者内容
2025-10-27Shintaro / Acia初版作成。[sshd] ジェイルのみ有効化し、backend=systemd, maxretry=5, bantime=1h, findtime=10m の運用と基本操作を記載。
2025-11-21Aciaメールサーバ導入に伴い、Postfix/Dovecot 用ジェイルを正式に追加。Debian 13 / Fail2ban 1.0 系で postfix-sasl フィルタが廃止されたことを踏まえ、postfix[mode=auth] を採用する構成に改訂し、UFW・メールログとの連携および運用ノートを更新。