メールサーバ(Postfix)にDKIM(DomainKeys)の対応をしてみる。SPFと違い出ていくメールにも仕掛けが必要、今回はdkim-milterとdk-milterを使用する。また、稼働環境は開発環境がインストールされていないのでRPMを作成してインストールする。
SPF対応はこちら
追記(2008/06/17)
ある先からメールが来ないらしく、以下のようなログが出てたので対応
Jun 17 16:11:11 server postfix/cleanup[32502]: 41B331E789E: milter-reject: END-OF-MESSAGE from hoge.example.com[xxx.xxx.xxx.xxx]: 4.7.1 Service unavailable - try again later; from= to= proto=ESMTP helo=
ダメなメールをみるとDKIM-Signature,DomainKey-Signature,SPF が全部入るパターンなのですが、よくわからず、「dkim-milter-2.4.4 + dk-milter-0.6.0」から「dkim-milter-2.6.0 + dk-milter-1.0.0」へバージョンアップしたところ通過するようになりました。
必要なパッケージのインストール(パッケージ作成用)
yum groupinstall "Development Tools"
yum install sendmail-devel openssl-devel checkinstall
ソースのダウンロード
http://sourceforge.net/projects/dkim-milter/
http://sourceforge.net/projects/dk-milter/
バイナリの作成とRPMパッケージの作成
tar xvzf dk-milter-1.0.0.tar.gz
tar xvzf dkim-milter-2.6.0.tar.gz
dkim-milterにdk-milterもリンクさせる
(DomainKeysのチェックもできるようにする)
cd dkim-milter-2.6.0
ln -s ../dk-milter-1.0.0/libdk ./
設定ファイルの作成
cp site.config.m4.dist devtools/Site/site.config.m4
DomainKeysも検査するようにする
define(`bld_VERIFY_DOMAINKEYS', `true')
最終行にでも追加Manページの場所を変更
define(`confMANROOT', `/usr/share/man/man')
コンパイル
sh ./Build
RPMパッケージファイルの作成
checkinstall -R
インストール
rpm -ihv /usr/src/redhat/RPMS/i386/dkim-milter-2.6.0-1.i386.rpm
dkim-milter用ユーザの作成(groupはmailにする)
useradd -g mail -m -d /var/milter -s /sbin/nologin milter
chmod 755 /var/milter
秘密鍵、証明書の作成
今回は「/etc/pki/dkim-milter」に必要なファイルを作成します。
mkdir /etc/pki/dkim-milter
cd /etc/pki/dkim-milter
dkim-genkey -s セレクタ名 -d ドメイン名
ex) dkim-genkey -s selector -d example.com
chmod 440 selector.private
chown milter:mail selector.private
署名をつけるInternalネットワークのリストを設定
/etc/pki/dkim-filter/ilist
127.0.0.1
192.168.1.0/24
chmod 440 ilist
chown milter:mail ilist
DNSへの設定
DNSのゾーン情報に情報を追加します。selectorの行は上のdkim-genkeyでできるselector.txtの中身をそのまま貼り付けます
_policy._domainkey IN TXT "t=y; o=~"
_domainkey IN TXT "t=y; o=~"
selector._domainkey IN TXT "v=DKIM1; g=*; k=rsa; p= ~省略~" ; ----- DKIM selector for example.com
dkim-milterの起動スクリプト作成
/etc/init.d/dkim-milter
#!/bin/bash
#
#
# dkim-milter:
#
# chkconfig: 2345 75 35
# processname: dkim-milter
# description: dkim milter
source /etc/rc.d/init.d/functions
PROG=/usr/bin/dkim-filter
PID=/var/milter/dkim-milter.pid
SOCKET=inet:10026
#SOCKET=/var/milter/dkim-milter.socket #Socketの場合
DOMAINLIST="example.com" #カンマ区切り
SELECTOR="selector" #セレクタ名
KEY="/etc/pki/dkim-milter/${SELECTOR}.private"
ILIST="/etc/pki/dkim-milter/ilist"
RETVAL=0
start() {
echo -n $"Starting dkim-milter: "
daemon --user milter \
"umask 117; $PROG -p $SOCKET -d $DOMAINLIST -k $KEY -l -P $PID -s $SELECTOR -i $ILIST"
# "umask 117; $PROG -p local:$SOCKET -d $DOMAINLIST -k $KEY -l -P $PID -s $SELECTOR -i $ILIST" #Socketの場合
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/dkim-milter
return $RETVAL
}
stop() {
echo -n $"Shutting down dkim-milter: "
killproc $PROG
# rm -f $SOCKET
RETVAL=$?
echo
[ "$RETVAL" = 0 ] && rm -f /var/lock/subsys/dkim-milter
return $RETVAL
}
restart() {
stop
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status $PROG
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|status}"
RETVAL=1
esac
exit;
chmod 755 dkim-milter
chkconfig --add dkim-milter
chkconfig dkim-milter on
/etc/postfix/main.cf
#DKIM
smtpd_milters = inet:10026
#smtpd_milters = unix:/var/milter/dkim-milter.socket #Socketの場合
non_smtpd_milters = $smtpd_milters
milter_default_action = accept
「milter_default_action」はdkim-milterが死んでいたときはスルーさせるため「accept」にしておく
その他
amavisとかPostfixで他のポートへも転送したりしているものもある場合は、それぞれに「smtpd_milters」の設定をはずしておかないとダメかも
smtp-amavis unix - - n - 2 smtp
-o smtp_data_done_timeout=1200
-o smtp_send_xforward_command=yes
-o disable_dns_lookups=yes
-o smtpd_milters=
127.0.0.1:10025 inet n - n - - smtpd
-o content_filter=
-o local_recipient_maps=
-o relay_recipient_maps=
-o smtpd_restriction_classes=
-o smtpd_client_restrictions=
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks=127.0.0.0/8
-o strict_rfc821_envelopes=yes
-o smtpd_error_sleep_time=0
-o smtpd_soft_error_limit=1001
-o smtpd_hard_error_limit=1000
-o smtpd_milters=
policy unix - n n - 0 spawn
user=nobody argv=/usr/bin/perl /usr/local/lib/policyd-spf-perl
-o smtpd_milters=
確認
DKIMに対応しているアドレス(gmailなど)とやりとりしてヘッダーにDKIMの情報があるか確認
Authentication-Results: hoge.example.com; domainkeys=pass (testing) header.sender=hoge@gmail.com
Authentication-Results: hoge.example.com; dkim=pass (1024-bit key) header.i=@gmail.com
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; ~省略
以下のアドレスへメールを送るとチェックしてメールが返信されてくる。(SPF,DKIM,DomainKeysなどがチェックできる)
check-auth@verifier.port25.com
sa-test@sendmail.net
http://senderid.espcoalition.org/
参考URL
CentOS5へのメール環境構築 (2007/11/01)(TOSAKA.ORG)
CentOS5で,DKIM/SPF/Domainkeyなど使ってみる(Hizumi Blog)
dkim-milter 2.4.2へのアップデート(yellowback’s blog)
最近のコメント