Amazon SES の DKIM認証 に失敗したときに切り分けとして行うこと

Amason SES で Easy DKIM をセットアップする際にステータスがFailureになりました。切り分けのため、digコマンドを使ってDNSレコードが正しく登録されているかを確認します。

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

コンバンハ、千葉(幸)です。

Amazon SES においては、Identityという概念があります。送信に用いるメールアドレスか、ドメイン全体のことを指します。それぞれのIdentityにおいて、DKIM認証を有効化することができます。

今回その認証でちょっとつまずいた部分があったため、備忘として記します。

目次

Amazon SES の Identity

冒頭の繰り返しになりますが、Amazon SES の Identityには以下の2種類があります。

  • Eメールアドレス
  • ドメイン

ここでいずれかのIdentityの検証(Verify)が済めば、それを使用してAmazon SESによるメールの送信が可能になります。

メールアドレス単位での検証であれば特定のメールアドレスでのみ送信が可能になりますし、ドメイン単位で検証すればそのドメインに所属する任意のメールアドレスを用いて送信が可能になります。

検証にはIdentityを所有していることの確認が必要なため、それぞれ以下のようなステップを踏む必要があります。

  • Eメールアドレスの検証:
    • 指定したメールアドレス宛にメールが届くため、本文内のリンクを押下する
  • ドメインの検証:
    • 検証用に生成されたTXTレコードをDNSに登録する

詳細は以下を確認してください。

Amazon SES の ID の検証

DKIM認証とは

上記で検証したIdentityに対して、DKIM認証を有効化することができます。DKIM認証とは、DomainKeys Identified Mail と呼ばれる規格の電子署名を用いて、メールのなりすましや改竄が行われていないかを確認するためのプロセスです。

以下のサイトで他の認証方式も含めてわかりやすくまとめられています。

また、DKIM認証実施後に送信されたメールが、受信側で見たときにどのように変化するかは、以下のサイトがわかりやすかったです。

  • amazonses.com経由という表記が消える
  • 署名元がamazonses.comからIdentityのドメインに変わる

Domain Identity におけるEasy DKIM認証の有効化

Amason SESにより送信するメールにDKIM認証を有効化する際の作業を考えてみます。

いくつか手法がありますが、今回は Easy DKIM のパターンを取り上げます。

  • Easy DKIM(SESにより送信するEメールに自動的に署名を追加)
  • BYODKIM(署名に用いるキーペアを持ち込むパターン)
  • 手動でのDKIM認証

Amazon SES における DKIM を使った E メールの認証

なお、DKIM認証の有効化はドメイン、サブドメイン、Eメールアドレスそれぞれの単位で実施することができますが、以下のように細かい単位で行った設定が優先されます。

親ドメイン、サブドメインおよび E メールアドレスに対して Easy DKIM をセットアップした場合、Amazon SES は以下の方法で Easy DKIM 設定を適用します。

・ サブドメインの DKIM 設定は、親ドメインの設定を上書きします。
・ E メールアドレスの DKIM 設定の設定は、サブドメインの設定 (適用される場合) と親ドメインの設定を上書きします。

Easy DKIMのセットアップは、生成されたキーの組み合わせをCNAMEレコードとして登録することで実現します。メール送受信の流れは以下のイメージです。

20190521 AWS Black Belt Online Seminar Amazon Simple Email Service (Amazon SES)より

SESのIdentityの画面から、CNAMEレコードが発行できます。これらをドメインを管理しているDNSプロバイダーにレコード登録することでDKIM認証が有効になります。

レコードのイメージは以下です。ここではmail.example.comのドメインでDKIM認証を有効化することを想定しています。

Name Type Value
aaaaaaaaaa._domainkey.mail.example.com CNAME aaaaaaaaaa.dkim.amazonses.com
bbbbbbbbbb._domainkey.mail.example.com CNAME bbbbbbbbbb.dkim.amazonses.com
cccccccccc._domainkey.mail.example.com CNAME cccccccccc.dkim.amazonses.com

DKIM認証を有効化したいIdentityと同一のAWSアカウントにRoute 53があり、そのホストゾーンでドメインが管理されている場合、[Use Route 53 (Route 53 を使用)] を選択することで自動的に登録されます。それ以外の場合は、各種DNS プロバイダーに適宜レコードを登録する必要があります。

DKIM認証の有効化がうまくいかないときの切り分け

今回の私のケースでは、SESのIdentityとは別AWSアカウントに存在するRoute53 のホストゾーンにレコードを登録する必要があったため、手動でのレコード登録が必要でした。

Name Type Value
aaaaaaaaaa._domainkey.mail.example.com CNAME aaaaaaaaaa.dkim.amazonses.com
bbbbbbbbbb._domainkey.mail.example.com CNAME bbbbbbbbbb.dkim.amazonses.com
cccccccccc._domainkey.mail.example.com CNAME cccccccccc.dkim.amazonses.com

きちんとレコード登録したように見受けられたのですが、DKIM Verification Statusfailure になってしまいました。

そこで切り分けとして実施したのが、「3つすべて」「パブリックにレコードを引けるかどうか」の確認です。

上記のレコードをきちんと登録できていれば、それぞれDNSサーバへのクエリに対して応答が返ってくるはずです、

具体的には、レコードごとに以下のコマンドを実施しました。

$ dig +noall +ans aaaaaaaaaa._domainkey.mail.example.com

正しく登録されていれば、以下のように結果が返ってきます。

$ dig +noall +ans aaaaaaaaaa._domainkey.mail.example.com
aaaaaaaaaa._domainkey.mail.example.com. 300 IN CNAME aaaaaaaaaa.dkim.amazonses.com.

+noall +ansというオプションは必要な表示のみに絞るためのオプションのため、省略しても問題ありません。)

切り分けを行った結果、一つのレコードで応答が返ってこず、一部の値を誤って登録していることが発覚しました。レコードの登録内容を修正し再度Verifyすることで、verifiedステータスに遷移しました。

今回は登録誤りという単純な原因であったため、速やかに事象が解決しました。

終わりに

目検での確認においては登録誤りを見落としていたため、別のアプローチで確認を取るのは大事だと痛感しました。もし検証に失敗したケースがあった場合に参考になれば幸いです。

その他のトラブルシューティングについては以下をご参照ください。

Amazon SES の DKIM 問題のトラブルシューティング

以上、千葉(千葉)でした。