postfixでspf
今後増えてくるかわかりませんが、Sender Policy Frameworkをpostfix 2.9系で実施するための手順です。2.10系や2.11系も細部(main.cfの記述が一部異なる等)が異なりますが基本は同じです。
また、spfに対応する方法合わせて記述してあります。
spfの導入と設定
4. spfとは?
Sender Policy Frameworkという仕組みの略称で2006年4月にexperimentalなRFC 4408として公開され、後に2014年4月にRFC 7208がStandards Trackして公開されたたものです。
詳細は解説はWikipedia(SPF)などを参考して下さい。
余談ですが、メールサーバ運用時の注意点はenvelope-fromとメール本文のFrom(所謂Fromヘッダー)の2つの送信元アドレスを評価する対象としてgmail等はenvelope fromを見ているようですが、3大ケータイキャリアは本文のFromを評価してからenvelope-fromを見るようなケースがあり、実際ML等ではenvelope-fromを書き換えても本文のFromがそのままだと通常のメールとして承認されず迷惑メールとなるケースもあるようです。このため、ML等の運用でケータイキャリア等の対策もするのであれば本文中のFromも書き換える必要性があります。
5. postfix policydのpython版の導入
5.1. pkgによる導入
pkg install py27-postfix-policyd-spf-python
すれば依存関係で必要なものも一緒に入れてくれます。
5.2. postfixの設定
5.2.1. master.cf
以下のような記述を最後の行以後に追加してください。
policyd-spf unix - n n - 0 spawn user=nobody argv=/usr/local/bin/python2.7 /usr/local/bin/policyd-spf /usr/local/etc/postfix-policyd-spf-python/policyd-spf.conf
なお、/usr/local/bin/python2.7等環境によって異なる部分がありますのでご注意ください。
5.2.2. main.cf
smtpd_recipient_restrictionsに追記し、policyd_-spf_time_limitも追記してあげてください。
smtpd_recipient_restrictions = reject_unverified_recipient, reject_unauth_destination, check_policy_service unix:private/policyd-spf policyd-spf_time_limit = 3600
5.3. policyd-spfの設定
policyd-spfの設定は適宜行ってください。当方の環境例を参考に記述しておきます。
# For a fully commented sample config file see policyd-spf.conf.commented debugLevel = 1 defaultSeedOnly = 1 HELO_reject = SPF_Not_Pass Mail_From_reject = Fail PermError_reject = False TempError_Defer = False skip_addresses = 127.0.0.0/8,::ffff:127.0.0.0/104,::1/128 Reject_Not_Pass_Domains = gmail.com,google.com,hotmail.com,yahoo.com,yahoo.co.jp,hotmail.co.jp,outlook.com,msn.com,docomo.ne.jp,ezweb.ne.jp,softbank.ne.jp,i.softbank.jp
ケータイ各社等は適切に設定されている所が多いですが、緩くdefer指定なので失敗すると拒否するようにReject_Not_Pass_domainsに記載すると迷惑メール対策になる場合がありますが、適切に設定できないユーザからのメールをはじく恐れもありますのでご注意ください。
5.4. 受信テスト
SPFレコードは現在無料系サーバーでもほぼ設定されています。簡単なのはgmail等からpolicydーspfを設定したメールサーバー宛にメールを送信し、受信したメールが適切に評価されているか試します。
正しく評価されていれば、以下のような文言がメールのヘッダー部分に記載されているはずです。
Received-SPF: Pass (Receiver policy for SPF Pass) identity=mailfrom; client-ip=203.0.113.1; helo=mail-xx0-x00.google.com; envelope-from=hoge_hoge@gmail.com; receiver=hoge@example.gr.jp
6. spfを設定する
現在spfレコードはにて公開されているルールRFC 7208があり、執筆時点でSPF1(v=spf1)です。SenderID(spf2.0/pra)とは書式等や評価の仕方が異なりますので注意してください。
DNSレコードとしてSPFレコードがありますけど、既存の多くのメールサーバは、TXTレコードのみ送ってくるサーバーも多いようですので、SPFレコードとTXTレコードの2つを書くかTXTレコードのみを書くことをおすすめします。
hoge@example.gr.jpをメールアドレスとして使い、mail.example.gr.jpからメールを送る場合のZone記述例
@ IN SOA ns0.example.gr.jp. root.example.gr.jp. ( 1970010100 ; serial 3600 ; refresh 900 ; retry 2419200 ; expiry 1800 ) ; minimum @ IN NS ns1.example.gr.jp. @ IN NS ns2.example.gr.jp. @ IN MX 10 mail.example.gr.jp. @ IN TXT "v=spf1 ip4:192.0.2.1 ip4:198.51.100.0/24 ip6:2001:db8:dead:beaf::1/64 ip6:2001:DB8:bad::/48 ~all" @ IN SPF "v=spf1 ip4:192.0.2.1 ip4:198.51.100.0/24 ip6:2001:db8:dead:beaf::1/64 ip6:2001:DB8:bad::/48 ~all" @ IN A 192.0.2.5 ns1 IN A 198.51.100.5 ns2 IN A 192.0.2.2 mail IN A 192.0.2.1
SPF(Sender Policy Framework) : 迷惑メール対策委員会では設定書式等もわかりやすくより理解が深まりますのでご参考にどうぞ。
6.1. 設定の確認
gmail宛にメールサーバーからメールを送信すればgmail側で設定が正しくされているかヘッダーを表示すると以下のように分かります。
Received-SPF: pass (google.com: domain of hoge@example.gr.jp designates 192.0.2.1 as permitted sender) client-ip=192.0.2.1; Authentication-Results: mx.google.com; spf=pass (google.com: domain of hoge@example.gr.jp designates 192.0.2.1 as permitted sender) smtp.mailfrom=hoge@example.gr.jp