Postfix で dk-milter(dk-filter) を使ってDomainKeys に対応する(CentOS/ScientificLinux編)
ご利用のブラウザは、JavaScript が無効 となっていませんか?
このサイトでは、コンテンツの一部が非表示 、あるいは、コメント、お問い合わせの投稿ができない 、検索ができない ことがあります。
以前の記事
postfix で postfix-policyd-spf-python ( or postfix-policyd-spf-perl ) を使ってSPF認証する(CentOS/ScientificLinux編) では、SPFの送受信側の対処について記述しました。
SPFの対処は、スパム対策の一つです。
今回は、SPFの仕組みに似た
DomainKeys に対応してみたいと思います。
SPF との違いは、メールヘッダ情報 に認証用のキー情報を含めている点になります。
SPF は、あくまでサーバーのIPアドレス(Host名) から、認証作業を行っていたので、
DNSサーバーの情報(送信サーバー情報) 、メール送信者アドレス 、メール送信サーバー から解析し、認証作業を行います。
ここで、DNSサーバーの情報(送信サーバー情報)とメール送信サーバーが一致するか?判定することで認証を行います。
これに対して、DomainKeys は、
DNSサーバーの情報(電子署名キー) 、メール送信者アドレス 、メールヘッダ情報(電子署名) から解析し、認証作業を行います。
ここで、DNSサーバーの情報(電子署名キー)とメールヘッダ情報(電子署名)が一致するか?判定することで認証を行います。
DomainKeys とは、
SPF と同様に送信ドメイン名が正しい送信元から発信されているかを確認(認証)するための技術です。
SPF が、IPアドレス(HOST名)から、その確認(認証)を行うのに対して
DomainKeys は、電子署名から、その確認(認証)を行うものです。
この仕組みから、やるべきことは、以下のとおりです。
メールの送信時
メールの送信時にメールヘッダ情報に電子署名を付加する
DNSサーバーに電子認証公開キーを設定する
メールの受信時
メールの受信時にメールヘッダ情報にDomainKeys , DKIM の電子署名があれば、DNSサーバーへ問い合わせて電子認証公開キーを取得し、認証作業を行う
これを実現するために、dk-milter(dk-filter) を使って Postfix で実現してみます。
現在では、今までDomainKeysに対応していたサーバーもDKIM への対応へと流れています。大きな流れとしては、DomainKeysからDKIM への流れは変わりそうもありません。
DomainKeys のみの対応が意味があるか?少々疑問もありますが、ここでは、DomainKeysについて、簡単に解説してみます。
Postfix で dk-milter(dk-filter) を使ってDomainKeys に対応する
dk-milter(dk-filter) をインストールする
dk-milter(dk-filter) は、CentOS /ScientificLinux では、バイナリパッケージがありません。
そのため、開発バージョンや旧バージョンから debパッケージ を持ってくるか、自前で作成するか、いずれかの手段でバイナリパッケージを準備します。
ここでは、後者にてバイナリパッケージを作成してみます。
dk-milter(dk-filter) は、バージョンによって必要とするOpenSSLのバージョンも異なります。
CentOS5 :
OpenSSL 0.9.8 →
dk-milter(dk-filter) 0.6.0
CentOS6 /
ScientificLinux6 :
OpenSSL 1.0.0 →
dk-milter(dk-filter) 1.0.2
デフォルトでは、上記のようなOpenSSLの提供バージョンになっていますから、それにあったdk-milter(dk-filter)のバージョンもそれぞれ異なることになります。
(
dk-milter(dk-filter) 1.0.0 以上は、
OpenSSL 1.0.0 以上が必要です。)
CentOS5 でも、
OpenSSL 0.9.8 +
dk-milter(dk-filter) 1.0.2 でmakeはできますが、実行すると以下のようなエラーがメールログ(/var/log/maillog)に出力されます。
Feb 6 03:50:58 db2 dk-filter[10456]: CF97234E064: dk_eom(): resource unavailable: d2i_PUBKEY_bio() failed
Feb 6 03:50:58 db2 dk-filter[10456]: CF97234E064 SSL error:0D06B08E:asn1 encoding routines:ASN1_D2I_READ_BIO:not enough data
このエラーが出力される場合、OpenSSLのバージョンを疑うのも一つだと思います。
ここでは、dk-milter(dk-filter) 1.0.2 のインストールについて解説しますが、異なる点は、このバージョン番号のディレクトリ名 だけです。
CentOS5 の方は、その点に気をつけて御覧ください。
$ cd / usr/ local/ src
[src]$ wget "http:// sourceforge. net/ projects/ dk- milter/ files/ DomainKeys% 20Milter/ 1. 0. 2/ dk- milter- 1. 0. 2. tar. gz"
[src]$ tar xfz dk- milter- 1. 0. 2. tar. gz
[src]$ cd dk- milter- 1. 0. 2
[dk-milter-1.0.2]$ mkdir - p / usr/ man/ man3
[dk-milter-1.0.2]$ mkdir - p / usr/ man/ man8
[dk-milter-1.0.2]$ ./Build
...
[dk-milter-1.0.2]$ ./Build install
...
install -c -o bin -g bin -m 555 dk-filter /usr/bin
install -c -o bin -g bin -m 444 dk-filter.0 /usr/man/man8/dk-filter.8
...
上記で完了です。ここで作成したバイナリファイルとマニュアルのインストールまで完了しました。
上記でも、必要に応じてライブラリのインストールが必要な場合があるので注意が必要です。
自分の環境下では、以下のライブラリが必要だったので、一応、記載しておきます。
$ yum install sendmail- devel openssl- devel
...
Is this ok [y/N]: y
...
openssl-develは、そのままOpenSSLが必要なためです。
sendmail-devel は、libmilter が必要なためです。
署名用 の秘密キー、公開キーを作成する
署名に必要な公開キーと秘密キーを作成します。
cshで作成されたスクリプトがdk-milter(dk-filter) にありますので、それを活用します。
※メール送信時、DomainKeysの署名を行わない場合は、以降の作業は不要です。
$ mkdir / etc/ dkim
$ cd / etc/ dkim
[/etc/dkim]$ /usr/local/src/dk-milter-1.0.2/dk-filter/gentxt.csh example_com_selector exmaple. com
example_com_selector._domainkey IN TXT "g=; k=rsa; t=y; p=xxx(公開キー)xxxx" ; ----- DomainKey example_com_selector for exmaple.com
[/etc/dkim]$ ls
example_com_selector.private example_com_selector.public
gentxt.csh は、引数にセレクター名、ドメイン名を指定することができます。(ドメイン名は省略可)
ここでの例では、
example_com_selector.private : 秘密キーファイル
example_com_selector.public : 公開キーファイル
となります。
以降で使用します。
引数のドメイン名は、上記の秘密キー、公開キーとは無関係で、DNSレコードイメージを出力するためのコメント部分にのみに用いられています。(ほどんど無意味です )
コンソールに追加すべきDNSレコードのイメージが出力されますので、出力されたイメージを署名するドメインのDNSレコードに追加します。
DNSのレコードは、概ね以下のような設定を行います。
...
_domainkey 7200 IN TXT "t=y\; o=~\;"
example_com_selector._domainkey 900 IN TXT "g=*\; k=rsa\; t=y\; p=xxx(公開キー)xxxx"
...
_domainkey
ドメインのDomainKeyに対するポリシーを設定します。
→ 詳しくは、DKIMの仕組み DKIMのポリシー情報の設定 を参照してください。
(設定している内容、パラメータに関しては、DKIMはDomainKeyを包含しています。)
ここでの設定例は、以下のような意味になります。
t=y : テストモード
o=~ : 全てのメールが署名されているとは限らない。(署名されるメールもされないメールも存在する。)
<セクター名>._domainkey
ドメインのDomainKeyに対するポリシーを設定します。
→ 詳しくは、DKIMの仕組み DKIMの公開鍵情報の設定 を参照してください。
(設定している内容、パラメータに関しては、DKIMはDomainKeyを包含しています。)
ここでの設定例は、以下のような意味になります。
g=* : 鍵の適用条件パターン (未設定なので、すべてに適用)
k=rsa : 鍵の形式は、RSAを用います。
t=y : テストモード
p=xxx… : 公開キー情報
t=y : は、とりあえず何か署名に問題があってもREJECT(破棄) してはいけないことになっています。
設定の誤りやサーバーがダウンした時などを考えて?t=y の方が良いかもしれません。
dk-milter(dk-filter) の設定を行う
dk-milter(dk-filter) に必要な以下の2つのファイルを作成します。
設定ファイル (/etc/default/dk-filter )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Sane defaults: log to syslog
#DAEMON_OPTS="-l"
# Sign for example.com with key in /etc/mail/domainkey.key using
# selector '2007' (e.g. 2007._domainkey.example.com)
#DAEMON_OPTS="$DAEMON_OPTS -d example.com -s /etc/mail/domainkey.key -S 2007"
# See dk-filter(8) for a complete list of options
#
DAEMON_OPTS ="-l"
DAEMON_OPTS ="$DAEMON_OPTS -d example.com -s /etc/dkim/example_com_selector.private -S example_com_selector"
SOCKET ="inet:8892@127.0.0.1"
# Uncomment to specify an alternate socket
#SOCKET="/var/run/dk-filter/dk-filter.sock" # default
#SOCKET="inet:54321" # listen on all interfaces on port 54321
#SOCKET="inet:12345@localhost" # listen on loopback on port 12345
#SOCKET="inet:12345@192.0.2.1" # listen on 192.0.2.1 on port 12345
9行目 :
-l オプションは、syslogへログ情報を出力します。
10行目 :
メール送信時にDomainKeys の署名を行う場合に編集します。
-d オプション
– メール送信時にDomainKeys の署名を追加するドメイン名を列挙します。複数ドメインを指定する場合はカンマで区切ります。
-s オプション
– 秘密鍵ファイル名を指定します。先の 署名用 の秘密キー、公開キーを作成する で作成した秘密キーファイルになります。
-S オプション
– セレクター名を指定します。先の 署名用 の秘密キー、公開キーを作成する で作成した秘密キーファイルのセレクター名になります。
※署名しない場合は、10行目をコメントアウトすればOKです。
11行目 :
Postfixとの通信手順を指定したものです。
IPアドレス(127.0.0.1 )、ポート番号(8892 )、ソケット種別(inet )の3種をそれぞれ設定しています。
あえて、送信メールに署名せずに、受信メールのDomainKeyのチェックのみを行いたい場合は、オプション -b を指定すると良いでしょう。
例)
デフォルトでは、-b sv (s : 署名あり、v : DomainKeyのチェックあり) となりいずれも実行します。
署名せずにDomainKeyのチェックのみの場合は、-b v のように指定すれば良いでしょう。
起動ファイル (/etc/init.d/dk-filter )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#!/bin/bash
#
# chkconfig: - 85 15
# description: Lightweight inotify based sync daemon
#
# processname: dk-filter
# config: /etc/default/dk-filter
# pidfile: /var/run/dk-filter.pid
# Source function library
. / etc/ init.d/ functions
PATH =/ sbin:/ bin:/ usr/ sbin:/ usr/ bin
DAEMON =/ usr/ bin/ dk-filter
NAME =dk-filter
DESC ="DomainKeys Filter"
RUNDIR =/ var/ run/ $NAME
USER =dk-filter
GROUP =dk-filter
SOCKET =$RUNDIR / $NAME .sock
PIDFILE =$RUNDIR / $NAME .pid
# How long to wait for the process to die on stop/restart
stoptimeout =5
test -x $DAEMON || exit 0
if [ ! -d $RUNDIR ] ; then
mkdir $RUNDIR
chown $USER $RUNDIR
fi
# Include dk-filter defaults if available
if [ -f / etc/ default/ dk-filter ] ; then
. / etc/ default/ dk-filter
fi
DAEMON_OPTS ="-u $USER -P $PIDFILE -p $SOCKET $DAEMON_OPTS "
start( ) {
# Create the run directory if it doesn't exist
if [ ! -d $RUNDIR ] ; then
install -o $USER -g $GROUP -m 2755 -d $RUNDIR || return 2
fi
# Clean up stale sockets
if [ -f $PIDFILE -a -e $SOCKET -a -S $SOCKET ] ; then
pid =` cat $PIDFILE `
if ! ps -C $DAEMON -s $pid >/ dev/ null; then
rm $SOCKET $PIDFILE
fi
fi
daemon $DAEMON $DAEMON_OPTS
}
stop( ) {
killproc $DAEMON
}
case "$1" in
start)
echo -n "Starting $DESC : "
start
echo
;;
stop)
echo -n "Stopping $DESC : "
stop
echo
;;
restart| force-reload)
echo -n "Restarting $DESC : "
stop
start
echo
;;
* )
echo "Usage: $0 {start|stop|status|restart|reload}"
exit 1
;;
esac
exit 0
このデーモン起動スクリプトでは、以下を使用します。
ユーザ : dk-filter (グループ:dk-filter)
ディレクトリ : /var/run/dk-filter
そのため、dk-filterの起動の前に作成しておきます。
$ adduser dk- filter
$ mkdir - p / var/ run/ dk- filter
$ chown dk- filter. / var/ run/ dk- filter
Postfix の設定を行う
ここまで、dk-milter(dk-filter) の設定を終えたら、Postfix の設定を行います。
Postfix の設定は、/etc/postfix/main.cf にて行います。
$ vim / etc/ postfix/ main. cf
...
milter_default_action = accept
milter_protocol = 6
smtpd_milters = inet:127.0.0.1:8892
non_smtpd_milters = inet:127.0.0.1:8892
上記で設定している
inet:127.0.0.1:8892 は、
dk-milter(dk-filter) の設定を行う
で設定した SOCKET=”inet:8892@127.0.0.1″ にあわせる必要があります。
設定する項目の順番と記述方法が異なりますが、IPアドレス(
127.0.0.1 )、ポート番号(
8892 )、ソケット種別(
inet )の3種をそれぞれ設定するだけです。
dk-milter(dk-filter) 起動、Postfixの再起動を行う
全ての設定を終えたら、dk-milter(dk-filter) 起動、Postfixの再起動を行います。
$ /etc/init.d/dk-filter start
Starting DomainKeys Filter: [ OK ]
$ /etc/init.d/postfix restart
postfix を停止中: [ OK ]
postfix を起動中: [ OK ]
これで、全ての設定が完了です。
最後にテストしてみましょう。
以下は、Yahoo!のフリーメールを使って、送信、受信のテストを実施した結果です。
Yahoo!へのメール送信の場合
Authentication-Results: xxxx.mail.kks.yahoo.co.jp from=exmaple.com; domainkeys=pass (ok) ; dkim=neutral (no sig) header.i=@exmaple.com;
DomainKey-Signature: a=rsa-sha1; s=example_com_selector; d=exmaple.com; c=simple; q=dns; b=xxxx(公開キー)... ;
Yahoo!からのメール受信の場合
Authentication-Results: mail.example.com from=test@yahoo.co.jp; domainkeys=pass
DomainKey-Signature:a=rsa-sha1; q=dns; c=nofws;
s=yj20110701; d=yahoo.co.jp;
h=Message-ID:X-YMail-OSG:Received:X-Mailer:Date:From:Subject:To:MIME-Version:Content-Type:Content-Transfer-Encoding;
b=yyyy(公開キー)... ;
ちゃんと pass になったでしょうか?
もし、異なる判定結果となった場合は、
Yahoo!へのメール送信の場合 、DNSの設定をも直してみましょう。また、DomainKey-Signature もヘッダ情報に正しく付加されているかも確認しましょう。
Yahoo!からのメール受信の場合 、Postfix, dk-milter(dk-filter) の設定を直してみましょう。
dk-filterの場合、
no signature での
neutral 出力はありません。
dk-filterの場合、
no signature のコメント出力を行うのは、DomainKeys のDNS設定で、署名が必ず設定されるようなポリシーになっているにも関わらず、署名がない場合のみなので、
fail (失敗)として処理されます。
このように、DomainKeys のDNS設定で、署名が設定されない場合もあるポリシーになっていて署名がない場合 ( 別のmilterでは neutral (no sig) と出力する場合もある ) など、
ポリシーに違反しないようなものは、すべて
Authentication-Results (認証結果情報) をヘッダ情報に出力しません。
各認証結果の意味は、
DKIMの仕組み DKIM/DomaiKeys の認証結果情報 を参照してください。
どうでしょうか、SPFと違って、ちょっと面倒な設定もありますが、これが理解できていると、次のDKIMも簡単に設定できます。
一通り理解されていると良いと思います。
SPF,DomainKeys,DKIM の普及で、フリーメールアドレスの送信者詐称のスパムは随分減ったと思います。
ただ、独自ドメインを使ったスパムは、相変わらず多いです。
それでも、このSPF,DomainKeys,DKIM の設定は、自分が管理する独自ドメインの詐称も防ぐことができますから、是非、おすすめしたいところです。
あわせてSPF,DomainKeys,DKIM の普及が進めば、詐称は減っていくはずですからね。
ご利用のブラウザは、広告ブロック(AdBlockなど) が適用 となっていませんか?
このサイトでは、コンテンツの一部が非表示 、あるいは、コメント、お問い合わせの投稿ができない 、検索ができない ことがあります。
関連記事 :
コメントを投稿 :