PostfixでDomainKeys/DKIM認証を実装しよう

前準備とインストール

PostfixでDomainKeys/DKIM認証を実装するために、dkfilterとdkimproxyを導入します。
dkfilter/dkimproxyはyumで提供されていないのでソースからインストールしてやる必要があります。
依存関係などで必要なPerlモジュールを先にインストールしておきましょう。
用意するモジュールは下記の通りです。

yumで提供されていない物もありますので、今回はcpanを使ってPerlモジュールを用意します。

# cpan
cpan> install Crypt::OpenSSL::RSA Digest::SHA Digest::SHA1 Error Mail::Address MIME::Base64 Net::DNS Net::Server Test::More

各フィルターを使用するdkfilterというユーザーを作成しておきます。
ユーザーの作成はこちらを参照してください。
続いてdkimproxyとdkfilter本体をダウンロードしてきてインストールします。

# wget http://jason.long.name/dkimproxy/dkimproxy-0.15.tar.gz
# tar zxvf dkimproxy-0.16.tar.gz
# cd dkimproxy-0.16
# ./configure --prefix=/usr/local/dkimproxy
# make install

# wget http://jason.long.name/dkfilter/dkfilter-0.11.tar.gz
# tar zxvf dkfilter-0.11.tar.gz
# cd dkfilter-0.11
# ./configure --prefix=/usr/local/dkfilter
# make install

./configure --prefix= でインストール先を選択できます。
今回はdkimproxyを/usr/local/dkimproxyに、domainkeysを/usr/local/dkfilterとしました。

inbound filterの設定

inbound filterを設定していきます。
inbound filterは外から来るメールに対し、そのメールに付加されているDomainKeys/DKIMの署名が正しいか認証するためのフィルタです。
Domainkeysの認証の結果は、メールのAuthentication-Resultsヘッダに加えられます。
DKIMの認証の結果は、メールのX-DKIM-Authentication-Resultsヘッダに加えられます。
それぞれのヘッダにpassの文字が見えれば認証に成功したことを示します。

フィルタの設定はPostfix側で行います。
/etc/postfix/master.cfを編集します。
以下を追記してください。

smtp inet n - n - - smtpd
  -o smtpd_proxy_filter=127.0.0.1:10025
  -o smtpd_client_connection_count_limit=10

127.0.0.1:10026 inet n - n - - smtpd
  -o smtpd_authorized_xforward_hosts=127.0.0.0/8
  -o smtpd_client_restrictions=
  -o smtpd_helo_restrictions=
  -o smtpd_sender_restrictions=
  -o smtpd_recipient_restrictions=permit_mynetworks,reject
  -o smtpd_data_restrictions=
  -o mynetworks=127.0.0.0/8
  -o receive_override_options=no_unknown_recipient_checks
  -o smtpd_proxy_filter=127.0.0.1:10030

127.0.0.1:10031 inet n - n - - smtpd
  -o smtpd_authorized_xforward_hosts=127.0.0.0/8
  -o smtpd_client_restrictions=
  -o smtpd_helo_restrictions=
  -o smtpd_sender_restrictions=
  -o smtpd_recipient_restrictions=permit_mynetworks,reject
  -o smtpd_data_restrictions=
  -o mynetworks=127.0.0.0/8
  -o receive_override_options=no_unknown_recipient_checks

outbound filterの設定

outbound filterの設定をしていきます。
outbound filterはメールを転送する際に署名を付けるフィルターになります。
尚、今回はdkimの署名のみを付加する設定とします。
dkimとdomainkeyを同時に利用しようとすると、わたしの理解力ではどうしても後から署名を付けた方が検証に失敗してしまうからです。
では、dkimproxyのインストール先ディレクトリに秘密鍵と公開鍵を作成しましょう。

# cd /usr/local/dkimproxy
# openssl genrsa -out private.key 1024
# openssl rsa -in private.key -pubout -out public.key

続いてDNSサーバーのtxtレコードにポリシーとセレクターを追加します。

まずはポリシーです。
_domainkey.mizushima.ne.jp. 60 IN TXT "t=y; o=~; n=http://mizushima.ne.jp/MailStructure/sender_certification/DomainKeys-DKIM/; r=mns@mizushima.ne.jp;"

t=y テストモードを示します。
o=~ 全てのメールにDomainKeysの署名を付加することを示します。
n=http://mizushima.ne.jp/MailStructure/sender_certification/DomainKeys-DKIM/ メモ欄です。記入は任意です。
r=mns@mizushima.ne.jp 何かあった時の連絡先です。ここも任意です。

続いてセレクターです。
selector1._domainkey.mizushima.ne.jp. 300 IN TXT "k=rsa; t=y; p=MIGfMA0GCSqGSIb3DQ〜以下略"

ここでselector1というのはセレクターと呼ばれる物で、outbound filterを起動する時に同じセレクターを指定します。
k=rsaが鍵の種類です、現在はrsaしか利用できません。
t=yはテストモードを示します。
p=MIGfMA0GCSqGSIb3DQ〜が先ほど作成した公開鍵/usr/local/dkimproxy/pulic.keyの中身です。
うちの例を参考にしてください。

$TTL 86400
@         IN  SOA   mizushima.ne.jp. root.mizushima.ne.jp. (
                  2006092301
                  3600
                  900
                  604800
                  86400 )
          IN  NS   mizushima.ne.jp.
          IN  MX 10 mizushima.ne.jp.
