メール送信ドメイン認証(DKIM) dkimproxy

SPFに続いてDKIMの設定をしてみました。(ディーキムと読むらしい)

DKIMがRFCに承認された事、設定内容は違いますが、設定する箇所は同じなので同時に設定することにしました。

DKIMがSPFと違うところは、メールのヘッダに署名を追加して送信する必要があるところです。そのヘッダの署名とDNSのTXTレコードで公開されている公開鍵で認証を行い、署名したサーバから送信されたあとでメールが改竄されていないか等確認することができます。

SPFだと.forwardなどで転送しているメールはfailしてしまいますが、DKIMはpassします。逆にDKIM-Signatureを削除しないメーリングリストサーバではSubjectなどの改変が起きるのでDKIMはfailします。両方認証して総合的に判断するようにするのが良いようです。

今のところスパムメール以外ではgmailぐらいからしか署名のついたメールは届きませんが…。

ちょっと調べてみると、Debian(unstable)にdkim-filter(dkim-milterのよう)が現在はあります。dkimproxyも作業中にはなっていますが現在のところはパッケージとしては無いみたいです。

dkim-filterはなぜかうまく署名が思い通りについてくれないのでdkimproxyの自分用のパッケージを作り上げてインストール。

ドキュメントどおり設定すると、サーバ外からのメールの送信はsubmissionポートだけに限定することで署名を行うことになります。このサーバではsubmissionポートにすべて移行しているので問題無しです。

SquirrelMailからの送信もsubmissionポートに変更すれば署名して送信されます。Mailmanではmm_cfg.pyにSMTPPORT=587とすることでsubmissionポートから署名して送信できます。

Mailmanは最近の物では受け取った署名を削除してくれるので、サーバで再署名して送信していることになるので問題ありません。Mailmanのスパムフィルタで認証にfailしたメールは保留か拒否するようにしておけばいいと思います。(少し前のMailmanでは削除してくれないようで、そのまま署名が送られてくるため、参加しているメーリングリストによってはDKIM認証でfail している事があります。)

残りはphp,cgi等からsendmailコマンドやmailコマンドを経由して送られるサーバから発送されるメールです。これはdkimproxyのFAQにあるとおり、

pickup .........
-o content_filter=dksign:[127.0.0.1]:10028

とすることで署名して送信されます。(amavisd-newを使っているのでドキュメントとはポート番号は変えています。)

受信側はSPF同様、最近のspamassassinでは認証できますが、こちらでも認証情報をヘッダに付けるため、dkimproxy.inを経由して受信します。