1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AWS SES メール認証・なりすまし対策②】SPF・DKIM・Custom MAIL FROMを正しく理解する ~Header Fromとの違いを整理~

1
Posted at

はじめに

前回の記事では、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登録時にハマったポイント

を整理します。


参考資料

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?