はじめに

AWS EC2+Postfix+SESでEC2インスタンスからメール送信をするでは、EC2インスタンスから SES経由でメールを送るということを実施したが、SPFアライメントが合格していないということに気づいた。

環境

1
Amazon Web Service Simple Email Service

今回のケース

  • SESから独自ドメインをFromアドレスとして送信している

事前知識

DMARC認証において、検証する項目として「SPF認証」「SPFアライメント」「DKIM認証」「DKIMアライメント」がある。

上記の記事を参考にしてみると、

メールがDMARC認証に合格するには、SPF認証とSPFアライメント、またはDKIM認証とDKIMアライメントのいずれかに合格する必要があります。 SPFとDKIMのどちらかが認証とアライメントをPass(合格)できていれば、もう一方は未導入あるいはFail(失敗)となっていてもDMARC認証にPassすることができます。ただし注意しなくてはならないのは、SPFとDKIMの認証がどちらも合格していたとしても、アライメントが両方とも合格できなかった場合DMARCの認証としてはFailとなってしまうということです。

とある。

SESでgmail宛に送信してみるとわかるが、SPF, DKIM, DMARCのステータスを表示してくれるのでここで確認ができる。
これらのステータスは、PASSになっていたとしても、アライメントがすべて合格しているわけではなく、上記の通り、SPFかDKIMのアライメントいずれかが合格しているということになる。

より良い状態に持っていくために、SPFアライメント、DKIMアライメントのどちらも合格させるのが望ましいと考える。

さらに理解を深めるために、下記の記事を一読した。

事前情報

今回の記事を作成する前に設定されている情報を記載する。

DMARCレコード

タイプ名前
TXT_dmarcv=DMARC1; p=none; rua=mailto:[email protected]

~~~~の部分は伏せている。

AWS SESの設定

  • 独自ドメインとして k-bushi.com を既に検証済み
  • Easy DKIMに必要なレコード(CNAMEレコード)を設定済み

現在の状態

before-aws-ses-gmail-01

SPF, DKIM, DMARCにはいずれも PASSしている。

ここで、DMARCがなぜPASSになっているのかを確認する。 DMARCがPASSになる要因として、

SPFとDKIMのどちらかが認証とアライメントをPass(合格)できていれば、もう一方は未導入あるいはFail(失敗)となっていてもDMARC認証にPassすることができます。

ということなので、受信したメールのSPFアライメント、DKIMアライメントが合格できているかをチェックしてみる。

SPFアライメント

ここで、SPFアライメントというのが何かについて確認しておく。
SPFアライメントは、ヘッダFromのアドレスが、SPFで認証したエンベロープFromのドメインと一致するかチェックするものである。

今回の状態の画像を見る限り、「エンベロープFrom」は sesのドメインで、「ヘッダFrom」はk-bushi.comとなっているので一致していないようだ。

※メールIDは特に関係ないようなので、ここで判断することはできない。

詳細に確認をするためにメールのソースも見てみよう。
エンベロープFromとヘッダFromが確認できればよいので、これらを確認する。

まずは、エンベロープFromについて調べてみる。
メールのソースのどこを見ればよいかだが、上記の記事にも記載の通り、 Return-Path を確認する。

受信したメールからエンベロープFromを調べる場合は、メールヘッダから「Return-Path」を確認してください。SMTPを用いて、メールが転送されている間はエンベロープFromの情報も一緒に転送されますが、宛先メールサーバへメール配送が完了した段階で「エンベロープFrom」が破棄され、その内容が「Return-Path」へと変換されてメールヘッダ内に記載されます。つまり、エンベロープFromを知りたい場合は「Return-Path」に記載されたメールアドレスを調べれば良いのです。

1
Return-Path: <[email protected]>

~~~~~~は伏せた文字。

さて、ヘッダFromについても調べてみる。
こちらは、素直に Fromを確認すれば良い。

上記のドメイン部分を見ると一致していないので、SPFアライメントは合格していないということになる。

DKIMアライメント

上記から、SPFアライメントは合格していないことがわかったが、DMARCはPASSしている。
そのため、結果からはDKIMアライメントは合格しているのだが、念の為こちらも確認してみよう。

同様に、DKIMアライメントというのが何かについて確認しておく。
DKIMアライメントは、ヘッダFromのアドレスが、DKIM署名の「d=」で指定したドメインと一致するかチェックするものである。

メールのソースからしか確認できないので、ソースを確認する。

DKIMは、DKIM-Signatureの部分を見れば良い。

1
2
3
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/simple; s=guycxgyzsyhpis64nx3mossfjxcbenmh; d=k-bushi.com; t=1716009777; h=From:To:Subject:MIME-Version:Content-Type:Message-ID:Date; bh=sR+ab4xdDsrQh0Q3oO5A3VnXXE35JfxBPSqXycgCKRk=; b=Ps+x1OW7xTBXyhZyl9nJlaUIVjtWdL03eJRz5c6lBjyyNsKQNcobJxPBO2OKx94H sAJ9AdMe1zL8R0hBXGuzanprcJ08fbPcNVxMg2bWV614LWy91umWIXP+nx7yNU/Vrx2 Iq2JLhrnFeu+Z/tORls7UTFeHXjzo1u+DCRd/oXWpkwKwFqHgvxUlTMTiSXMk+ICCEX 0/ukAN+Z7SOmwQoejbBz+h1MziB3x8yvkqNsQr2ncbzzBwMMYBRZ6p1H5D1q43mg/K1 Owrjn/QQ20qGo3671qV21MWigRV03Dc6UqLl6YV8tVJgrl8EL4q/9iN1CJvs/eMCEvF /hlesQuiog==

DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/simple; s=zh4gjftm6etwoq6afzugpky45synznly; d=amazonses.com; t=1716009777; h=From:To:Subject:MIME-Version:Content-Type:Message-ID:Date:Feedback-ID; bh=sR+ab4xdDsrQh0Q3oO5A3VnXXE35JfxBPSqXycgCKRk=; b=eaVep6ZNSkYc95bTHs+8pw8YtZxd94SNCn6EuZoQWBQwk4VR1cUVayIoWkFBsIts 6dH86hb9ZnKPHWClJQG3ZNY1XQ9gTWIS2+oRSEIaZsLj/iTJV2DsVv5wMjePeS0Qx+b XG5W/qWD6uHX2ItN3yiQZKD3TyCM3rGo2xHbCqVk=

DKIM-Signatureの部分に改行はなかったが、見やすくするために改行を入れた。

上記を確認すると、2つ署名があり、d=の部分にamazonses.comk-bushi.comの2つがある。
そのため、DKIMアライメントは合格できている。

設定手順

ここが今回の記事の本題である。
SPFアライメントの合格は、カスタムMAILFROMドメインを使用することで解決する。
https://docs.aws.amazon.com/ja_jp/ses/latest/dg/mail-from.html

1. AWSコンソールにログインをする

2. Amazon SESのサービスを選択する

3. SESのコンソール画面で「ID」選択し、今回設定する独自ドメインを選択する

aws-ses-custom-mail-from-01

4. カスタム MAIL FROM ドメイン の編集を選択する

aws-ses-custom-mail-from-02

5. カスタム MAIL FROM ドメインの設定を行う

今回は、mail.k-bushi.comというサブドメインで設定した。

aws-ses-custom-mail-from-03

設定後に、

1
カスタム MAIL FROM ドメインの設定を完了するには、指定された MX レコードを使用してドメインの DNS 設定を更新する必要があります。Amazon SES では、このレコードが検証されるまで、デフォルトの MAIL FROM ドメインが使用されます。

と表示されるので、DNSレコードを設定する。

aws-ses-custom-mail-from-04

6. 設定するDNSレコードの確認

カスタム MAIL FROM ドメイン の欄を確認すると、設定するレコードが表示される。

aws-ses-custom-mail-from-05

以下を設定する。

1
2
MX  mail.k-bushi.com 10 feedback-smtp.ap-northeast-1.amazonses.com
TXT mail.k-bushi.com "v=spf1 include:amazonses.com ~all"

7. DNSレコードの設定

Cloudflareを利用しているので、上記レコードを登録する。

aws-ses-custom-mail-from-06 aws-ses-custom-mail-from-07 aws-ses-custom-mail-from-08

上記で設定は完了した。

設定が完了し、AWS側で検証が完了するとメールが通知される。

success-custom-mail-from-domain-01

確認方法

SESからテストEメールの送信をして確認する。

1. SESのコンソール画面で「ID」選択し、設定した独自ドメインを選択する

2. 画面右上の方にある「テストEメールの送信」を選択する

aws-ses-test-email-01

3. メール送信の設定を行い「テストEメールの送信」を選択する

aws-ses-test-email-02

4. gmailにて受信したメッセージのソースを表示する

aws-ses-test-email-03 after-aws-ses-gmail-01

5. Return-Path, Fromのドメインを確認する

1
Return-Path: <[email protected]>

~~~~~は伏せ字としている。

Gmail上でも確認をする。
aws-ses-test-email-04

ドメインで一致しているので合格している。
※DMARCの厳密(strict)モードでは合格しないが、緩和モード(relaxed)であれば合格する。

【Q】エンベロープFromと差出人アドレスのドメインは完全一致する必要があるか 差出人アドレス(RFC5322.From)のドメインが親(example.com)であり、エンベロープFrom(RFC5321.MailFrom)のドメインが子(child.example.com)であり、かつ、DMARCのSPFモードがrelaxedであればSPFアライメントは合格します。(親子関係を逆にした場合は不合格になると言われています) ※RFC 7489より

https://jcity.zendesk.com/hc/ja/articles/5880340482457-%E3%81%94%E5%A5%91%E7%B4%84%E8%80%85%E3%81%AB%E3%82%88%E3%82%8BDNS%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E5%90%84%E7%A8%AE%E8%A8%AD%E5%AE%9A#h_01G5R39HY0K9GY0V1NTNJ3FYFK

以上で設定及び確認は完了となる。

補足

SPFアライメントに合格しない場合に緩和する方法もある。
この場合、SPFレコードに "v=spf1 include:amazonses.com ~all" として、 SESのドメインをSPFレコードにいれることで可能だそうだ。

参考

おわりに

今までふわっとした感じで設定してしまっていたので、より深く理解したいために現状の設定と改善設定を行った。
メール技術は難しい…。
とはいえ、DKIMなんかはOpenDKIMとか使うとそれこそかなり設定が大変なので、SESのようにEasy-DKIMでDNSレコードだけ設定するのはかなり楽だなと思う。