メール送信者の正当性を確認するための技術である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を利用して、Postfixがdkim-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。
あとは、postfixのmain.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ユーザの方いらっしゃいましたら、ぜひどう設定したのか教えてください。
- Newer: 中古PCにLinux
- Older: mini終焉?

