Postfix で dkim-milter(dkim-filter) を使ってDKIM に対応する
dkim-milter(dkim-filter) をインストールする
dkim-milter(dkim-filter) は、CentOS 、Scientific Linux いずれも、epel から バイナリパッケージが提供されていますので、ここでは、単純にyumを使ってインストールするだけです。
$ yum install dkim-milter --enablerepo=epel
...
Is this ok [y/N]: y
...
|
これだけです。簡単ですね。
署名用 の秘密キー、公開キーを作成する
署名に必要な公開キーと秘密キーを作成します。
dkim-milter(dkim-filter) をインストールすると、dkim-genkey というスクリプトファイルも同時にインストールされます。キーファイルを作成する再には、これを活用します。
※メール送信時、DKIMの署名を行わない場合は、以降の作業は不要です。
$ mkdir /etc/dkim
$ cd /etc/dkim
[/etc/dkim]$ dkim-genkey -s example_com_selector -d exmaple.com
[/etc/dkim]$ ls
example_com_selector.private example_com_selector.txt
|
dkim-genkey は、引数に セレクター名(-s )、ドメイン名(-d )を指定することができます。(ドメイン名は省略可)
ここでの例では、
example_com_selector.private : 秘密キーファイル
example_com_selector.txt : 公開キーファイル(DNSのレコードイメージになります)
となります。
以降で使用します。
引数のドメイン名は、上記の秘密キー、公開キーとは無関係で、DNSレコードイメージを出力するためのコメント部分にのみに用いられています。(ほどんど無意味です)
example_com_selector.txt の出力イメージを署名するドメインのDNSレコードに追加します。
example_com_selector._domainkey IN TXT "v=DKIM1; g=*; k=rsa; p=xxx(公開キー)xxxx" ; ----- DKIM example_com_selector for example.com
|
DNSのレコードは、概ね以下のような設定を行います。
...
_policy._domainkey 7200 IN TXT "t=y\; o=~\;"
example_com_selector._domainkey 900 IN TXT "v=DKIM1\; g=*\; k=rsa\; t=y\; p=xxx(公開キー)xxxx"
...
|
_policy._domainkey
ドメインのDKIMに対するポリシーを設定します。
→ 詳しくは、DKIMの仕組み DKIMのポリシー情報の設定 を参照してください。
DomainKeyとの違いは、名前の先頭に_policyを付けるか否かの違いでしょう。
ここでの設定例は、以下のような意味になります。
- t=y : テストモード
- o=~ : 全てのメールが署名されているとは限らない。(署名されるメールもされないメールも存在する。)
<セクター名>._domainkey
ドメインのDomainKeyの公開キー情報を設定します。
→ 詳しくは、DKIMの仕組み DKIMの公開鍵情報の設定 を参照してください。
DomainKeyとの違いは、DKIMのバージョン情報の有無でしょう。(以下の項目参照)
ここでの設定例は、以下のような意味になります。
- v=DKIM1 : DKIMのバージョン(この情報はDomainKeyにはない)
- g=* : 鍵の適用条件パターン (未設定なので、すべてに適用)
- k=rsa : 鍵の形式は、RSAを用います。
- t=y : テストモード
- p=xxx… : 公開キー情報
t=y : は、とりあえず何か署名に問題があってもREJECT(破棄) してはいけないことになっています。
設定の誤りやサーバーがダウンした時などを考えて?t=y の方が良いかもしれません。
dkim-milter(dkim-filter) の設定を行う
dkim-milter(dkim-filter) の設定ファイル には、dkim-filter用として2つの設定ファイルがあります。
1つは、システムデフォルト設定値としての /etc/sysconfig/dkim-filter です。
もう一つは、/etc/mail/dkim-milter/dkim-filter.conf で、dkim-filter の通常の設定ファイルになります。
一般的には、このファイルを編集して使用します。
ここでは、/etc/mail/dkim-milter/dkim-filter.conf の編集を行ってみます。
以下は、その設定例です。
設定ファイル (/etc/mail/dkim-milter/dkim-filter.conf )
...
## Domain name[,...]
## default (none)
##
## Specify for which domain(s) signing should be done. No default; must
## be specified for signing.
# Domain example.com
Domain example.com
...
## KeyFile filename
##
## Specifies the path to the private key to use when signing. Ignored if
## Keylist is set. No default; must be specified for signing.
# KeyFile /var/db/dkim/example.private
KeyFile /etc/dkim/example_com_selector.private
## KeyList filename
##
## Specifies the path to the list of keys and signing domains to be applied
## by the signing filter. The entries in this file should be of the form:
##
## pattern:domain:keypath
##
## ...where "pattern" is a pattern of user@host to match, with "*" being
## allowed as a wildcard; "domain" is the signing domain; and "keypath"
## is the path to the private key to use to generate signatures for such
## users. The selector used will be the filename portion of "keypath".
## Blank lines are ignored, and the hash ("#") character is interpreted
## as the beginning of a comment. See dkim-filter.conf(5) for more
## information.
#KeyList /etc/mail/dkim-milter/keys/keylist
...
## Selector name
##
## The name of the selector to use when signing. No default; must be
## specified for signing.
# Selector my-selector-name
Selector example_com_selector
...
## Socket socketspec
##
## Names the socket where this filter should listen for milter connections
## from the MTA. Required. Should be in one of these forms:
##
## inet:port@address to listen on a specific interface
## inet:port to listen on all interfaces
## local:/path/to/socket to listen on a UNIX domain socket
# Socket local:/var/run/dkim-milter/dkim-milter.sock
Socket inet:8891@127.0.0.1
...
|
Domain
メール送信時にDKIMの署名を追加するドメイン名を列挙します。複数ドメインを指定する場合はカンマで区切ります。
KeyFile
秘密鍵ファイル名を指定します。先の
署名用 の秘密キー、公開キーを作成する で作成した秘密キーファイルになります。
KeyList
KeyFileを使うので、ここではコメントアウト。
Selector
セレクター名を指定します。先の
署名用 の秘密キー、公開キーを作成する で作成した秘密キーファイルのセレクター名になります。
Socket
Postfixとの通信手順を指定したものです。
IPアドレス(127.0.0.1)、ポート番号(8891)、ソケット種別(inet)の3種をそれぞれ設定しています。
dk-filterなどの別のソケットを使う場合は、そのポート番号とは異なるポート番号を使用するようにします。
設定を終えたら、ここで設定した秘密鍵ファイルの所有者を dkim-milter (実行ユーザ)へ変更しておきます。
$ chown dkim-milter. /etc/dkim/example_com_selector.private
|
Postfix の設定を行う
ここまで、dkim-milter(dkim-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:8891
non_smtpd_milters = inet:127.0.0.1:8891
|
上記で設定している
inet:127.0.0.1:8891 は、
dkim-milter(dkim-filter) の設定を行う
で設定した SOCKET=”inet:8891@127.0.0.1″ にあわせる必要があります。
設定する項目の順番と記述方法が異なりますが、IPアドレス(
127.0.0.1)、ポート番号(
8891)、ソケット種別(
inet)の3種をそれぞれ設定するだけです。
DomainKeys と同時にしようする場合は、先のとおりポート番号に気をつけます。また、/etc/postfix/
main.cf は、以下のような設定になります。
$ vim /etc/postfix/main.cf
...
milter_default_action = accept
milter_protocol = 6
smtpd_milters = inet:127.0.0.1:8891 inet:127.0.0.1:8892
non_smtpd_milters = inet:127.0.0.1:8891 inet:127.0.0.1:8892
|
ブランクをはさんで列挙する点に注意してください。ここでは、DomainKeys のポート番号 : 8892 , DKIM のポート番号 : 8891 としています。
dkim-milter(dkim-filter) 起動、Postfixの再起動を行う
全ての設定を終えたら、dkim-milter(dkim-filter) 起動、Postfixの再起動を行います。
$ /etc/init.d/dkim-milter start
Starting DomainKeys Identified Mail Milter (dkim-filter): [ OK ]
$ /etc/init.d/postfix restart
postfix を停止中: [ OK ]
postfix を起動中: [ OK ]
|
これで、全ての設定が完了です。
dkim-milter(dkim-filter) の動作確認を行う
最後にテストしてみましょう。
Yahoo!のフリーメールを使っての動作確認を行う
以下は、Yahoo!のフリーメールを使って、送信、受信のテストを実施した結果です。いずれも DomainKeys , DKIM 両方の設定、判定が行われています。
Yahoo!へのメール送信の場合
Authentication-Results: xxxx.mail.kks.yahoo.co.jp from=exmaple.com; domainkeys=pass (ok); dkim=pass (ok) header.i=@exmaple.com;
DomainKey-Signature: a=rsa-sha1; s=example_com_selector; d=exmaple.com; c=simple; q=dns; b=xxxx(公開キー);
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=exmaple.com; s=srinfun; t=1338345264; bh=WUs/S8aSRC/sQWX+teNDq9/P/VwCR9oY/5V1Qr4x5rI=; h=To:Subject:Message-Id:Date:From; b=xxxx(公開キー);
|
Yahoo!からのメール受信の場合
Authentication-Results: mail.example.com; dkim=pass (1024-bit key) header.i=@yahoo.co.jp; dkim-adsp=none
Authentication-Results: mail.example.com from=test@yahoo.co.jp; domainkeys=pass
Received: (qmail 92883 invoked by uid 60001); 30 May 2012 02:14:11 -0000
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.co.jp; s=yj20110701; t=1338344051; bh=sgeDMsCFY/fqRH9AFEKt6uISCBqq8oqGqd/WfoxdJIQ=; h=Message-ID:X-YMail-OSG:Received:X-Mailer:Date:From:Subject:To:MIME-Version:Content-Type:Content-Transfer-Encoding; b=yyyy(公開キー)
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の設定をも直してみましょう。また、DKIM-Signature もヘッダ情報に正しく付加されているかも確認しましょう。
Yahoo!からのメール受信の場合、Postfix, dkim-milter(dkim-filter) の設定を直してみましょう。
署名なしのメールを使っての動作確認を行う
dkim-milter.confの設定を常に認証結果を出力するように変更すると、署名がないメールを送信することで、以下のような認証結果が出力されるようになります。
設定ファイル (/etc/mail/dkim-milter/dkim-filter.conf )
...
AlwaysAddARHeader yes
...
|
dkim-filterを再起動します。
$ /etc/init.d/dkim-milter restart
Shutting down DomainKeys Identified Mail Milter: [ OK ]
Starting DomainKeys Identified Mail Milter (dkim-filter): [ OK ]
|
署名なしのメールを送信してみてください。
以下のように署名なしの認証結果が出力されると思います。
...
Authentication-Results: local.exmaple.com; dkim=none (no signature)
header.i=unknown; x-dkim-adsp=none
...
|
どうでしょうか、DomainKeysとほとんど同じです。DKIMの場合は、キーファイルを複数指定することもできます。その場合、ファイル指定(-Kオプションを使います)になります。
SPF,DomainKeys,DKIM と設定を行ってきました。この3つの設定で、少なくとも管理している独自ドメインのほとんどの詐称は見抜くことができるようになるでしょう。
この設定は、フリーメールからの詐称メール、自管理の独自ドメインの詐称メールに関しては、かなりの効果があります。もちろん、メール中継をしっかり管理していれば・・・の話ですが。
いずれにせよ、SPF,DomainKeys,DKIM の設定は、間違いなくおすすめです。
コメントを投稿 :