Postfix で dkim-milter(dkim-filter) を使ってDKIM に対応する(Debian/Ubuntu編)
ご利用のブラウザは、JavaScript が無効 となっていませんか?
このサイトでは、コンテンツの一部が非表示 、あるいは、コメント、お問い合わせの投稿ができない 、検索ができない ことがあります。
以前の記事
postfix で postfix-policyd-spf-python ( or postfix-policyd-spf-perl ) を使ってSPF認証する(Debian/Ubuntu編) では、SPFの送受信側の対処について記述しました。
Postfix で dk-milter(dk-filter) を使ってDomainKeys に対応する(Debian/Ubuntu編) では、DomainKeysの対処について記述しました。
今回は、DomainKeys そっくりの DKIM に対応してみたいと思います。
DomainKeys とは、
SPF と同様に送信ドメイン名が正しい送信元から発信されているかを確認(認証)するための技術です。
SPF が、IPアドレス(HOST名)から、その確認(認証)を行うのに対して
DomainKeys は、電子署名から、その確認(認証)を行うものです。
DKIM (D omainK eys I dentified M ail)とは、
DomainKeys とCisco Systemsが提案したIIM ( I dentified I nternet M ail )という規格をあわせたものになっていて、
DomainKeys にそっくりになっています。しかし、別物です。
よく混同されるのは、この生い立ちにもあります。
違いとして多く取り上げられているのが、
DomainKeys がサポートしていたのがドメイン単位での認証だったのに対して、
DKIM はIIMと同じく送信者アドレス単位での認証も可能としている点でしょう。
その他にもいろんな詳細な点で違いが見られます。
逆に、このような細かい点での違いはあるものの大きな仕組みでは、ほぼ同じと言ってよいと思います。ただ、何度も言いますがDomainKeys , DKIM は別のものです。
DomainKeys と同じように、やるべきことは、以下のとおりです。
メールの送信時
メールの送信時にメールヘッダ情報に電子署名を付加する
DNSサーバーに電子認証公開キーを設定する
メールの受信時
メールの受信時にメールヘッダ情報にDomainKeys , DKIM の電子署名があれば、DNSサーバーへ問い合わせて電子認証公開キーを取得し、認証作業を行う
これを実現するために、dkim-milter(dkim-filter) を使って Postfix で実現してみます。
現在では、今までDomainKeysに対応していたサーバーもDKIM への対応へと流れています。大きな流れとしては、DomainKeysからDKIM への流れは変わりそうもありません。
この流れからも DKIMは、DomainKeys 以上に対応すべきものであるでしょう。ここでは、DKIMについて、簡単に解説してみます。
Postfix で dkim-milter(dkim-filter) を使ってDKIM に対応する
dkim-milter(dkim-filter) をインストールする
dkim-milter(dkim-filter) は、Debian 、Ubuntu いずれも、バイナリパッケージが提供されていますので、ここでは、単純にaptを使ってインストールするだけです。
$ apt-get install dkim- filter
...
これだけです。 簡単ですね。
署名用 の秘密キー、公開キーを作成する
署名に必要な公開キーと秘密キーを作成します。
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つは、dk-filter と同じように /etc/default/dkim-filter のように
/etc/default/ 配下にあるデフォルト設定ファイルになります。
もう一つは、/etc/dkim-filter.conf で、dkim-filter の通常の設定ファイルになります。
一般的には、このファイルを編集して使用します。Postfixとの連携上、ソケットを使用するため /etc/default/dkim-filter の編集は行う必要があります。
ここでは、dk-filter との対比も兼ねたいので、/etc/default/dkim-filter の編集を行ってみます。
以下は、その設定例です。
設定ファイル (/etc/default/dkim-filter )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Command-line options specified here will override the contents of
# /etc/dkim-filter.conf. See dkim-filter(8) for a complete list of options.
#DAEMON_OPTS=""
#
DAEMON_OPTS ="-l"
DAEMON_OPTS ="$DAEMON_OPTS -d example.com -k /etc/dkim/example_com_selector.private -s example_com_selector"
SOCKET ="inet:8891@127.0.0.1"
# Uncomment to specify an alternate socket
# Note that setting this will override any Socket value in dkim-filter.conf
#SOCKET="local:/var/run/dkim-filter/dkim-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
6行目 : -l オプションは、syslogへログ情報を出力します。
7行目 : メール送信時にDKIMの署名を行う場合に編集します。
-d オプション
– メール送信時にDKIMの署名を追加するドメイン名を列挙します。複数ドメインを指定する場合はカンマで区切ります。
-k オプション
– 秘密鍵ファイル名を指定します。先の 署名用 の秘密キー、公開キーを作成する で作成した秘密キーファイルになります。
-s オプション
– セレクター名を指定します。先の 署名用 の秘密キー、公開キーを作成する で作成した秘密キーファイルのセレクター名になります。
※署名しない場合は、10行目をコメントアウトすればOKです。
8行目 : Postfixとの通信手順を指定したものです。
IPアドレス(127.0.0.1 )、ポート番号(8891 )、ソケット種別(inet )の3種をそれぞれ設定しています。
dk-filterなどの別のソケットを使う場合は、そのポート番号とは異なるポート番号を使用するようにします。
設定を終えたら、ここで設定した秘密鍵ファイルの所有者を dkim-filter (実行ユーザ)へ変更しておきます。
$ chown dkim- filter. / etc/ dkim/ example_com_selector. private
Postfix の設定を行う
ここまで、dkim-milter(dkim-filter) の設定を終えたら、Postfix の設定を行います。
Postfix の設定は、/etc/postfix/main.cf にて行います。
...
# DKIM
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 は、以下のような設定になります。
...
# DomainKeys/DKIM
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-filter start
Starting DKIM Filter: dkim-filter.
$ /etc/init.d/postfix restart
Stopping Postfix Mail Transport Agent: postfix.
Starting Postfix Mail Transport Agent: postfix.
これで、全ての設定が完了です。
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) の設定を直してみましょう。
どうでしょうか、DomainKeysとほとんど同じです。DKIMの場合は、キーファイルを複数指定することもできます。その場合、ファイル指定(-Kオプションを使います)になります。
SPF,DomainKeys,DKIM と設定を行ってきました。この3つの設定で、少なくとも管理している独自ドメインのほとんどの詐称は見抜くことができるようになるでしょう。
この設定は、フリーメールからの詐称メール、自管理の独自ドメインの詐称メールに関しては、かなりの効果があります。もちろん、メール中継をしっかり管理していれば・・・の話ですが。
いずれにせよ、SPF,DomainKeys,DKIM の設定は、間違いなくおすすめです。
ご利用のブラウザは、広告ブロック(AdBlockなど) が適用 となっていませんか?
このサイトでは、コンテンツの一部が非表示 、あるいは、コメント、お問い合わせの投稿ができない 、検索ができない ことがあります。
関連記事 :
コメントを投稿 :