インターネット上にメールサーバー(Postfix・Dovecot)を公開すると、SSHポートと同様にSMTP(25/465/587番)やPOP3(110/995番)、IMAP(143/993番)に対しても、ボットによる不正ログインの総当たり攻撃(ブルートフォースアタック)や不正リレーの試行が絶えず仕掛けられます。
そこで今回は、AlmaLinux 10環境に構築したメールサーバーのSMTP・POP3・IMAPを「Fail2ban」で保護し、認証失敗や不正アクセスを繰り返すIPアドレスを自動的に遮断(BAN)する設定手順を解説します。
本手順は、すでにAlmaLinux 10へFail2ban(基本設定・SSH保護)およびPostfix + Dovecotが導入されており、あらかじめ「SELinuxを無効化(Disabled)」している環境を前提としています。
- AlmaLinux 10:Fail2banのインストールとSSH保護設定(firewalld・systemd連携)
- AlmaLinux 10:Postfix + SMTP-AUTH + Dovecotでメールサーバを構築する方法
- AlmaLinux 10:PostfixのSSL/TLS暗号化設定(Let's Encrypt / SMTPS / STARTTLS)
- AlmaLinux 10:DovecotをSSL/TLSで通信暗号化する方法
作業工程
作業工程は下記のとおりです。
- メール保護用Jailの概要(postfix / postfix-sasl / dovecot)
- 設定ファイル(jail.local)への追記
- 設定ファイルの書式・反映内容チェック(fail2ban-client --test / -d)
- 設定の再読み込み(fail2ban-client reload)
- 動作確認とステータス確認(fail2ban-client & firewalld)
- メール環境特有の運用ポイント・誤BAN対策
メール保護用Jailの概要
Fail2banには、メールサーバー向けのフィルタ(検知パターン)とJail(監視・遮断ルール)があらかじめ用意されているので、保護したいサービスに応じて以下の3つのJailを有効化します。
- [postfix](SMTP全般の不正試行対策)
- 不正リレー(Relay access denied)や存在しない宛先・送信元の不正な接続試行など、SMTPサーバー(25番・465番・587番ポート)への迷惑アクセスを検知して遮断します。
- [postfix-sasl](SMTP-AUTH認証の保護)
- SMTP-AUTH(SASL認証)におけるパスワード総当たり攻撃を検知して遮断します。メール送信用のSubmission(587番)やSMTPS(465番)を公開している場合は必須となる保護設定です。
- [dovecot](POP3・IMAP認証の保護)
- DovecotへのPOP3(110/995番)・IMAP(143/993番)およびDovecot SASL認証の失敗ログを検知し、メール受信ポートへの総当たり攻撃を遮断します。
設定ファイル(jail.local)への追記
既存の「/etc/fail2ban/jail.local」をバックアップしたうえでファイルを開き、メールサーバー用のJail設定を追記します。
cd /etc/fail2ban sudo cp -p jail.local jail.local_$(date +%Y%m%d-%H%M%S) sudo vi jail.local
「[DEFAULT]」および「[sshd]」(設定している場合)の下に、以下の内容を追記します。
記載している設定内容(ポート指定、検知期間、試行回数、遮断時間など)はあくまでも設定の一例です。ご自身のサーバーで開放しているポートや運用方針に合わせて自由に調整してください。
# SMTP全般(不正リレー試行など)の保護 [postfix] enabled = true backend = systemd port = smtp,465,submission findtime = 10m maxretry = 5 bantime = 1h # SMTP-AUTH(SASL認証)の保護 [postfix-sasl] enabled = true backend = systemd port = smtp,465,submission findtime = 10m maxretry = 5 bantime = 1h # POP3 / IMAP(Dovecot)の保護 [dovecot] enabled = true backend = systemd port = pop3,pop3s,imap,imaps findtime = 10m maxretry = 5 bantime = 1h
設定のポイント
- backend = systemd を明記している理由
-
標準の「jail.conf」ではメール系Jailがログファイル(/var/log/maillog等)を参照する設定になっている場合があります。
rsyslogが導入されていないAlmaLinux 10の最小構成環境でも確実に動作するよう、各Jailにも「backend = systemd」を明記してsystemd-journaldから直接ログを読み取るようにしています。
※rsyslogを導入して「/var/log/maillog」へ出力している環境でも、systemd-journald側にログが流れていればそのまま動作します。 - port の指定(環境に合わせた調整)
- SSL/TLS化に伴い平文ポート(110番・143番)を閉じている環境では、Dovecot側のポートを「port = pop3s,imaps」のように絞っても構いません。
- findtime / maxretry / bantime
-
各Jailに個別の値を記述することで、「[DEFAULT]」の共通設定を上書きできます。
メールクライアントのパスワード打ち間違いによる誤BANを防ぎたい場合は、SSHより少し緩め(例:「maxretry = 10」など)に設定するのも有効です。
設定ファイルの書式・反映内容チェック
「jail.local」の編集が終わったら、既存のSSH監視へ影響を与える前に構文エラーと設定内容の反映チェックを行います。
構文チェック(--test)
sudo fail2ban-client --test
問題がなければ以下のように表示されます。
OK: configuration test is successful
反映内容のダンプ確認(-d オプション)
設定項目名のスペルミスで無視されていないかを確認するため、「-d」オプションでPostfixとDovecotの設定が正しく認識されているかを確認します。
sudo fail2ban-client -d | grep -E "postfix|dovecot"
「['add', 'postfix', 'systemd']」「['add', 'postfix-sasl', 'systemd']」「['add', 'dovecot', 'systemd']」や、設定した「maxretry」「bantime」などの行が出力されていれば、意図通りに読み込まれています。
(参考)標準フィルタがログに反応するか事前テストする
Fail2banにもともと用意されているPostfix・Dovecot用の標準フィルタ(検知用の正規表現定義)が、実際のsystemd-journaldのログを正しく拾えるかを確認したい場合は、「fail2ban-regex」コマンドで単体テストが行えます。
sudo fail2ban-regex systemd-journal /etc/fail2ban/filter.d/postfix.conf sudo fail2ban-regex systemd-journal 'postfix[mode=auth]' sudo fail2ban-regex systemd-journal /etc/fail2ban/filter.d/dovecot.conf
※2行目の「postfix[mode=auth]」は、「[postfix-sasl]」で使用しているSMTP-AUTH認証エラー用のフィルタをテストするコマンドです。
以下は「postfix.conf」での実行例です。「Results」欄の下にある「Failregex: 〇 total」や「Lines: ...」の行を確認してください。過去の認証失敗や不正接続ログがジャーナルに残っていれば、「〇 matched」の部分に検知件数が表示されます(該当ログがまだ無い場合は「0 matched」となります)。
sudo fail2ban-regex systemd-journal /etc/fail2ban/filter.d/postfix.conf Running tests ============= Use filter file : postfix, basedir: /etc/fail2ban ##### 中略 ##### Results ======= Prefregex: 768 total ##### 中略 ##### Failregex: 738 total ##### 中略 ##### Lines: 14137 lines, 0 ignored, 741 matched, 13396 missed [processed in 0.81 sec] Missed line(s): too many to print. Use --print-all-missed to print all 13396 lines
実行結果の末尾に「Missed line(s): too many to print. ...」と表示されることがありますが、これは通常のメール送受信ログなど攻撃に該当しなかった行(missed)が多いため画面表示を省略しただけであり、エラーではありません。
上記の例では、読み込んだ14137行のうち741行がフィルタに一致(matched)し、残りの13396行はフィルタに該当しなかった行(missed)という結果になります。
出力内容を詳しく確認したい場合は、必要に応じて以下のオプションをコマンド末尾に付けて実行してください。
- --print-all-matched:フィルタに一致して検知された行(matched)だけを一覧表示する
- --print-all-missed:フィルタに該当しなかった行(missed)をすべて表示する
設定の再読み込み(reload)
すでにFail2banが稼働している場合は、現在BAN中のIPや監視状態を維持したまま設定を反映させるため「reload」を実行します。
sudo fail2ban-client reload
設定反映時の「reload」と「restart」の違いは以下のとおりです。すでにBANされているIPがある場合は、不要な遮断の隙間やルール解除を避けるためにも「reload」で反映させるのが安全です。
- reload(sudo fail2ban-client reload / sudo systemctl reload fail2ban):現在BAN中のIPや監視状態を維持したまま、安全に設定のみを反映できる(推奨)
- restart(sudo systemctl restart fail2ban):サービスをいったん停止して再起動するため、停止時に「firewalld」上のBANルールや一時的なカウントがいったんリセット(解除)されてしまう
動作確認とステータス確認
新しく追加した3つのJailが正しく有効化されているかを確認します。
有効化されているJail一覧の確認
sudo fail2ban-client status
Status |- Number of jail: 4 `- Jail list: dovecot, postfix, postfix-sasl, sshd
「Jail list」に既存の「sshd」(設定している場合)に加えて「dovecot」「postfix」「postfix-sasl」が表示されていれば有効化完了です。
各Jailの詳細ステータス確認
個別の検知回数やBAN中のIPを確認する場合は、Jail名を指定して実行します。
sudo fail2ban-client status postfix-sasl sudo fail2ban-client status dovecot
Status for the jail: dovecot |- Filter | |- Currently failed: 0 | |- Total failed: 6 | `- Journal matches: _SYSTEMD_UNIT=dovecot.service `- Actions |- Currently banned: 1 |- Total banned: 1 `- Banned IP list: xxx.xxx.xxx.xxx
firewalld側での遮断ルールの確認
メール系JailでIPアドレスがBANされると、firewalldのリッチルールに対象ポート(例:pop3・pop3s・imap・imapsなど)ごとの拒否設定が自動追加されます。
sudo firewall-cmd --list-rich-rules
rule family="ipv4" source address="xxx.xxx.xxx.xxx" port port="pop3" protocol="tcp" reject type="icmp-port-unreachable" rule family="ipv4" source address="xxx.xxx.xxx.xxx" port port="pop3s" protocol="tcp" reject type="icmp-port-unreachable" rule family="ipv4" source address="xxx.xxx.xxx.xxx" port port="imap" protocol="tcp" reject type="icmp-port-unreachable" rule family="ipv4" source address="xxx.xxx.xxx.xxx" port port="imaps" protocol="tcp" reject type="icmp-port-unreachable"
メール環境特有の運用ポイント・誤BAN対策
メールアプリのパスワード設定ミスによる誤BANに注意
メールサーバーにFail2banを導入する際、最も多いトラブルが「正規ユーザーの誤BAN」です。
PCのメールソフト(ThunderbirdやOutlook)やスマートフォンのメールアプリは、パスワードを1度間違えたまま保存すると、バックグラウンドで数分おきに自動送受信リトライを繰り返すため、短時間で「maxretry」に達して自宅やオフィスのIPがBANされてしまいます。
以下の設定を行うことで、「正規ユーザーの誤BAN」をある程度防ぐことができます。
- 自宅や社内LANの固定IPを「[DEFAULT]」の「ignoreip」に登録しておく
- 不特定多数のユーザーがいる場合は、「maxretry」を少し多め(例:8〜10回)に調整する
誤ってBANされたIPを解除する(全Jail一括 / Jail指定)
万が一誤ってBANされてしまった場合は、該当のJail名を指定して解除します。
sudo fail2ban-client set dovecot unbanip 遮断を解除したいIPアドレス sudo fail2ban-client set postfix-sasl unbanip 遮断を解除したいIPアドレス
「どのJailでBANされたか分からない」「複数のJailで同時にBANされてしまった」という場合は、Jail名を指定せず全Jailからまとめて解除できる「unban」コマンドが便利です。
sudo fail2ban-client unban 遮断を解除したいIPアドレス
解除された件数(1以上)が表示されれば解除完了です(該当IPがどのJailでもBANされていなかった場合は「0」が表示されます)。
ログの確認
Fail2banの検知・BANログ
メール系Jailによる検知やBAN履歴も、SSHと同じ「/var/log/fail2ban.log」にまとめて記録されます(このファイルはFail2ban自身が直接出力するため、rsyslogが未導入の環境でも作成されます)。
sudo tail -f /var/log/fail2ban.log
2026-11-11 17:40:12,345 fail2ban.filter [1234]: INFO [postfix-sasl] Found xxx.xxx.xxx.xxx - 2026-11-11 17:40:12 2026-11-11 17:41:05,678 fail2ban.actions [1234]: NOTICE [postfix-sasl] Ban xxx.xxx.xxx.xxx
※Fail2banサービス自体の起動・エラーログを確認したい場合は、「sudo journalctl -u fail2ban」も利用できます。
Postfix・Dovecotの元ログ(journalctlでの確認)
「BANされたIPが具体的にどのユーザー名で認証失敗したのか」「どのような不正リレーを試みていたのか」といった元のメールログを確認したい場合、rsyslogがインストールされていないAlmaLinux 10環境では「/var/log/maillog」が存在しないため、「journalctl」コマンドで確認します。
# Postfixのログ(直近50行)を確認する場合 sudo journalctl -u postfix -n 50 # Dovecotのログ(直近50行)を確認する場合 sudo journalctl -u dovecot -n 50 # 特定のIPアドレスに関するメールログをまとめて調査する場合 sudo journalctl -u postfix -u dovecot | grep xxx.xxx.xxx.xxx
※rsyslogを導入している環境であれば、従来どおり「/var/log/maillog」から確認することも可能です。
まとめ
以上が、AlmaLinux 10のFail2banでPostfix(SMTP)およびDovecot(POP3 / IMAP)を保護する設定手順です。
既存の「jail.local」に「[postfix]」「[postfix-sasl]」「[dovecot]」を追記するだけで、メールサーバーを狙ったパスワード総当たり攻撃や不正リレー試行もfirewalldで自動的に遮断できるようになります。
メールアプリの再試行による誤BANに気をつけながら、「ignoreip」や「maxretry」を運用に合わせて調整し、より安全なメールサーバー運用にお役立てください。
コメント