Postfix で DKIM の署名に対応する

先ほどは、メールサーバを DKIM の検証に対応させたが、引き続き DKIM の署名を行うようにしてみた。

今回は送信するメールについて、署名を行うので、まずは DNS サーバの設定から行う必要があった。
※ DNS サーバの設定は省略。
※以下では、例として example.com を用いる。

  • 前提
    OS : Debian GNU/Linux 5.0 lenny
    MTA : Postfix 2.5.5
    すでに DKIM の検証に対応していること。
    メールユーザからのメール送信は、サブミッションポートを使用していること。
    ゾーン情報を自由に変更できる DNS サーバで対象ドメインを運用していること。
  • 適当なディレクトリで、署名に必要な秘密鍵と公開鍵を作成する
    $ mkdir test
    $ chmod 700 test
    $ cd test
    $ dkim-genkey -b 1024 -d example.com -s test01

    ※ドメイン example.com 、セレクタ test01 で作成。

    $ chmod 600 test01.private

    ※ test01.private: 秘密鍵
    ※ test01.txt: 公開鍵 (この情報を DNS サーバの該当ゾーンファイルに登録する)

  • 適切なディレクトリに、秘密鍵をコピーする。
    # mkdir /etc/opt/dkim-filter
    # cp test01.private test01.txt /etc/opt/dkim-filter
    # chown -R dkim-filter:dkim-filter /etc/opt/dkim-filter
    # chmod 700 /etc/opt/dkim-filter

    ※公開鍵もコピーしているが、管理をわかりやすくするためで必須ではない。

  • 公開鍵の内容を以下の通り example.com のゾーンファイルに定義
    _policy._domainkey	600	IN	TXT	"t=y; o=~"
    test01._domainkey	600	IN	TXT	"v=DKIM1; g=*; k=rsa; p=公開鍵"

    ※ TTL は 600 秒でテスト。
    ※「_policy._domainkey」の「t=y」はテストモードであること、「o=~」は、署名されていないメールも送出される可能性があることを示す。

  • /etc/dkim-filter.conf の該当部分を以下のようにする
    Domain		example.com
    KeyFile		/etc/opt/dkim-filter/test01.private
    Selector	test01
    Mode		sv
  • /etc/postfix/main.cf
    以下を追加する。
    non_smtpd_milters = inet:127.0.0.1:60001

    ちなみに DKIM 関係の部分は以下の通り。

    smtpd_milters = inet:127.0.0.1:60001
    non_smtpd_milters = inet:127.0.0.1:60001
    milter_default_action = accept

    ※本当は、master.cf の方で設定すべきなのだろうと思う。

  • サービスの再起動
    # /etc/init.d/bind9 restart
    # /etc/init.d/dkim-filter restart
    # /etc/init.d/postfix restart
  • 確認
    dig で設定したレコードが引けるか確認。
    GMail にメール送信して、ちゃんと DKIM が Pass しているかヘッダを確認。
  • 不明点
    今回は単一ドメインのみだったが、バーチャルドメインなどの場合は、秘密鍵と公開鍵の扱いは、各ドメインにそれぞれ 1 つずつではなく、メールサーバ単位で 1 つとなるのだろうか。
    ※ /etc/dkim-filter.conf で「Domain example.com,example.net」という風にすると、両方のドメインで署名が付いたことは確認した。

    追記
    複数ドメインへの対応は、KeyList を使うことで、別々の鍵を使えることを確認した。詳しくはこちら

  • 参考にさせて頂いたページ

■修正

  • 一部修正 (2011/12/21)
  • DNS のゾーンに登録するポリシー名が間違っていたのを修正 (2012/01/10)