SPFチェック機構の実装はlaunchpad.netにホストされているそうな。最近オープンソースホスティングサービスが増えすぎて何がなんやらわけわかめ。で、一度はソースからやってみたものの実はepelで何も考えずにできるのが後で分かったのでソースからやったのは全部消した。

さて、CentOS 6+postfixの組み合わせにSPFチェックを追加したい。現在ではソフトウェアの入手は冒頭で述べた通りepelがあれば一発だ。

# yum install pypolicyd-spf

で依存関係も含めてがさっと入る(全部epelにある)。入るのは1.2なのでちょっと古い(最新版は1.3.1)。

さて、このepelのyumで取ってきたpypolicyd-spfコマンドは、manには/usr/bin/pypolicyd-spfと書かれてるんだけど、実際は/usr/libexec/postfix/pypolicyd-spfのようだ。
これはlaunchpad.netから取ってきたソース(?)からsetup.pyで入れた場合は確かに/usr/binに入るので、epelの中の人が入れ先は変えたけどmanページを直してないという事なのだろう。

後はmain.cfで

smtpd_recipient_restrictions = permit_mynetworks,
    reject_unauth_destination,
    check_policy_service unix:private/policyd-spf,
    permit

などと書いて(※1)、master.cfで

policyd-spf unix - n n - 0 spawn
    user=nobody argv=/usr/libexec/postfix/policyd-spf

などと書いてpostfixを再起動すればOK。ところが、デフォルトのままだとhardfailの場合にメールをリジェクトしてしまう。
現時点ではhardfailやsoftfailでもとりあえずメールを受け取る方が良いと思われる。
その制御はetc/python-policyd-spf/policyd-spf.confをちょっと変える(多分変えた後postfixの再起動が要る)。

Mail_From_reject = Fail
↓
Mail_From_reject = False

もちろんSPFチェックはメールのドメイン部に対してDNSでtxtレコードを引く事でチェックしているので、SPFチェックを組み込むサーバーはDNSが引けるようになってないといけない(メール送受信サーバーとして使ってる場合は普通OKだが、外→中へのメール中継だけをするようなリレーサーバーだとDNSを潰している可能性がある)。

(※1)main.cfでpermit_auth_destinationとrejectの方を使いたい場合は

smtpd_recipient_restrictions = permit_mynetworks,
    check_policy_service unix:private/policyd-spf,
    permit_auth_destination,
    reject

という風に順番を逆にしてあげないといけない。これを

smtpd_recipient_restrictions = permit_mynetworks,
    permit_auth_destination,
    check_policy_service unix:private/policyd-spf,
    reject

にすると、受け取れるメールの場合permit_auth_destinationで判定が終わるのでSPFチェックができなくなる。