はじめに
AWS EC2+Postfix+SESでEC2インスタンスからメール送信をするでは、EC2インスタンスから SES経由でメールを送るということを実施したが、SPFアライメントが合格していないということに気づいた。
環境
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 | _dmarc | v=DMARC1; p=none; rua=mailto:~~~~~@dmarc-reports.cloudflare.net |
~~~~
の部分は伏せている。
AWS SESの設定
- 独自ドメインとして
k-bushi.com
を既に検証済み - Easy DKIMに必要なレコード(CNAMEレコード)を設定済み
現在の状態
SPF
, DKIM
, DMARC
にはいずれも PASS
している。
ここで、DMARCがなぜPASSになっているのかを確認する。 DMARCがPASSになる要因として、
SPFとDKIMのどちらかが認証とアライメントをPass(合格)できていれば、もう一方は未導入あるいはFail(失敗)となっていてもDMARC認証にPassすることができます。
ということなので、受信したメールのSPFアライメント、DKIMアライメントが合格できているかをチェックしてみる。
SPFアライメント
ここで、SPFアライメントというのが何かについて確認しておく。
SPFアライメントは、ヘッダFromのアドレスが、SPFで認証したエンベロープFromのドメインと一致するかチェックするものである。
- 「エンベロープFrom」と「ヘッダFrom」の違いとは? https://baremail.jp/blog/2021/05/25/1377/
今回の状態の画像を見る限り、「エンベロープFrom」は sesのドメインで、「ヘッダFrom」はk-bushi.com
となっているので一致していないようだ。
※メールIDは特に関係ないようなので、ここで判断することはできない。
詳細に確認をするためにメールのソースも見てみよう。
エンベロープFromとヘッダFromが確認できればよいので、これらを確認する。
まずは、エンベロープFromについて調べてみる。
メールのソースのどこを見ればよいかだが、上記の記事にも記載の通り、 Return-Path
を確認する。
受信したメールからエンベロープFromを調べる場合は、メールヘッダから「Return-Path」を確認してください。SMTPを用いて、メールが転送されている間はエンベロープFromの情報も一緒に転送されますが、宛先メールサーバへメール配送が完了した段階で「エンベロープFrom」が破棄され、その内容が「Return-Path」へと変換されてメールヘッダ内に記載されます。つまり、エンベロープFromを知りたい場合は「Return-Path」に記載されたメールアドレスを調べれば良いのです。
Return-Path: <~~~~~~@ap-northeast-1.amazonses.com>
※ ~~~~~~
は伏せた文字。
さて、ヘッダFromについても調べてみる。
こちらは、素直に From
を確認すれば良い。
From: no-reply@k-bushi.com
上記のドメイン部分を見ると一致していないので、SPFアライメントは合格していないということになる。
DKIMアライメント
上記から、SPFアライメントは合格していないことがわかったが、DMARCはPASSしている。
そのため、結果からはDKIMアライメントは合格しているのだが、念の為こちらも確認してみよう。
同様に、DKIMアライメントというのが何かについて確認しておく。
DKIMアライメントは、ヘッダFromのアドレスが、DKIM署名の「d=」で指定したドメインと一致するかチェックするものである。
メールのソースからしか確認できないので、ソースを確認する。
DKIMは、DKIM-Signature
の部分を見れば良い。
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.com
とk-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」選択し、今回設定する独自ドメインを選択する
4. カスタム MAIL FROM ドメイン の編集を選択する
5. カスタム MAIL FROM ドメインの設定を行う
今回は、mail.k-bushi.com
というサブドメインで設定した。
設定後に、
カスタム MAIL FROM ドメインの設定を完了するには、指定された MX レコードを使用してドメインの DNS 設定を更新する必要があります。Amazon SES では、このレコードが検証されるまで、デフォルトの MAIL FROM ドメインが使用されます。
と表示されるので、DNSレコードを設定する。
6. 設定するDNSレコードの確認
カスタム MAIL FROM ドメイン の欄を確認すると、設定するレコードが表示される。
以下を設定する。
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からテストEメールの送信をして確認する。
1. SESのコンソール画面で「ID」選択し、設定した独自ドメインを選択する
2. 画面右上の方にある「テストEメールの送信」を選択する
3. メール送信の設定を行い「テストEメールの送信」を選択する
4. gmailにて受信したメッセージのソースを表示する
5. Return-Path, Fromのドメインを確認する
Return-Path: <~~~~~@mail.k-bushi.com>
※~~~~~
は伏せ字としている。
From: no-reply@k-bushi.com
ドメインで一致しているので合格している。
※DMARCの厳密(strict
)モードでは合格しないが、緩和モード(relaxed
)であれば合格する。
【Q】エンベロープFromと差出人アドレスのドメインは完全一致する必要があるか 差出人アドレス(RFC5322.From)のドメインが親(example.com)であり、エンベロープFrom(RFC5321.MailFrom)のドメインが子(child.example.com)であり、かつ、DMARCのSPFモードがrelaxedであればSPFアライメントは合格します。(親子関係を逆にした場合は不合格になると言われています) ※RFC 7489より
以上で設定及び確認は完了となる。
補足
SPFアライメントに合格しない場合に緩和する方法もある。
この場合、SPFレコードに "v=spf1 include:amazonses.com ~all"
として、 SESのドメインをSPFレコードにいれることで可能だそうだ。
- Amazon SES の メールが SPF アライメントまたは DKIM アライメントの DMARC 検証に失敗した場合はどうすればいいですか?
https://repost.aws/ja/knowledge-center/ses-dmarc-spf-dkim-alignment
参考
DMARCのアライメントとは? SPF・DKIMアライメントをPassするためのポイント
https://baremail.jp/blog/2023/09/26/3474/DMARCがpassするとは
https://zenn.dev/kikutaro/articles/15a9a84d1de418「エンベロープFrom」と「ヘッダFrom」の違いとは? https://baremail.jp/blog/2021/05/25/1377/
カスタムの MAIL FROM ドメインを使用する
https://docs.aws.amazon.com/ja_jp/ses/latest/dg/mail-from.html突貫でおぼえるSPF、DKIM、DMARC
https://dev.classmethod.jp/articles/learn-spf-dkim-dmarc-in-a-hurry/Amazon SES の メールが SPF アライメントまたは DKIM アライメントの DMARC 検証に失敗した場合はどうすればいいですか?
https://repost.aws/ja/knowledge-center/ses-dmarc-spf-dkim-alignment
おわりに
今までふわっとした感じで設定してしまっていたので、より深く理解したいために現状の設定と改善設定を行った。
メール技術は難しい…。
とはいえ、DKIMなんかはOpenDKIMとか使うとそれこそかなり設定が大変なので、SESのようにEasy-DKIMでDNSレコードだけ設定するのはかなり楽だなと思う。