Cambios recientes

2008-08-07
2008-08-04
2008-01-25
2008-01-23

Últimos archivo liberados

This Project Has Not Released Any Files

Wiki Guide

Sidebar

EximのDKIM対応

DKIM は、Yahoo! が提唱していた DomainKeys と、Cisco が提唱していた IIM が合流した規格で、電子メール(の送信ホスト)の正当性を検証するために、電子メールのヘッダに送信メールサーバーが秘密鍵で署名するもの。受信メールサーバーは、送信者のドメインのDNSレコードから公開鍵を取得して書名を検証する、というもの。DNSが乗っ取られると危険だが、spammer はたぶんDNSの乗っ取りなどという面倒なことをするより先に自前で正当なDKIM署名できるメールサーバーを用意するはず。

以下は http://wiki.exim.org/DKIM を機械翻訳調にざっくり和訳したもの。翻訳品質は非常に低いですが、そこらへんの機械翻訳よりは読める日本語にしたつもりです :P


DKIM サポート

DKIM サポートは libdkim を利用して実装される。libdkim は、以下から取得すること:

この tar ボールに含まれる INSTALL ファイルの指示に従って、まずライブラリをビルドする。(訳注: libdkim のビルドには、EVPだかSHA256だかで OpenSSL 0.9.7i 以降が必要かも。Debian Sarge ではユーザ領域で OpenSSL 0.9.7i 以降を用意する必要があった)

Exim を DKIM サポートつきでビルドするには、以下のものを Local/Makefile に追記する:

  EXPERIMENTAL_DKIM=yes
  CFLAGS  += -I/home/tom/libdkim/include
  LDFLAGS += -ldkim -lssl -lstdc++ -L/home/tom/libdkim/lib

CFLAGS と LDFLAGS はさっきの libdkim の includes や lib のディレクトリなど各自の環境に合わせて書き換えること。

現在の実験的な実装では、以下の独立した機能が提供される:

  • 受信したメールの DKIM 署名の検証
  • 送信するメールを DKIM 署名する

前者は SMTP の ACL で実装され、後者は SMTP トランスポートの拡張として用意されている。 つまり、これらの機能は SMTP の入出力時においてのみ提供されるということを意味する。

(1) 受信したメールのDKIM署名を検証する

ネットワーク経由で受信したメッセージは DKIM 検証プロセスに渡される。 これはEximがメッセージをスプールにバッファリングするのと同時に行われる(訳注:本当?)。

DATA ACLより前、ローカルではなく、リレーでもなく、サブミッションではないメールが処理されるようなACLのいずれかで "control = dkim_verify" をセットしなければならない (典型的には acl_smtp_rcpt が利用されるだろう)。この control フラグがセットされなければ、そのメッセージのDKIM署名は検証されない。

例:

  warn log_message = Feeding message to DKIM validator.
       control = dkim_verify

このことによって、DATA ACL (acl_smtp_data) 以降で "dkim" というクエリー形式の lookup を利用することで、 DKIM署名をチェックできるようになる。dkim クエリーはドメイン名またはDKIM identity を引数にとる:

  ${lookup dkim{domain.example}}

この lookup で以下の文字列のいずれかが得られる。

文字列 意味
unverified Exim はメッセージ中のDKIM署名を検証しなかった。原因は control=dkim_verify がセットされていない、DATA ACL 以前のACLでlookupしている、のいずれかまたは両方だろう
unsigned メッセージはDKIM署名されていない
good メッセージはDKIM署名されており、正しく検証できた
bad メッセージはDKIM署名されているが、検証は失敗した
defer DKIM署名の検証中に一時的なDNSの問題が発生した

(2) 送信するメールをDKIM署名する

送信するメッセージは、Exim がメッセージをまさにネットワーク上に送信しようとする直前に署名される。DKIM署名以降行われるのはTLS暗号化くらいである。

署名はSMTP transport 独自の以下のオプションをセットすることで実装される。 これらのオプションは、拡張可能文字列を引数に取る:

dkim_domain = <expanded string> [必須]

署名を施すドメイン名を指定する。 From: ヘッダーのドメインと同じドメイン名が望ましいが、必ず一致しなければならないというわけではない。このオプションが展開され、$dkim_domain という拡張可能な変数として利用できるようになる。

dkim_selector = <expanded string> [必須]

鍵セレクタを設定する。$dkim_domain 拡張可能引数を利用して、該当するセレクタを選択できる。この結果もまた $dkim_selector 拡張変数に設定され、dkim_private_key オプションで $dkim_domain 変数とともに用いられるだろう。

dkim_private_key = <expanded string> [必須]

利用する秘密鍵を指定する。拡張可能変数 $dkim_doain と $dkim_selector を利用することができる。このファイルは以下のようなもの:

  • ASCII形式の有効な RSA 秘密鍵 (改行を含んでよい)
  • スラッシュで始まる場合は、秘密鍵を含むファイルとして扱われる
  • 0, false, あるいは空文字列の場合は、メッセージは署名されない。dkim_strict がセットされていたとしても、この場合はエラーにならない。
dkim_canon = <expanded string> [任意]

このオプションによって、メッセージに署名を施す際の正規化メソッドを指定する。 現時点の DKIM の RFC は、2種類の正規化メソッド "simple" と "relaxed" に対応している。 指定がなければ "relaxed" がデフォルトとして利用される。(注意: 現時点の libdkim 実装は、ヘッダと本文に同じ正規化メソッドしか用いることができない)

dkim_strict = <expanded string> [任意]

このオプションは、メッセージに署名するときのエラーに対して Exim がどう行動するかを定義する。1 とか true に展開される値が入っていれば、Exim は defer (延期) する。それ以外の場合は、メッセージを署名なしで送信する。$dkim_domain と $dkim_selector 拡張可能変数を利用することができる。

dkim_sign_headers = <expanded string> [任意]

セットするときは、このオプションはコロンで連結されたヘッダ名のリストに展開されるか、そのものずばりである必要がある。これらのヘッダがメッセージの署名の対象となる。指定が無い場合は、recomend されるヘッダが利用され、それは現在以下のものだ:

from:sender:reply-to:subject:date: message-id:to:cc:mime-version:content-type: content-transfer-encoding:content-id: content-description:resent-date:resent-from: resent-sender:resent-to:resent-cc:resent-message-id: in-reply-to:references: list-id:list-help:list-unsubscribe: list-subscribe:list-post:list-owner:list-archive