今回は、代表的な送信ドメイン認証であるSPFとDKIMの仕組みを詳しく解説する。SPFでは、SMTPでのやり取りの際に送信側メールサーバーが受信側メールサーバーに伝えたドメイン名と、送信側メールサーバーのIPアドレスが対応しているかどうかを検証する。具体的な手順は次の通り。

メールサーバーのIPアドレスをチェックする「SPF」
メールサーバーのIPアドレスをチェックする「SPF」
SPFは、メールを送信したドメイン(メールサーバー)をIPアドレスで検証する送信ドメイン認証。送信側は自ドメインのDNSサーバーに、自ドメインのメールサーバーのIPアドレスを登録する。受信側のメールサーバーは、送信元ドメインのDNSサーバーに問い合わせてそのIPアドレスを取得。現在接続しているメールサーバーのIPアドレスと照合して、正しいIPアドレスのメールサーバーから届いているか判断する。
[画像のクリックで拡大表示]

 送信側は、自社で使用するメールサーバーのIPアドレスを、自社のDNSサーバーに登録しておく。送信者がメールを送ると、送信側メールサーバーは、宛先ユーザー(受信者)が所属するドメインの受信側メールサーバーにSMTPで接続し、メールを送るためにSMTPのコマンドを順に送信する。

 送信側メールサーバーが、MAILコマンドで送信者のメールアドレスを伝えると、受信側メールサーバーは、そのメールアドレスのドメイン名のDNSサーバーにアクセス(上図の(3))。そのドメインのメールサーバーのIPアドレスを取得する(同(4))。

 そして、取得したIPアドレスと、現在接続している送信側メールサーバーのIPアドレスを照合(同(5))。一致している場合には、詐称されていないとして、受信者にメールを配信する。不一致の場合には、管理者の設定に従って処理する。具体的な処理方法としては、「メールを配信しない」「受信者の迷惑メールフォルダーに配信する」「不一致だったことをメールのAuthentication-Resultsヘッダーに書き込んで配信する」などがある。

公開鍵を取得して署名を検証

 DKIMでは、送信側メールサーバーで電子署名を作成してメールに付与。受信側メールサーバーでは、送信側のDNSサーバーに置かれている公開鍵を取得し、電子署名を検証する。

メールの電子署名をチェックする「DKIM」
メールの電子署名をチェックする「DKIM」
DKIMは、メールの電子署名をチェックすることで送信元を検証する。送信側では、RSAなどの公開鍵暗号の秘密鍵と公開鍵を用意。公開鍵は自ドメインのDNSサーバーに置く。メールの送信時、メールサーバーは自ドメインの秘密鍵を使ってメール本体(メールヘッダーと本文)の電子署名を作成し、そのメールのヘッダーに追加。受信側ではDNSサーバーの公開鍵を取得し、電子署名が正しいかどうか検証する。
[画像のクリックで拡大表示]

 まず送信側では、電子署名に使用する公開鍵を、自社のDNSサーバーに登録する。公開鍵とペアになる秘密鍵は、送信側メールサーバーに置く。

 送信者がメールを送信すると(上図の(1))、送信側メールサーバーは、そのメールの本文とヘッダーから電子署名を作成し、DKIM-Signatureというヘッダーとしてメールに書き込む(同(2))。電子署名は、特定のメールヘッダーと本文からダイジェスト(ハッシュ値)を計算し、それを秘密鍵で暗号化して作成する。DKIM-Signatureヘッダーには、電子署名に加えて、電子署名の作成の際に使用したヘッダーの名称や、送信側のドメイン名などが含まれる。

 受信側メールサーバーでは、DKIM-Signatureヘッダーから送信側のドメイン名を抜き出し、そのドメイン名のDNSサーバーにアクセス(同(3))。登録されている公開鍵を取得する(同(4))。

 そしてその公開鍵を使って、DKIM-Signatureヘッダー内の電子署名を検証する(同(5))。具体的には、公開鍵を使って電子署名をダイジェストに復号。同ヘッダー内で指定されたハッシュ関数を使ってメールのヘッダーと本文から作成したダイジェストと比較する。これらのダイジェストが一致する場合には、送信元が詐称されていないと判断して受信者にメールを配送する。一致しない場合には、受信側の管理者の設定に従って処理する。代表的な処理方法は、SPFと同様に「メールを配信しない」「受信者の迷惑メールフォルダーに配信する」「不一致だったことをメールのAuthentication-Resultsヘッダーに書き込んで配信する」。

▼SMTP
Simple Mail Transfer Protocolの略。メール送信のプロトコル。
▼DNSサーバーに登録
DNSサーバーのTXTレコードに記述する。詳細は後述。
▼送信者のメールアドレス
SMTPのMAILコマンドで送られる送信者メールアドレスは、「エンベロープFrom」と呼ばれる。SMTPでのやり取りでエラーが発生した場合、このエンベロープFrom宛てにエラーメールが送信される。
▼Authentication-Resultsヘッダーに書き込んで
認証に成功した場合も、Authentication-Resultsヘッダーに結果を書き込む。認証に成功した場合は「spf=pass」、失敗した場合には「spf=softfail」や「spf=hardfail」と書き込まれる。送信側のDNSサーバーにメールサーバーのIPアドレスが登録されていない場合(SPFに未対応の場合)は、「spf=none」になる。
▼ダイジェスト
メッセージダイジェストともいう。
▼ドメイン名を抜き出し
ドメイン名は、DKIM-Signatureヘッダーのdタグとして「d=example.jp」といった具合に記載されている。
▼SPFと同様に
Authentication-Resultsヘッダーへの書き込み方もSPFと同様。認証に成功した場合は「dkim=pass」、失敗した場合には「dkim=fail」などと書き込む。送信側のDNSサーバーにメールサーバーの共通鍵が登録されていない場合(DKIMに未対応の場合)は、「dkim=none」になる。