ubuntu 10.04 をメールサーバーに (SPF の検証)

先の記事で Postfix にグレイリスティングを組み込んだことで、spam を受け取る数が大幅に減った。
更なる spam 対策の一環として Sender Policy Framework (SPF) を利用した送信元サーバーの検証を行うようにする。

SPF とは、

  1. ある組織が、自分のドメインから送信されるメールは、これこれのメールサーバーからしか送信しないということを宣言する
  2. メールサーバーがそのドメインからのメールを受け取るときに、送信元のサーバーが宣言されているメールサーバーに含まれているか確認する

という方法で、不正なメールサーバーが勝手なドメインを名乗ってメールを送りつけてきたことを判定する仕組みだ
これによって、なりすましメールという spam の一種を防ぐことが可能になる。

この方式の欠点は、送信元が予め宣言しておかなくてはならないことだ。
また、大手のプロバイダやフリーメールでは SPF の宣言がされているところが多くなっているが、その中の一部ユーザーが送ってくる spam を判定することはできないということだ。(先のグレイリスティングでもこの手の spam を判定することは不可能。)

SPF については、プラスαレンタルサーバーの「SPFとは」の Web ページが (言っては悪いが) 以外と平易な表現で比較的わかりやすい。
より詳しく知りたいなら、ZDNET Japan の「メール送信者認証の仕組みを探る(2/2)」の Web ページが良いかもしれない。
なお、SPF は RFC 4408 (英文) -英日対訳(当時の Web ページは消滅。レイアウトは崩れるが Web アーカイブに痕跡あり) - で定義されている。

SPF は先に書いたように宣言と確認の二つに分かれている。
送信するときには予め宣言し、受信のときは他者の宣言を参照して判定する。
このそれぞれは独立しているため、宣言だけして確認はしない、宣言していないが確認はする、宣言して確認もするの何れの組み合わせもできる。

そこでまずは確認できることを優先し、その後に宣言することにする。

ubuntu の標準リポジトリには、SPF の確認を行うためのパッケージが以下に挙げるように複数登録されている。

  • postfix-policyd-spf-perl
  • postfix-policyd-spf-python (または python-policyd-spf)
  • spfmilter
  • spf-milter-python

spfmilter は現時点では Sendmail 専用にパッケージングされている。/etc/init.d/spfmilter ファイル中で Sendmail パッケージに含まれる /usr/sbin/sendmail コマンドを前提にした実装がされている

spf-milter-python は、Postfix と連携させるための UNIX ソケットが root ユーザーに対してのみ書き込みが許可されている (読み込みは全てのユーザー / グループで可。)
この UNIX ソケットに対して、指定したグループに書き込みを許可したりするような、アクセス権の変更はできないようだ。
UNIX ソケットではなく INET ソケットを使うようにすればいいということは分かっている
しかし、なんとなくではあるが INET ソケットの使用を避けたいという思いもある。

こういった理由で結局は、postfix-policyd-spf-python を使うことにした。

Postfix への設定方法は /usr/share/doc/postfix-policyd-spf-python/README.Debian に書いて通りで、postfix の二つの設定ファイル、/etc/postfix/master.cf と /etc/postifx/main.cf のそれぞれに以下の数行を追加するだけだ。

注意が必要なのは、/etc/postfix/main.cf ファイルの smtpd_recipient_restrictions エントリの各パラメーターを記載する順番だ。
postfix-policyd-spf-python のための check_policy_service unix:private/policyd-spf は、必ず reject_unauth_destination より後に指定しなければはならない。
これを reject_unauth_destination より前に書くと、reject_unauth_destination が有効に機能しない状況が生じてしまう。
つまり、SPF で検証できるサーバーにとっては、オープンリレー同様になるということだ。
これは決して望ましいこととは言えないので、smtpd_recipient_restrictions エントリの各パラメーターの記載順は十分に気を付けて欲しい。

後は、postfix-policyd-spf-python 自体の設定を調整して、postfix を再起動するだけだ。

postfix-policyd-spf-python の設定ファイルは /etc/postix-policyd-spf-python/policyd-spf.conf ファイルだ。
このファイルについては、インストール時のままで、特に変更する必要はないだろう。

ただし、SPF については以前の記事にも書いたように、サーバー更改のときなどにそれに合わせた SPF レコードの更新をし忘れている事例がいくつか見られる。

気がついたときにホワイトリストに追加して救済すると共に、サイトの管理者宛に SPF レコードの不備をメールで通達している。
メールで通達してから数日ないしはせいぜい数週間のうちには、こういった不備は改修されるが、「SPF を使うなら part3」で示したサイトに関してだけは、半年以上が経過しても一向に改修される気配がない。
これについては、オンライン ショップの広告メールだということもあり、受信できなくても全く困らないので放置してある。

このような SFP レコードの不備があるサイトからのメールを取りこぼしたくないときは、先に挙げた /etc/postfix/master.cf ファイルに Mail_From_reject = False (「SPF を使うなら part3」のような状況でも救済するなら更に HELO_reject = False) の行を追加すれば良いだろう。

以下は、postfix-policyd-spf-python の設定ファイルで指定できる全ての項目と、それに関するコメントをできる限り勝手訳したものだ。
オリジナルのファイルは /usr/share/doc/postfix-policyd-spf-python/policyd-spf.conf.completed だ。
良く意味が分からず訳しきれなかった箇所は原文のままにしてある。

関連記事

コメントを残す