@          IN  A  121.1.228.232
_domainkey.mizushima.ne.jp. 60 IN TXT "t=y; o=~; n=http://mizushima.ne.jp/MailStructure/sender_certification/DomainKeys-DKIM/; r=mns@mizushima.ne.jp;"
selector1._domainkey.mizushima.ne.jp. 300 IN TXT "k=rsa; t=y; p=MIGfMA0GCSqGSIb3DQ〜以下略"

編集が完了したらBINDを再起動させます。

# /etc/rc.d/init.d/named restart

今の設定が正しいか確認します。
ポリシーの確認はhttp://domainkeys.sourceforge.net/policycheck.htmlでできます。

dkfilterを使ってPostfixでDomainKeys認証を実装しよう

ドメインを入力し、Submitをクリックします。


PostfixでDKIMとDomainKeysを実装しよう

This selector appears valid.の文字が確認できれば設定はOKです。

セレクターの確認はhttp://domainkeys.sourceforge.net/selectorcheck.htmlでできます。


PostfixでDKIMとDomainKeysを実装しよう

セレクタ名._domainkey.mizushima.ne.jpを入力し、submitをクリックするだけでOKです。


PostfixでDKIMとDomainKeysを実装しよう

This selector appears valid.の文字が確認できれば設定はOKです。

引き続き、再びPostfixの設定をします。
設定はinboundと同様/etc/postfix/master.cfです。
下記の内容を追記してください。

#ポート587=サブミッションポートに入ってきたメールに署名します
#OutlookExpress,WindowsメールはサブミッションポートのSSL接続には対応していません
submission inet n - n - - smtpd
  -o smtpd_tls_wrappermode=yes
  -o smtpd_etrn_restrictions=reject
  -o smtpd_sasl_auth_enable=yes
  -o content_filter=dksign:[127.0.0.1]:10027
  -o receive_override_options=no_address_mappings
  -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject

#ポート465のSSL接続で入ってきたメールに署名します
smtps inet n - n - - smtpd
  -o smtpd_tls_wrappermode=yes
  -o smtpd_etrn_restrictions=reject
  -o smtpd_sasl_auth_enable=yes
  -o content_filter=dksign:[127.0.0.1]:10027
  -o receive_override_options=no_address_mappings
  -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject

dksign unix - - n - 10 smtp
  -o smtp_send_xforward_command=yes
  -o smtp_discard_ehlo_keywords=8bitmime

127.0.0.1:10028 inet n - n - 10 smtpd
  -o content_filter=
  -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
  -o smtpd_helo_restrictions=
  -o smtpd_client_restrictions=
  -o smtpd_sender_restrictions=
  -o smtpd_recipient_restrictions=permit_mynetworks,reject
  -o mynetworks=127.0.0.0/8
  -o smtpd_authorized_xforward_hosts=127.0.0.0/8

dkimproxyとdkfilterの起動スクリプトが、dkimproxy,dkfilterを解凍したディレクトリに用意されています。
これを/etc/rc.d/init.d/にコピーして、ディレクトリやホスト名を編集しておきましょう。
# cd
# mv ./dkimproxy-0.16/sample-dkim-init-script.sh /etc/rc.d/init.d/dkimproxy
# mv ./dkfilter-0.11/sample-dkfilter-init-script.sh /etc/rc.d/init.d/dkfilter


PostfixでDKIMとDomainKeysを実装しよう
                        クリックで拡大

Webmin上のシステムから、起動およびシャットダウンをクリックします。


PostfixでDKIMとDomainKeysを実装しよう
                        クリックで拡大

dkfilterとdkimproxyが見えますね。
やることは同じですので、ここではdkimproxyの例だけ示します。
dkimproxyをクリックしてください。


PostfixでDKIMとDomainKeysを実装しよう
                        クリックで拡大

まずはインストールディレクトリです。
dkimproxyの方は、DKIMPROXYDIR=/usr/local/dkimproxy
dkfilterの方は、DKFILTERDIR=/usr/local/dkfilter
HOSTNAMEとDOMAINも使用しているのものにあわせてください。

起動時に開始しますか?を、はい、にチェックを入れます。
保存をクリックし、設定を保存します。
それからもう一度この画面に戻ってきて、今すぐ開始をクリックしてください。

最後にBINDとPostfixに編集した内容を反映させます。

# /etc/rc.d/init.d/named restart
# postfix reload

では実際にメールを送信してみましょう。
ただしDKIMの署名はサブミッションポート587,あるいはSMTPS465で入ってきたメールのみ署名されます。
メーラーの設定を変更するのを忘れないでくださいね。

sa-test@sendmail.netにメールを送信すると自動で返事が来ます。
このとき件名と本文に何かしら、testとでも書き込んでから送信しないと認証に失敗します。
私はこれが分からず、ずいぶん長いこと苦しみました。(ずっと空メールでテストしていたのです)
DKIMの認証に成功していれば、返信されるメール本文には以下のような内容があるはずです。

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/

Authentication System: Domain Keys
Result: (no result present)
Reporting host:
More information: http://antispam.yahoo.com/domainkeys
Sendmail milter: https://sourceforge.net/projects/domainkeys-milter/

DomainKeys Identified Mail=DKIMにGOODの文字が見えればOKです。
Domain Keysは今回署名をつけられませんでしたので、ここはGOODの文字は見えないはずです。
以上です。
お疲れ様でした。