メール・セキュリティ
Postfixの設定方法:SPAM対策と安全なメールサーバー運用
Postfixをインストールしてメールを送受信できるようにするだけでは、安全なメールサーバーとはいえません。最優先は不正中継を防ぐこと。その次にTLSと認証、迷惑メールを入口で減らす設定、送信ドメインを守るSPF・DKIM・DMARCを整えます。
Rocky Linux/AlmaLinux系のVPSで、
example.jpを運用する例です。実際には自分のFQDN、ドメイン、証明書パスへ置き換えてください。既存メールサーバーでは、設定ファイルとメールデータをバックアップしてから変更します。DNSとホスト名を先に整える
Postfixの前に、ホスト名とDNSが一致していることを確認します。メール配送では正引きだけでなく逆引きも見られます。
mail.example.jpのA/AAAAレコードがVPSを指すexample.jpのMXレコードがmail.example.jpを指す- VPSのPTR(逆引き)が
mail.example.jpになっている - ホスト名を正引きすると同じIPアドレスへ戻る
- 25、587、993番だけを必要に応じてファイアウォールで許可する
Postfixの基本設定を作る
/etc/postfix/main.cfの中心部分です。mynetworksへ自宅回線や広いプライベートネットワークを安易に追加しないことが重要です。
# 自分の環境へ置き換える
myhostname = mail.example.jp
mydomain = example.jp
myorigin = $mydomain
inet_interfaces = all
inet_protocols = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
# 信頼するのはサーバー自身だけ
mynetworks = 127.0.0.0/8, [::1]/128
# 第三者への不正中継を禁止
smtpd_relay_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination
disable_vrfy_command = yes
smtpd_helo_required = yes
strict_rfc821_envelopes = yes
message_size_limit = 26214400
Postfix 2.10以降では、中継可否をsmtpd_relay_restrictions、迷惑メール判定をsmtpd_recipient_restrictionsへ分けると事故を避けやすくなります。reject_unauth_destinationを外してはいけません。
TLSを有効にする
公開MXの25番は、相手がTLSに対応していれば暗号化する「機会的TLS」にします。すべての相手へ暗号化を強制すると、対応していないサーバーからメールを受け取れません。
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.jp/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.jp/privkey.pem
smtpd_tls_security_level = may
smtp_tls_security_level = may
# AUTHは暗号化後だけ表示する
smtpd_tls_auth_only = yes
smtpd_tls_loglevel = 1
smtp_tls_loglevel = 1
証明書の秘密鍵はrootだけが読める権限を保ち、更新後にPostfixを再読み込みします。証明書ファイルをメール送受信用ユーザーへコピーする運用は避けます。
587番でSMTP AUTHを提供する
メールソフトからの送信はsubmission(587番)へ分離します。認証基盤としてDovecot SASLを使う例では、PostfixからDovecotのUNIXソケットへ接続します。
# /etc/postfix/main.cf
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = no
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
/etc/postfix/master.cfではsubmissionサービスにだけ厳しい上書きを設定します。
submission inet n - n - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_tls_auth_only=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
-o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
外部へ認証なしで送れる状態になっていないか、別回線から必ずテストします。認証失敗を繰り返すIPは、Fail2banなどで一定時間遮断する方法もあります。
受信時の軽量なSPAM対策を入れる
最初から厳しい拒否ルールを大量に追加すると、正常なメールまで失う可能性があります。明らかな異常を拒否し、ログを確認しながら段階的に追加します。
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_non_fqdn_recipient,
reject_unknown_recipient_domain,
reject_unlisted_recipient,
reject_unauth_destination
smtpd_sender_restrictions =
reject_non_fqdn_sender,
reject_unknown_sender_domain
smtpd_data_restrictions = reject_unauth_pipelining
reject_unknown_client_hostnameのような強い拒否は、設定不良の正規サーバーも落とす可能性があります。導入するならログで影響を確認してからにします。
postscreenでボットをSMTP処理の前に減らす
postscreenは25番への接続をSMTPデーモンへ渡す前に検査し、早すぎるコマンド送信など、正常なメールサーバーらしくない動きを見つけます。最初は記録だけの既定動作で観察し、問題がないことを確認してからenforceへ進めます。
# /etc/postfix/main.cf
postscreen_access_list = permit_mynetworks
postscreen_greet_action = enforce
postscreen_pipelining_enable = yes
postscreen_pipelining_action = enforce
# DNSBLは利用条件と誤判定を確認してから追加
# postscreen_dnsbl_sites = zen.spamhaus.org*2
# postscreen_dnsbl_threshold = 2
# postscreen_dnsbl_action = enforce
master.cfでは25番の入口をpostscreenへ切り替え、通過した接続を専用smtpdへ渡します。
smtp inet n - n - 1 postscreen
smtpd pass - - n - - smtpd
dnsblog unix - - n - 0 dnsblog
tlsproxy unix - - n - 0 tlsproxy
587番のsubmissionへpostscreenを適用してはいけません。DNSBLには利用条件や問い合わせ上限があるため、名前だけコピーせず公式条件を確認します。
本文検査は専用フィルターへ任せる
Postfixの接続制御だけでは、本文内容や添付ファイルまで十分に判定できません。RspamdやSpamAssassinをmilter/コンテンツフィルターとして組み合わせ、スコアに応じて件名付与、隔離、拒否を行います。
いきなり削除せず、最初はヘッダーへ判定結果を付けて迷惑メールフォルダーへ振り分けます。誤判定を確認してから閾値を調整するほうが安全です。ウイルス検査が必要ならClamAVなどを別途組み合わせます。
SPF・DKIM・DMARCで送信ドメインを守る
受信SPAMを減らす設定とは別に、自分のドメインを騙った送信を判定しやすくし、正規メールが迷惑メール扱いされにくい状態を作ります。
| 仕組み | 役割 | DNS例 |
|---|---|---|
| SPF | 送信を許可するサーバーを宣言 | example.jp TXT "v=spf1 ip4:203.0.113.10 -all" |
| DKIM | 送信メールへ電子署名し、公開鍵をDNSで公開 | mail2026._domainkey.example.jp TXT "v=DKIM1; k=rsa; p=公開鍵" |
| DMARC | FromドメインとSPF/DKIMの整合を確認し、失敗時の扱いを宣言 | _dmarc.example.jp TXT "v=DMARC1; p=none; rua=mailto:dmarc@example.jp" |
SPFは実際に使うすべての送信元を含めます。DKIMはOpenDKIMやRspamdなどで署名し、秘密鍵をサーバー内で保護します。DMARCは最初にp=noneでレポートを集め、正規メールがSPFまたはDKIMで整合することを確認してからquarantine、最終的にrejectを検討します。
反映前後に検証する
# 差分として有効な設定を確認
postconf -n
# 構文とファイル権限を検査
postfix check
# 問題がなければ再読み込み
systemctl reload postfix
# 状態とログを確認
systemctl status postfix
journalctl -u postfix --since today
- 外部から自分のドメイン宛てを受信できる
- 外部から第三者ドメイン宛てを中継できない
- 587番はSTARTTLS前にAUTHを受け付けない
- 認証後だけ外部宛てに送信できる
- 証明書の名前と有効期限が正しい
- SPF、DKIM、DMARCが受信側でpassする
- キューが増え続けていない
- ログに大量の認証失敗や配送エラーがない
設定後も続けること
メールサーバーは公開して終わりではありません。OSとPostfixの更新、証明書更新、キューとログの監視、バックアップからの復元確認を続けます。特に認証情報が漏れると、正規ユーザーとして大量送信されるため、強いパスワードとレート制限が必要です。
参考:Postfix SMTP relay and access control、Postfix TLS Support、Postfix SASL Howto、Postscreen Howto、SPF RFC 7208、DKIM RFC 6376、DMARC RFC 9989
最初に守る3点
設定項目が多くても、優先順位は明確です。第三者への中継を拒否する。利用者の送信は587番+TLS+認証へ分ける。SPF・DKIM・DMARCを実際の送信経路に合わせる。この3点を先に完成させ、その後にpostscreenや本文フィルターを調整します。