2026年5月19日
2026年5月19日
fail2banでPostfix・Dovecotを守る設定|SMTP認証とIMAP/POP3の総当たり対策
メールサーバーは、SMTP認証(Postfix)やIMAP・POP3のログイン(Dovecot)に対して、パスワードを総当たりで試す接続を常に受けています。fail2banは、ログに残った認証の失敗を数え、一定回数を超えた接続元のIPアドレスをファイアウォールで一定時間遮断するツールです。
fail2banには、PostfixとDovecot用のフィルターとjail(監視の単位)が最初から入っています。この記事では、それを有効にする手順と、2026年10月時点のDebian 13で必要になる追加の設定を説明します。手順は、Debian 13(fail2ban 1.1.0、Dovecot 2.4.1)とUbuntu 24.04(fail2ban 1.0.2、Dovecot 2.3.21)で確認しています。
前提と仕組み
- PostfixのSMTP認証(SASL)にDovecotを使う、一般的な構成を想定しています
- fail2banは、jailごとに「どのログを」「どのフィルター(正規表現)で」読み、「何回失敗したら」「何分間」遮断するかを決めます
- Debian 13とUbuntu 24.04のfail2banは、既定でsystemdのジャーナル(
journalctlで見られるログ)を読みます。/var/log/mail.logが無い環境でもそのまま動きます - 遮断には、どちらのOSでもnftablesが使われます(
/etc/fail2ban/jail.d/defaults-debian.confで設定済み)
手順1:fail2banをインストールする
sudo apt update
sudo apt install fail2ban python3-systemd
python3-systemd は、fail2banがジャーナルを読むために使うPythonのモジュールです。
設定ファイルの /etc/fail2ban/jail.conf は、パッケージの更新で上書きされるため直接編集しません。変更は .local のファイルに書きます。
手順2:Postfix・Dovecot用のjailを有効にする
jail.conf には、次のjailが定義済みです(初期状態では無効)。
| jail | 検知する内容 | 遮断するポート |
|---|---|---|
postfix-sasl |
PostfixのSMTP認証の失敗(SASL LOGIN authentication failed など) |
smtp, 465, submission, imap, imaps, pop3, pop3s |
dovecot |
DovecotのIMAP・POP3などのログイン失敗 | pop3, pop3s, imap, imaps, submission, 465, sieve |
/etc/fail2ban/jail.d/mail.local を作り、次の内容を書きます。
[DEFAULT]
# 遮断しないIPアドレス(自分の事務所の固定IPなど)。空白で区切って並べる
ignoreip = 127.0.0.1/8 ::1 192.0.2.10
[postfix-sasl]
enabled = true
maxretry = 5
findtime = 10m
bantime = 1h
[dovecot]
enabled = true
maxretry = 5
findtime = 10m
bantime = 1h
findtimeの間にmaxretry回失敗すると、bantimeの間遮断します。上の例は「10分間に5回失敗したら1時間遮断」ですignoreipの192.0.2.10は例です。自分の固定IPアドレスに置き換えてください。社内から設定ミスのメールソフトが失敗を繰り返すと、社内のIPごと遮断されることがあります- ポート、ログの読み先、フィルターは
jail.confの定義が使われるため、ここに書く必要はありません
ポート番号を独自に変えている場合は、jailに port = 2525,465,587 のように書き足します。
手順3:Debian 13(Dovecot 2.4)ではフィルターを補う
Dovecot 2.4では、ログイン失敗のログの書き方が次のように変わりました(実際の出力をもとに、IPアドレスなどを例の値に置き換えています)。
dovecot[812]: imap-login: Login aborted: Logged out (auth failed, 1 attempts in 4 secs) (auth_failed): user=<info@example.com>, method=PLAIN, rip=203.0.113.20, lip=192.0.2.1, TLS, session=<XtMKufxe8o1/AAAB>
Dovecot 2.3までは、同じ失敗が Disconnected (auth failed, …) や Aborted login (auth failed, …) で始まっていました。2026年10月時点でDebian 13に入っているfail2ban 1.1.0の dovecot フィルターは、Login aborted で始まる2.4の書き方に一致しません。そのため、jailを有効にしても、IMAP・POP3のログイン失敗が数えられません(fail2banの開発元のリポジトリでは Login aborted にも対応していますが、Debian 13の1.1.0には含まれていません)。
Debian 13のようにDovecot 2.4を使っている場合は、/etc/fail2ban/filter.d/dovecot.local を作り、既存の正規表現に1行を足します。%(known/failregex)s は、元のフィルターの正規表現をそのまま引き継ぐ書き方です。
[Definition]
failregex = %(known/failregex)s
^Login aborted: [^(]*\((?:auth failed, \d+ attempts(?: in \d+ secs)?|tried to use (?:disabled|disallowed) \S+ auth)\)(?: \(\w+\))?: user=<[^>]*>,(?: method=\S+,)? rip=<HOST>
Ubuntu 24.04のようにDovecot 2.3を使っている場合、このファイルは不要です。Dovecotの版は dovecot --version で確認できます。
手順4:フィルターがログに一致するかを確かめる
有効にする前に、実際のログでフィルターが失敗を拾えるかを fail2ban-regex で確かめます。ジャーナルからメール関係のログをファイルに書き出して試します。
# 直近1日分のPostfixとDovecotのログを書き出す
sudo journalctl -u 'postfix*' -u dovecot --since '-1 day' -o short > /tmp/mail-journal.log
# Postfix(SMTP認証の失敗)
sudo fail2ban-regex /tmp/mail-journal.log 'postfix[mode=auth]'
# Dovecot(手順3の dovecot.local を作った場合は、その内容も含めて検査される)
sudo fail2ban-regex /tmp/mail-journal.log dovecot
結果の Lines: … matched が、ログにある認証失敗の件数とおおむね合っていれば問題ありません。0件の場合は、わざとパスワードを間違えてメールソフトから接続し、ログが出ているか、フィルターに一致するかを確かめてください。
/var/log/mail.log にログを書き出している環境(rsyslogを入れている場合など)では、journalctl の代わりにそのファイルを指定しても同じように試せます。
手順5:fail2banを再起動して状態を確認する
# 設定の書き間違いがないか確認
sudo fail2ban-client -t
sudo systemctl restart fail2ban
# 動いているjailの一覧
sudo fail2ban-client status
# jailごとの失敗件数と、遮断中のIPアドレス
sudo fail2ban-client status postfix-sasl
sudo fail2ban-client status dovecot
遮断はnftablesの f2b-table というテーブルに登録されます。
sudo nft list table inet f2b-table
誤って遮断したときの解除
自分や利用者のIPアドレスが遮断された場合は、jailを指定して解除します。
sudo fail2ban-client set dovecot unbanip 203.0.113.5
繰り返し遮断される場合は、メールソフトに古いパスワードが残っていないかを確かめ、必要なら手順2の ignoreip に加えます。
運用上の注意
- 遮断は一時的な対策です:総当たりの元は、推測されやすいパスワードです。メールアカウントのパスワードを長く複雑にすること、使っていないアカウントを消すことと合わせて運用してください
- 送信元を変えて試す攻撃は止めにくい:多数のIPアドレスから少しずつ試す攻撃は、IPごとの回数では検知しにくくなります。
bantimeを長くする、繰り返し遮断されるIPを長期間遮断する(fail2banのrecidivejail)などの方法があります - Webメールを同じサーバーで動かしている場合:RoundcubeなどのWebメールはサーバー内からDovecotに接続するため、Dovecotのログの接続元(
rip=)がWebメールのサーバー自身(127.0.0.1など)になることがあります。この場合、Dovecotのjailでは利用者のIPを遮断できないため、Webメール側のログを対象にしたjailを別に用意します - バージョンアップの後は確認する:PostfixやDovecotの更新でログの書き方が変わると、フィルターが一致しなくなることがあります。更新後は手順4の確認をやり直してください
まとめ
- fail2banに同梱の
postfix-saslとdovecotのjailを、/etc/fail2ban/jail.d/mail.localで有効にする - Debian 13とUbuntu 24.04では、fail2banはsystemdのジャーナルを読むため、ログファイルの指定は不要
- Dovecot 2.4(Debian 13)では、
Login abortedで始まるログに一致する正規表現をfilter.d/dovecot.localで追加する - 有効にする前後で
fail2ban-regexとfail2ban-client statusを使い、失敗が数えられていることを確認する
関連記事: