はじめに
前回の記事では、DMARCの p / sp / np を整理し、次のようなDMARC設計を考えました。
sample.com
→ p=none
→ sp=reject
→ np=reject
stg.sample.com
→ 個別DMARC
→ p=none
つまり、
正規にメールを送信するドメインはDMARCで監視し、それ以外のサブドメインは原則rejectする
という方針です。
しかし、DMARCの設定だけではメール認証は完成しません。
DMARCでは、SPFまたはDKIMによる認証と、Header Fromとの Alignment(整合性) が必要です。Amazon SESでも、SPFまたはDKIMのどちらかがDMARCの条件を満たす必要があり、AWSは両方の利用を推奨しています。
そこで次に疑問になったのが、
From: user@sample.comでメールを送るなら、SPFもsample.comに設定するのでは?
という点でした。
実際には、Amazon SESでCustom MAIL FROMを利用する場合、例えば次のようになります。
Header From:
user@sample.com
MAIL FROM:
xxxx@mail.sample.com
そしてSES用のSPFを設定するのは、
sample.com
ではなく、
mail.sample.com
です。
今回は、この少し分かりづらい仕組みを整理しながら、
- Header From
- MAIL FROM
- SPF
- DKIM
- Custom MAIL FROM
- DMARC Alignment
の関係を整理します。
今回の構成
前回と同様に、次のドメインを使用します。
| 用途 | ドメイン |
|---|---|
| 本番 | sample.com |
| STG | stg.sample.com |
| メール送信 | Amazon SES |
本番では、
From:
user@sample.com
STGでは、
From:
user@stg.sample.com
としてメールを送信する想定です。
また、Custom MAIL FROMとして、
本番
mail.sample.com
STG
mail.stg.sample.com
を使用します。
全体像は次のようになります。
メールには「From」が2つある
今回、一番最初に理解しておきたいポイントです。
メールには、普段メールソフトで目にするFromとは別に、配送処理で利用されるMAIL FROMがあります。
Amazon SESのドキュメントでも、メールには送信元を示す2つのアドレスがあると説明されています。
Header From
普段メールソフトで見えるのはこちらです。
From: user@sample.com
例えばGmailでメールを開いたときに、
送信者:user@sample.com
として表示される部分です。
DMARCでは、このHeader Fromのドメインを誰が名乗っているかが非常に重要になります。
MAIL FROM
もう一つが、
MAIL FROM
です。
別名、
- Envelope From
- Envelope Sender
- Return-Path
- Bounce Address
などと呼ばれます。
Amazon SESでも、MAIL FROMはバウンスなどのエラー通知に使われるアドレスとして説明されています。通常、受信者がメールのソースを確認しない限り意識することはありません。
イメージすると、
見えるFrom
↓
Header From
user@sample.com
配送処理で使われるFrom
↓
MAIL FROM
xxxx@mail.sample.com
です。
普段「メールのFrom」と呼んでいるものと、SPFが認証するMAIL FROMは別物です。
ここを混同すると、SESのSPF設定が分かりづらくなります。
SPFは何を確認しているのか
SPF(Sender Policy Framework)は、
このMAIL FROMドメインを名乗って、このメールサーバーからメールを送ってよいか?
を確認する仕組みです。
例えば、
MAIL FROM:
xxxx@mail.sample.com
であれば、SPFで確認されるのは、
mail.sample.com
です。
したがってSES用のSPFは、
mail.sample.com
TXT "v=spf1 include:amazonses.com ~all"
に設定します。
Amazon SES公式でも、Custom MAIL FROMを利用する場合は、そのCustom MAIL FROMドメインにSPF TXTレコードを公開する必要があると説明されています。
SESのデフォルトではどうなっている?
実は、Custom MAIL FROMを設定しなくてもAmazon SESからメールは送れます。
その場合、SESはMAIL FROMとして、
amazonses.com
配下のドメインを自動的に利用します。
この場合、SES側ですでにSPF認証できるため、自分でSES用SPFを設定しなくてもSPF自体はPASSできます。
イメージすると、
Header From:
user@sample.com
MAIL FROM:
xxxx@xxxxx.amazonses.com
です。
ここで重要なのがDMARC Alignmentです。
SPFがPASSしてもDMARCがPASSするとは限らない
ここが重要です。
例えば、
Header From:
user@sample.com
MAIL FROM:
xxxx@xxxxx.amazonses.com
だったとします。
SPFとしては、
xxxxx.amazonses.com
からSESが送信しているためPASSできます。
しかし、
Header From
sample.com
MAIL FROM
amazonses.com
ではドメインがAlignmentしていません。
つまり、
SPF PASS
と、
DMARC PASS
は同じ意味ではありません。
DMARCをSPFでPASSさせるには、SPF認証に成功するだけでなく、Header FromとMAIL FROMがAlignmentしている必要があります。
そこでCustom MAIL FROMを使う
今回、
Header From:
user@sample.com
に対して、
Custom MAIL FROM:
mail.sample.com
を設定します。
すると、
Header From
sample.com
MAIL FROM
mail.sample.com
という関係になります。
DMARCのSPF AlignmentがデフォルトのRelaxed Alignmentであれば、Organizational Domainが同じなのでAlignmentが成立します。
AWSも、Amazon SESでSPFによるDMARC Alignmentを成立させる場合はCustom MAIL FROMを設定し、SPFのAlignmentをstrictにしないよう説明しています。
Relaxed AlignmentとStrict Alignment
DMARCには、SPFのAlignmentについて、
aspf=r
と、
aspf=s
があります。
| 設定 | 意味 |
|---|---|
aspf=r |
Relaxed |
aspf=s |
Strict |
aspf を省略した場合はRelaxedがデフォルトです。
今回、
Header From:
sample.com
MAIL FROM:
mail.sample.com
なので、Relaxed Alignmentなら成立します。
sample.com
mail.sample.com
→ Organizational Domainがsample.comで一致
→ Alignment OK
一方、Strict Alignmentでは完全一致が必要なので、
sample.com ≠ mail.sample.com
となり、SPF Alignmentが成立しません。
Amazon SESで mail.sample.com のようなCustom MAIL FROMを使用してSPFによるDMARC準拠を狙う場合、aspf=s にしない点が重要です。
特に指定していなければRelaxed Alignmentがデフォルトです。
Custom MAIL FROMにはSPFだけでなくMXも必要
Amazon SESでCustom MAIL FROMとして、
mail.sample.com
を設定する場合、DNSにはSPFだけではなくMXレコードも設定します。
AWS公式の形式では次のようになります。
MX
Name:
mail.sample.com
Type:
MX
Value:
10 feedback-smtp.ap-northeast-1.amazonses.com
SPF
Name:
mail.sample.com
Type:
TXT
Value:
v=spf1 include:amazonses.com ~all
つまり、
mail.sample.com
├─ MX
│ └─ 10 feedback-smtp.ap-northeast-1.amazonses.com
│
└─ TXT
└─ v=spf1 include:amazonses.com ~all
となります。
なぜMXレコードが必要なのか
Custom MAIL FROMはバウンスなどの処理にも利用されます。
そのためAmazon SESではCustom MAIL FROMドメインにMXレコードを設定し、バウンスや苦情通知をSES側で処理できるようにします。
ここで、
MX
と、
TXT(SPF)
は別のDNSレコードです。
SESの画面ではCustom MAIL FROM設定としてMXとSPFがセットで表示されますが、DNS上では別レコードです。
「MX/TXT」という1つのレコードを作るわけではありません。
Custom MAIL FROMに使うサブドメイン
AWSではCustom MAIL FROMとして、Verified Identityの親ドメイン配下のサブドメインを使用するよう求めています。
また、そのサブドメインは、
- 他のメール送信用途
- メール受信用途
などと兼用しないことが推奨されています。
今回なら、
sample.com
の専用MAIL FROMとして、
mail.sample.com
を用意する形です。
sample.com
│
├─ user@sample.com
│ └─ Header From
│
└─ mail.sample.com
└─ Custom MAIL FROM専用
このように用途を分けておくと理解しやすくなります。
DKIMは何を認証している?
次にDKIMです。
DKIM(DomainKeys Identified Mail)は、送信メールに電子署名を付与し、
このメールが正規のドメインから送られ、途中で改ざんされていないか
を受信側で検証する仕組みです。
Amazon SESでは、Easy DKIMを利用できます。
Easy DKIMを利用すると、SESがメールへのDKIM署名を自動的に行います。現在、Easy DKIMでは2048ビットがデフォルトです。
Easy DKIMではCNAMEを設定する
sample.com をSESのDomain Identityとして登録しEasy DKIMを使用すると、SESからDKIM用のDNSレコードが提示されます。
通常は3つのCNAMEレコードです。
例えば概念的には、
xxxxx._domainkey.sample.com CNAME xxxxx.dkim.amazonses.com
のようになります。
実際にはSESコンソールで表示された値をそのまま登録します。
sample.com
│
├─ xxxxx._domainkey.sample.com
│ └─ CNAME → SES
│
├─ yyyyy._domainkey.sample.com
│ └─ CNAME → SES
│
└─ zzzzz._domainkey.sample.com
└─ CNAME → SES
Easy DKIMでは、SESから提示されたCNAMEレコードを使用します。
リージョンなどによってCNAMEの値が異なる場合があるため、dkim.amazonses.com を固定値として手作業で組み立てるのではなく、SESコンソールに表示された値を使用するのが確実です。
DKIMにもDMARC Alignmentがある
DMARCでは、DKIMについても単に署名が正しいだけではなく、
Header From
と、
DKIM署名のd=ドメイン
のAlignmentを確認します。
例えば、
Header From:
user@sample.com
DKIM:
d=sample.com
ならAlignmentしています。
AWS公式でも、DKIMによってDMARCに準拠するには、DKIM署名が有効であることに加えて、DKIM署名のドメインとHeader FromドメインがAlignmentしている必要があると説明されています。
SPFとDKIMは両方PASSしないとダメ?
ここもよく混乱するポイントです。
DMARCは、
SPF AND DKIM
ではありません。
基本的には、
SPF + Alignment
または
DKIM + Alignment
のどちらかが成功すればDMARC PASSになります。
つまり、
SPF NG
DKIM OK + Alignment OK
→ DMARC PASS
もあり得ます。
逆に、
SPF OK
Alignment NG
DKIM NG
→ DMARC FAIL
です。
AWSも、DMARC準拠にはSPFまたはDKIMによる認証が必要であり、両方を使用することがより望ましいとしています。
今回の本番環境を整理する
ここまでを今回の構成に当てはめます。
Header From
user@sample.com
Custom MAIL FROM
mail.sample.com
SPF
mail.sample.com
TXT "v=spf1 include:amazonses.com ~all"
MX
mail.sample.com
MX 10 feedback-smtp.ap-northeast-1.amazonses.com
DKIM
xxxxx._domainkey.sample.com
CNAME
SESから指定された値
DMARC
前回設定した、
_dmarc.sample.com
TXT "v=DMARC1; p=none; sp=reject; np=reject;"
です。
全体を並べると、
STGも基本的には同じ
STGでは、
Header From:
user@stg.sample.com
Custom MAIL FROMを、
mail.stg.sample.com
とします。
その場合、
mail.stg.sample.com
MX 10 feedback-smtp.ap-northeast-1.amazonses.com
mail.stg.sample.com
TXT "v=spf1 include:amazonses.com ~all"
を設定します。
DKIMも、
xxxxx._domainkey.stg.sample.com
CNAME
SESから指定された値
を設定します。
前回のDMARCは、
_dmarc.stg.sample.com
TXT "v=DMARC1; p=none;"
です。
つまり本番とSTGは、
| 設定 | 本番 | STG |
|---|---|---|
| Header From | sample.com |
stg.sample.com |
| Custom MAIL FROM | mail.sample.com |
mail.stg.sample.com |
| SPF | mail.sample.com |
mail.stg.sample.com |
| DKIM | sample.com |
stg.sample.com |
| DMARC | _dmarc.sample.com |
_dmarc.stg.sample.com |
という対応になります。
SPFを設定するときの注意点
SPFはTXTレコードとして設定します。
例えば、
v=spf1 include:amazonses.com ~all
です。
ここで注意したいのが、同じドメインに複数のSPFポリシーを作らないことです。
例えば同じドメインに、
v=spf1 include:_spf.google.com ~all
と、
v=spf1 include:amazonses.com ~all
を別々のSPFレコードとして作るのではなく、必要なら、
v=spf1 include:_spf.google.com include:amazonses.com ~all
のように1つのポリシーへ統合します。
ただし今回の設計では、
mail.sample.com
をCustom MAIL FROM専用として使うため、そもそも他サービスと共用しない構成にしておく方がシンプルです。
Custom MAIL FROMのMXが壊れた場合
Amazon SESでは、Custom MAIL FROMのMXレコードが正しく設定されていない場合の動作を選択できます。
選択肢は大きく、
Use default MAIL FROM domain
または、
Reject message
です。
Use default MAIL FROM domain
Custom MAIL FROMが利用できなければ、SESのデフォルトMAIL FROMへフォールバックします。
mail.sample.com
↓
利用できない
↓
xxxxx.amazonses.com
Reject message
Custom MAIL FROMを利用できなければ、メール送信自体を拒否します。
セキュリティや認証設計として、
必ずCustom MAIL FROMを使いたい
という要件であれば、フォールバックを許可するかどうかも設計時に確認しておきたいポイントです。
よくある勘違い
From: user@sample.com だからSPFも sample.com に設定する?
必ずしもそうではありません。
SPFが確認するのはMAIL FROMです。
今回なら、
MAIL FROM:
xxxx@mail.sample.com
なので、
mail.sample.com
にSES用SPFを設定します。
SPFがPASSすればDMARCもPASSする?
違います。
DMARCでは、
SPF PASS
+
Header FromとのAlignment
が必要です。
SESならCustom MAIL FROMを必ず設定する必要がある?
いいえ。
SESのデフォルトMAIL FROMでもSPF自体は認証できます。
ただし、
Header From:
sample.com
MAIL FROM:
amazonses.com
となるため、SPFによるDMARC Alignmentを成立させたい場合にはCustom MAIL FROMが重要になります。
DKIM側でDMARC Alignmentを成立させる方法もあります。
SPFとDKIMの両方がPASSしないとDMARC FAIL?
違います。
基本的には、
SPF + Alignment
または、
DKIM + Alignment
のどちらかが成功すればDMARC PASSです。
Custom MAIL FROMのMXとSPFは同じレコード?
違います。
MX
と、
TXT
の別レコードとして設定します。
ここまでのポイント
今回のポイントを整理します。
- メールにはHeader FromとMAIL FROMがある
- 普段見えるFromはHeader From
- SPFが認証するのはMAIL FROM側
- SESのデフォルトMAIL FROMは
amazonses.com配下 - Custom MAIL FROMを使うと自分のサブドメインをMAIL FROMにできる
-
mail.sample.comをCustom MAIL FROMにした場合、SES用SPFはmail.sample.comに設定する - Custom MAIL FROMにはSPFだけでなくMXも必要
- DMARCではSPFの認証だけでなくHeader FromとのAlignmentが必要
-
sample.comとmail.sample.comはRelaxed AlignmentならAlignmentできる - Easy DKIMではSESがDKIM署名を行う
- DKIMにもHeader FromとのAlignmentがある
- DMARCはSPFまたはDKIMのどちらかがAlignmentを含めて成功すればPASSできる
- SPF / DKIMの両方を設定しておく方が望ましい
最終的に今回の本番環境では、
Header From
user@sample.com
↓
Custom MAIL FROM
mail.sample.com
↓
SPF
v=spf1 include:amazonses.com ~all
+
DKIM
d=sample.com
↓
DMARC
_dmarc.sample.com
という関係になります。
次回:Route 53で未使用サブドメインを塞ぐ
ここまでで、
DMARC
SPF
DKIM
Custom MAIL FROM
の関係が整理できました。
しかし、まだ一つ課題があります。
例えば攻撃者が、
From:
attacker@dummy.sample.com
のような、メール送信に使用していないサブドメインを勝手に利用するケースです。
そこで次回は、
「【AWS SES メール認証・なりすまし対策③】Route 53で未使用サブドメインのメールなりすまし対策 ~Wildcard SPF・Null MX・Hosted Zone分離~」
として、
-
*.sample.comのWildcard SPF v=spf1 -all- Null MX
-
sp/npとWildcard DNSの関係 -
stg.sample.comを別Hosted Zoneへ分離した場合 - 親Hosted Zoneと子Hosted Zoneの役割
- どこにDNSレコードを登録すべきか
- 実際にDNS登録時にハマったポイント
を整理します。
参考資料