dkim-filterをインストール

メール送信者の正当性を確認するための技術であるDKIMが、IETFに正式に承認されたというので、うちのサーバでも対応させてみました。

ITmedia エンタープライズ:送信ドメイン認証「DKIM」、IETFが承認:
DKIMはドメインレベルでメールに署名、その署名を検証するシステム。メールの受信側が署名の部分からドメイン名を特定、暗号化技術を使って署名を検証する。迷惑メールやスパム、フィッシング対策として有力視されている規格だ。

Debianなので、必要なソフトのインストールは、

aptitude install dkim-filter

で、OKなのだけど、設定でちょっとハマった・・・。


必要なパッケージのインストール

これは、aptitudeなりapt-getなりで、dkim-filterパッケージをインストールすると、依存関係で他に必要なものも入るので、失敗することは、まず無いでしょう。
うちでは、こんな感じで入ってます。

# dpkg -l "*dkim*"
要望=(U)不明/(I)インストール/(R)削除/(P)完全削除/(H)維持
| 状態=(N)無/(I)インストール済/(C)設定/(U)展開/(F)設定失敗/(H)半インストール
|/ エラー=(空欄)無/(H)維持/(R)要再インストール/X=両方(状態,エラーの大文字=異常)
||/ 名前             バージョン    説明
+++-==================-==================-====================================================
ii  dkim-filter        1.0.0.dfsg-1       DomainKeys Identified Mail for Sendmail
ii  libdkim-dev        1.0.14-1           cryptographically identify the sender of email
ii  libdkim0           1.0.14-1           cryptographically identify the sender of email
ii  libmail-dkim-perl  0.26-1             cryptographically identify the sender of email - per

dkim-filterの設定と起動

まずは、/user/share/doc/dkim-filter/README.Debianに従って、キーペアを作成。その後、そのキーを使ってbindのゾーンファイルにTXTレコードを追加して、bind再起動。

次に、/etc/dkim-filter.confを修正。うちの場合は、次にように設定。

# diff -u dkim-filter.conf.dpkg-orig /etc/dkim-filter.conf
--- dkim-filter.conf.dpkg-orig  2007-05-25 17:29:03.000000000 +0900
+++ /etc/dkim-filter.conf       2007-05-26 20:22:06.000000000 +0900
@@ -3,9 +3,9 @@
 # Sign for example.com with key in /etc/mail/dkim.key using
 # selector '2007' (e.g. 2007._domainkey.example.com)
-#Domain                        example.com
-#KeyFile               /etc/mail/dkim.key
-#Selector              2007
+Domain         downtown.jp
+KeyFile                /etc/mail/dkim.key
+Selector       2007
 # This section attempts to describe the default settings.
 # See dkim-filter.conf(5) for more information.
@@ -24,7 +24,7 @@
 ###############################################
 #
 # If enabled, log verification stats here
-#Statistics            /var/run/dkim-filter/dkim-stats
+Statistics             /var/run/dkim-filter/dkim-stats
 #
 # KeyList is a file containing tuples of key information. Requires
 # KeyFile to be unset. Each line of the file should be of the format:

/etc/init.d/dkim-filter startで、dkim-filterを実行しておく。

Postfixの設定

実際には、ここでハマったんだけど・・・。
通常の設定であれば、UNIX socketを利用して、Postfixdkim-filterでメールの検証を行うように設定すれば良いようなのだけど、どうにもうまくいかない。

失敗例

デフォルト状態のdkim-filterを実行すると、/var/run/dkim-filter/dkim-filter.sockが精製されるので、postfixではこいつを参照するように設定すれば良いんだけど・・・。
main.cf

#DKIM
smtpd_milters = unix:/var/run/dkim-filter/dkim-filter.sock
non_smtpd_milters = unix:/var/run/dkim-filter/dkim-filter.sock

を付け加えて、Posftixを再起動。ここで、適当にテストメール(コマンドラインから、swaks -s localhost -t soukaku@example.com -f soukaku@example.jp とか)を送ってみると、

