ubuntu 10.04 をメールサーバーに (DKIM 署名を付加)

先の記事では、dkim-filter をインストールして Postfix で DKIM 署名の検証ができるようにした。
ここでは更に進めて、このメールサーバーから送信するメールに DKIM 署名を付けるようにしよう。

繰り返しになるが先の記事中で、 sudo aptitude update; sudo aptitude install dkim-filter コマンドを実行して dkim-filter をインストールし、Postfix の設定ファイル mail.cf の smtpd_milters と non_smtpd_milters の二つのエントリに、dkim-filter のソケット 'inet:localhsot:8891' を追加ししてある。

smtpd_milters と non_smtpd_milters の二つのエントリに 'inet:localhost:8891' を指定したことで、受信であれ送信であれ Postfix が処理するメールは全て dkim-filter に渡される。
dkim-filter をインストールしたままの設定で運用すると、渡されたメールの DKIM 署名を検証するだけしかしない。
送信しようとしているメールに DKIM 署名を付けるようにするためには、dkim-filter の設定を変更しなくてはならない。

ところで、DKIM 署名を付けるためには、Postfix から dkim-filter に渡されたメールが、受信したメールなのか、送信したメールなのかを区別しなくてはならないのだが、実はそれを区別する明確な方法は無い。
それではどのようにして DKIM 署名を付けるメールを判断したらいいのだろう。
dkim-filter では、メールの From ヘッダー (Envelope From ではなく Message From) を見ることで判断している。
つまり、dkim-filter の設定ファイル /etc/dkim-filter.conf の中で指定したメールドメインと、From ヘッダーに書かれたメールドメインが一致したメールに DKIM 署名をするということだ。

それでは、dkim-filter で DKIM 署名を付けるように設定する前に、署名するメールドメインに対応した電子署名の鍵を作成しておこう。
電子署名の鍵は /etc/mail ディレクトリに保存する。
複数のドメインに対して DKIM 署名を付けるつもりなので、/etc/mail ディレクトリの下にドメイン名のディレクトリを作り、そこに鍵を保存することにする。
ドメイン名を ‘example1.jp’ と ‘example2.jp’ に (メールアドレスはそれぞれ user@example1.jp、user@example2.jp のようになる) 、セレクターをどちらのドメインでも ’sel’ を使うことにした場合は、以下のコマンドで署名の鍵が作成できる。

-D オプションで指定した /etc/mail/example1.jp ディレクトリと /etc/mail/exapmle2.jp ディレクトリの中それぞれに、sel.private ファイルと sel.txt ファイルの二つが作られる。
拡張子が .private のファイルが署名の鍵だ。
拡張子が .txt のファイルは後で DNS のゾーンに必要事項を追加するときに使用する。

このように opendkim-genkey コマンドは –s オプションで指定したセレクターに、拡張子 .private と拡張子 .txt を付けた二つのファイルを作成する
複数のドメインに署名を付けるときには、ドメイン毎にディレクトリを分けるか、セレクターを別にしなくてはならない。

鍵のファイルを作成したら以下のコマンドを実行して、拡張子 .private が付かないファイルを準備する。

次に、送信者のメールアドレスと利用する署名鍵の組み合わせを決める為のファイルを用意する。
ファイル名は /etc/dkim-keys.conf にしておく。
このファイルに一行一ドメインで、ドメインと鍵ファイルの組み合わせを記述する。
一つの行は三つのパラメーターを : (コロン) で区切って記述する。
: (コロン) で区切られた最初のパラメーターが署名対象の送信元メールアドレス、二つ目がドメイン名、最後が使用する鍵ファイルだ。
この鍵ファイルには拡張子 .private を付けない用にする。
具体的には以下のようになる。

いよいよ、dkim-filter そのものの設定をする。
dkim-filter の設定ファイルは /etc/dkim-filter.conf になる。
dkim-filter は単純にインストールしただけなので、/etc/dkim-filter.conf はインストール直後の状態のままのはずだ。

/etc/dkim-filter.conf の 17 行目付近の KeyList エントリを修正する。
KeyList キーワードの行頭にある # を削除し、パラメーターのファイル名を先ほど作った /etc/mail/dkim-keys.conf に書き直す。

後は sudo service dkim-filter restart として dkim-filter を再起動すれば、送信するメールに DKIM 署名が付く。

さて、送信するメールに DKIM 署名が付くようになったは良いが、これだけでは受け取った相手がこれを検証する方法がない。
そこで続いて、DKIM 署名を検証して貰うための設定をする。

DKIM 署名の検証は DNS を使って行われるので、DKIM 署名を検証して貰うためには DNS の設定を修正することになる。

DNS の設定修正は、DKIM 署名を付けるドメインのゾーン情報に対して行う。
この場合は example1.jp ドメインと example2.jp ドメインだ。
この二つのドメインのゾーン情報に、example1.jp ドメインには sel._domainkey.example1.jp を、example2.jp ドメインには sel._domainkey.example2.jp に対する TXT レコードを追加する。
TXT レコードの内容は、先に opendkim-keygen コマンドで作った sel.txt ファイルを見れば分かる。
sel.txt ファイルには、以下のようにそれぞれのドメインのゾーン情報に追加すべき TXT レコードがそのまま出力されている。

$ cat /etc/mail/example1.jp/sel.txt

更に以下の TXT レコードをそれぞれのドメインのゾーン情報に追加する。
この TXT レコードは、メールを受け取った側が DKIM 署名が正しく検証できなかったときに、どのように判断すべきかの基準を示している。

例えば、From ヘッダー (Message From) を書き換えてしまうメーリングリストに投稿した場合などでは、DKIM 署名が正しく検証できないと判定されることがある。
このようなときに、どう判断するのかという指針を与えるのが _policy.domainkey の TXT レコードだ。

”o=~” は DKIM 署名が正しく検証できないときを許容させる指針を意味する。
正しく検証できない DKIM 署名を信用させないのであれば、ここが ”o=-” になる。

DKIM 署名に関する DNS のレコードについての説明は、「電子署名方式の最新技術「DKIM」とは(アットマーク・アイティ) が比較的わかりやすい。

DNS のゾーン情報を変更したら、DNS サーバーの再起動を忘れずに行おう。

2012.4 月 10 日追記
dkim-keys.conf ファイルに指定する鍵ファイルのファイル名部分がそのままセレクターに採用されてしまうため、拡張子 .private まで記述すると DNS の TXT レコードとの整合が取れなくなる。
鍵ファイルの指定で拡張子を削除できるように訂正した

コメントを残す