メール送信者の正当性を確認するための技術である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ユーザの方いらっしゃいましたら、ぜひどう設定したのか教えてください。
設定には、やまやさんのページを参考にさせていただきました。
トラックバック(1)
むか〜し、書いておいたPostfixとその周辺の設定に関するエントリーが、ずいぶんとアクセスがあるので、改めて現在の設定状態を書きだしてみる。 以前書いて... 続きを読む
コメントする