May 26 19:47:48 eswat2 postfix/smtpd[8736]: connect from localhost[127.0.0.1]
May 26 19:47:48 eswat2 postfix/smtpd[8736]: warning: connect to Milter service unix:/var/run/dkim-filter/dkim-filter.sock: No such file or directory
May 26 19:47:48 eswat2 postfix/smtpd[8736]: NOQUEUE: milter-reject: CONNECT from localhost[127.0.0.1]: 451 4.7.1 Service unavailable - try again later; proto=SMTP
May 26 19:47:48 eswat2 postfix/smtpd[8736]: NOQUEUE: milter-reject: EHLO from localhost[127.0.0.1]: 451 4.7.1 Service unavailable - try again later; proto=SMTP
May 26 19:47:48 eswat2 postfix/smtpd[8736]: NOQUEUE: milter-reject: MAIL from localhost[127.0.0.1]: 451 4.7.1 Service unavailable - try again later; proto=ESMTP helo=<eswat2.downtown.jp>
May 26 19:47:48 eswat2 postfix/smtpd[8736]: disconnect from localhost[127.0.0.1]

というエラーがmail.infoに。
/var/run/dkim-filter/dkim-filter.sockのパーミッションとかも疑ったけど、結局原因不明。

成功例

dkim-filterは、UNIX socketではなく、TCPポートを指定して起動させることも出来るので、そっちに変更すること。
socketにするかどうかは、/etc/init.d/dkim-filterを使った起動時にしているする事が出来るので、起動時に指定するオプションを修正する。

# diff -u /etc/init.d/dkim-filter~ /etc/init.d/dkim-filter
--- /etc/init.d/dkim-filter~    2007-05-06 11:12:28.000000000 +0900
+++ /etc/init.d/dkim-filter     2007-05-26 20:22:55.000000000 +0900
@@ -28,7 +28,8 @@
        . /etc/default/dkim-filter
 fi
-DAEMON_OPTS="-x /etc/dkim-filter.conf -u $USER -P $RUNDIR/$NAME.pid -p $RUNDIR/$NAME.sock $DAEMON_OPTS"
+#DAEMON_OPTS="-x /etc/dkim-filter.conf -u $USER -P $RUNDIR/$NAME.pid -p $RUNDIR/$NAME.sock $DAEMON_OPTS"
+DAEMON_OPTS="-x /etc/dkim-filter.conf -u $USER -P $RUNDIR/$NAME.pid -p inet:8891 $DAEMON_OPTS"
 start() {
        # Detect exit status 64 (no key configured) and handle

修正が終わったら、dkim-filterを再起動。lsof -i:8891を実行して

# lsof -i:8891
COMMAND     PID        USER   FD   TYPE   DEVICE SIZE NODE NAME
dkim-filt 14980 dkim-filter    3u  IPv4 19530771       TCP *:8891 (LISTEN)

と設定したポートで待ち受けしていれば、OK。

あとは、postfixmain.cf

# DKIM
smtpd_milters = inet:8891
non_smtpd_milters = inet:8891

に書き換えて、再起動。あとはメールの送信が正常か確認する。

検証

最後にDKIMが正しく動作しているか、の検証になるわけですが、これはこのページの「動作テスト」の項を参考に。
コマンドラインから、echo test | mail sa-test@sendmain.netと叩いて、返送されてくるメールをチェックします。届いたメールの本文中に、

Authentication System:       DomainKeys Identified Mail
   Result:                   DKIM signature confirmed GOOD
   Description:              Signature verified, message arrived intact
   Reporting host:           sendmail.net
   More information:         http://mipassoc.org/dkim/
   Sendmail milter:          https://sourceforge.net/projects/dkim-milter/

と表示されていれば、問題なしで、以上設定終了、となります。

その他

socketで動かすべきなのか、portで動かすべきなのか、どちらが正解ってもんでもないんでしょうけど、少なくともうちではsocketでの動作が出来なかった、のでこういう形で設定してます。「socketでも動いているよ」というDebianユーザの方いらっしゃいましたら、ぜひどう設定したのか教えてください。

設定には、やまやさんのページを参考にさせていただきました。

トラックバック(1)

むか〜し、書いておいたPostfixとその周辺の設定に関するエントリーが、ずいぶんとアクセスがあるので、改めて現在の設定状態を書きだしてみる。 以前書いて... 続きを読む

コメントする