Amazon SESでカスタム MAIL FROM ドメインを設定してSPFもDMARCに準拠させる

2023.08.21

初めに

先日別件の記事でAmazon SESから送信したメールのソースをふと眺めていたらとあることに気づきました。

$ cat 8tpor8aqevgfuplvt7409odt534no0ecvqd0gdg1
Return-Path: <01060189f205a36a-b6171201-92c9-462b-b019-3403a5464943-000000@ap-northeast-1.amazonses.com>
Received: from e234-12.smtp-out.ap-northeast-1.amazonses.com (e234-12.smtp-out.ap-northeast-1.amazonses.com [23.251.234.12])
 by inbound-smtp.us-east-1.amazonaws.com with SMTP id 8tpor8aqevgfuplvt7409odt534no0ecvqd0gdg1
 for receive@example.com;
 Mon, 14 Aug 2023 03:10:35 +0000 (UTC)
X-SES-Spam-Verdict: PASS
X-SES-Virus-Verdict: PASS
Received-SPF: pass (spfCheck: domain of ap-northeast-1.amazonses.com designates 23.251.234.12 as permitted sender) client-ip=23.251.234.12; envelope-from=01060189f205a36a-b6171201-92c9-462b-b019-3403a5464943-000000@ap-northeast-1.amazonses.com; helo=e234-12.smtp-out.ap-northeast-1.amazonses.com;
Authentication-Results: amazonses.com;
 spf=pass (spfCheck: domain of ap-northeast-1.amazonses.com designates 23.251.234.12 as permitted sender) client-ip=23.251.234.12; envelope-from=01060189f205a36a-b6171201-92c9-462b-b019-3403a5464943-000000@ap-northeast-1.amazonses.com; helo=e234-12.smtp-out.ap-northeast-1.amazonses.com;
 dkim=pass header.i=@example.com;
 dkim=pass header.i=@amazonses.com;
 dmarc=pass header.from=example.com;
X-SES-RECEIPT: AEFBQUFBQUFBQUFIVXdPa2dtMFozUnZ3S2diOG9QWkw0U0hNVXIzUjNFMnJYU0I5OXg4bmNiOW0vZ1ZjbTFBRWNvcGR2bE1KWER4N3M3YjduVzgzMDBHWnJGMXFDWm9WWUVySnJkSTBRV2M2RUlaWnlia1hYOWllZENudGVjK25EQVMxTmpvdDlMaDVRQlZ3TnYyUVZCMWpVcEdHL1BaRVVXVnYycmIzbC9BdS9EWEFBTGpiMTlKZmpjcWpRTUxYMFAwSEEwQlN3d2huWWtCNmZvdEE0bS8xTTZ1dlFtMXgxQ21HemVqZE1GcDV0bEFHVkk3clRua3dJREcxTHhvaGdZeVJyWEhBZHNRT1JoamxFSG12MzdQZzY5YjQyMGJMeDhqbXBLSjRaRjhIV1Z0bXZtbk9BT09rM0Z6UXVsSE4rdU1NU1g3SEJPdkxJWDcyWFR6cmh6TVM1eHIyYzM1YkdOdlVDenRHaERHbjkyY0hoUGUzRW5Hall2OGQ3NHlPTVJWZ1VzN1QvSjd3PQ==
X-SES-DKIM-SIGNATURE: a=rsa-sha256; q=dns/txt; b=PVyIOOfAnvqLXKgX7bMu5TFXrxJc6tSpvT4qSkUBU951SUN/wIbRi8v1k7VuJmqbUppBNOKhWFaRu4xH7eoj7Iz8tc43swXr3aZUAPyc62Ep1tXzc1NSKWq6rcX9EJUg8YaD53I3Iwk5oxUCuqecMPDF8/WqqiVlA0jYDIifM04=; c=relaxed/simple; s=224i4yxa5dv7c2xz3womw6peuasteono; d=amazonses.com; t=1691982636; v=1; bh=o6solQa8Aa4YV3Xbb2eudWnbQ8TTQxiUB4zEXn3S7c0=; h=From:To:Cc:Bcc:Subject:Date:Message-ID:MIME-Version:Content-Type:X-SES-RECEIPT;
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/simple;
	s=eogp72tvvmnugysm4vjttzghjnmzww36; d=example.com; t=1691982603;
	h=From:To:Subject:Message-Id:Date;
	bh=o6solQa8Aa4YV3Xbb2eudWnbQ8TTQxiUB4zEXn3S7c0=;
	b=cLPmiYmPBxbplo1vxSOJcscvxt/m3ktc0PdAhtVgoR7sWPaw31bDC0i8WeNXcmGL
	MEc/agcwNyNGete54ZJICny2hgcgbo3wjSvP/kL9ufkTWkXoGh0AgcNfig39KxZP1L1
	XgXEPKzPg8trXyBW4XzmrsnTlNXWf9dMNYSIcpyrSEN2NBQ8YbL6QSt37+7pRZUJG8Q
	AOGE4i6MMf0Dn+66ugHkawjSu8lwYKtsyPHfzUl4BjUsWITeFxw8AET+WfauPio3+qM
	pPxckll7vCUJvncY+h2I5m39JpXDJjlv47TdSuGbpXK5+QpICMdXo/v5eC1p+MCDSgm
	KiB/QLuXZA==
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/simple;
	s=zh4gjftm6etwoq6afzugpky45synznly; d=amazonses.com; t=1691982603;
	h=From:To:Subject:Message-Id:Date:Feedback-ID;
	bh=o6solQa8Aa4YV3Xbb2eudWnbQ8TTQxiUB4zEXn3S7c0=;
	b=pPx24lewgxm01W6wjgzXnMHO+/wExtnBEkmZmtHzAARJ1jbPfgXmeKYCzG20XXDp
	GFcgWnAcy82ghaaO1+00N5H1IRu3oKYzphHWdsZDMtkaEhJLrCeeVjtnHzVoz7Ar+Yc
	pQA61BC1i9pT6ibgkPJZ8X48kp7hTR8301T/G3Ik=
From: postfix@example.com
To: receive@example.com
Subject: from ses
Message-ID: <01060189f205a36a-b6171201-92c9-462b-b019-3403a5464943-000000@ap-northeast-1.amazonses.com>
Date: Mon, 14 Aug 2023 03:10:03 +0000
Feedback-ID: 1.ap-northeast-1.l/gZ9AdA66AoXDKqqW7JL8Sqq70qA5ce8pt+MQx0Zi4=:AmazonSES
X-SES-Outgoing: 2023.08.14-23.251.234.12
...

このメールDMARCの要件をDKIM側で満たしているけどSPF側満たしてなくない?と。

とはいえこれが問題になるかと言われると個人的には多くの場合はノーかと考えています。

でも今回は気づいてしまったわけですし、到達率に課題がある場合に極々僅かでも可能性が上がる要素として使えるかもしれないので何が問題となっているかをみていきましょう。

RFC5321.FromとRFC5322.From

本題に入る前にまずはメールにおける2つのFromを知る必要があるためその話をします。

一般的にはそれぞれエンベロープFrom(RFC5321.From)、ヘッダーFrom(RFC5322.From)と呼称されることが多いですが、DMARCを定義するRFC7489では括弧内の用語で呼称されているため本記事内ではそちらの呼称を利用します。

詳しくはRFC5322(特に2.3.1.)あたりを一度読んでみると良いですが、大きくメールというオブジェクトはエンベロープ(封筒)とコンテンツに分かれていいます。

ざっくり理解するのであればエンベロープはその名の通り封筒で配達先に対して届けるための情報が記載されており(主にシステム的な値)、コンテンツはその封筒の中に入っている便箋(メール本文)や同封物(添付ファイル)といったものをイメージしてもらうのがわかりやすい。

ここではなぜ2つのFromがあるかや用途については触れませんが、それぞれ以下の方法で確認・指定されます。

  • RFC5321.From
    • 送信する際はMAIL FROMに指定
    • 受信した際はReturn-Pathに指定される値を確認(バウンスの通知先)
  • RFC5322.From
    • 送信する際のFromに指定する
    • メーラー等で実際に"送信者"として表示される値(メーラーによる差異あり)

2つのFromとSPF

SPFレコードの判定に使用するドメインはRFC5321.Fromに指定されるアドレスのドメインを参照しRFC5322.Fromは採用しません。

そのためなりすまし者がFromのアドレスに正規のドメイン(officialdomain)、自分のドメイン(baddomain)をRFC5321.Fromに設定してSPFレコードに自身の送信元のIPを指定すればSPFレコードとしてはpass扱いで送信できます。

Return-Path: <order@baddomain> # ここはメーラーで直接見えない。SPFの対象
...
From: <order@officialdomain> # ここがメーラーで見える
Subject: 商品注文のお知らせ

実際に「初めに」に記載したメールをメーラーで表示するとこの現象が起こっていることを確認できます。
(example.com部分は実際には私の保持するドメインですがファイルを直接書き換えています)

スパムメールの判定を怪しい日本語で見分ける方が多いですが、もしこの手のメールで本文がしっかりしている場合気づかずにみてしまう人も多いのではないでしょうか。

一応最近だと2つのFromの表示については一定受信メールサービス側で対策がされているところもあるようで、GMailを確認したところアドレスの部分に以下のような表示がされてRFC5321.Fromのドメインが確認できるようになってはいました。

送信者名 order@officialdomain baddomain 経由

とはいえこれをみて気づける人はそもそもなりますまし等に引っかからない気はします。

DMARCで取り扱うFrom

さてここからが本題です。

以前DMARCに関する記事を書いた際にDMARCが適用されるための条件としてSPFもしくはDKIMによる検証に合格していると書いたことがあります。

改めてRFC7489を読んでみると要件はこれだけでなくSPFについてはRFC5321.From(もしくはHELOのドメイン)とRFC5322.Fromのドメインが一致している必要があるこということが述べられていました。

DMARC authenticates use of the RFC5322.From domain by requiring that it match (be aligned with) an Authenticated Identifier.

上記で述べられる認証済み識別子(Authenticated Identifier)とは別のセクション(4.1.)にて述べられています。

o [DKIM], which provides a domain-level identifier in the content of the "d=" tag of a validated DKIM-Signature header field.
o [SPF], which can authenticate both the domain found in an [SMTP] HELO/EHLO command (the HELO identity) and the domain found in an SMTP MAIL command (the MAIL FROM identity). DMARC uses the result of SPF authentication of the MAIL FROM identity. Section 2.4 of [SPF] describes MAIL FROM processing for cases in which the MAIL command has a null path.

またDAMRCではSPFとは違いRFC5321.FromではなくRFC5322.Fromを判定に利用するとしており、理由としてはRFC5322.Fromは実際にユーザに見える値でありDMARCは受信者に対してこれが信頼できるものであると表現するための仕組みであるものとしています。

The RFC5322.From domain was selected as the central identity of the DMARC mechanism because it is a required message header field and therefore guaranteed to be present in compliant messages, and most Mail User Agents (MUAs) represent the RFC5322.From field as the originator of the message and render some or all of this header field's content to end users.
...
the mechanism described in this document provides recipient end users with strong evidence that the message was indeed originated by the agent they associate with that mailbox, if the end user knows that these various protections have been provided.

明確には述べられていませんがDKIMで少なくともRFC5322.Fromのdが一致しpassとなる=2つのFromが異なっても同一の秘密鍵を提供できる、SPFの場合は2つのFromが一致する=2つのシステムのドメイン所有者が同じという形管理者内のシステムであることを保証しそれを前提とするからDMARCではRFC5322.Fromを信頼して利用できるもの、と個人的には解釈しています。

さて、先ほどのメールを思い出してみるとDKIMについてはこの要件を満たせているものの、SPFについてはReturn-Path(RFC5321.From)From(RFC5322.From)の値が一致していないないためDKIM片系統のみでDMARCの要件を満たしていることがわかります。

とはいえこれが致命的な問題になるか?と言われると自分が実際に受信しているメールを見る限り多くのケースでは問題にならないかと思います。

あくまで自分が見る限りですので実際にはそういったところまで見るサービスもあるかもしれませんし、DMARCをp=rejectのような厳しい設定しているようであればもし誤ってDKIMキーを含むDNSレコードを削除してしまうとメールが到達しなくなってしまうため念のため揃えおくのが無難かもししれません。

カスタム MAIL FROM ドメイン

Amazon SESではカスタムMAIL FROM ドメインという設定を行うことでRFC5321.Fromのドメインをユーザ側の指定した値にすることができます。

これを使ってSPFもDMARCに準拠したものにしていきます。

設定は検証済みIDの中の詳細画面の中から可能です。

とはいえRFC5321.Fromに対してなんでも好きなドメインが指定できるというわけではなく、検証済みIDのサブドメインとなるもののみとなります。

DMARCではドメインの一致判定には完全一致の厳格モードと、サブドメインが許可される緩和モード(デフォルト)の2つのモードがありますがサブドメインを利用する形となるため必然的に緩和モードを利用することとなりそうです。

MX障害時の動作については名前解決失敗時(正しく設定されていない等)にデフォルトのドメインを利用するかメールの送信を止めるか(エラーとなる)の選択です。

カスタム MAIL FROM ドメインを利用するように設定するとDNSの設定が要求されるためそれを設定します。

SES ではカスタム MAIL FROM ドメインが E メールプロバイダーから送信されたバウンスと苦情の通知を受信できるように、MX レコードを設定する必要があります。
...
Amazon SES でカスタムの MAIL FROM ドメインを正しくセットアップするには、MAIL FROM ドメインの DNS サーバーに、MX レコードを 1 件のみ発行する必要があります。MAIL FROM ドメインに複数の MX レコードがあると、Amazon SES でのカスタム MAIL FROM のセットアップは失敗します。

SPFレコードはRFC5321.Fromを利用するようになるためそれに対応するためのSPFの設定でMXはバウンスや苦情をAmazon SES側で受け取るためのものとなります。

MXは他のものと共存するとエラーとなるようなので他のサービスで利用しないような専用のサブドメインを用意しておくのが良いでしょう。

送信してみるとしてみると無事Return-Path(RFC5321.From)が指定のドメインに書き換わっておりSPFもそのドメインで行われていることが確認できます。

Return-Path: <0106018a1783f342-87c583bf-a541-44d0-bddb-91fa5f397628-000000@ses.example.com>
Received: from e234-10.smtp-out.ap-northeast-1.amazonses.com (e234-10.smtp-out.ap-northeast-1.amazonses.com [23.251.234.10])
 by inbound-smtp.us-east-1.amazonaws.com with SMTP id pt6bdsh2mcr1vjnm84iojvvgt04ru9r8f02pfa81
 for receive@example.com;
 Mon, 21 Aug 2023 09:54:01 +0000 (UTC)
X-SES-Spam-Verdict: PASS
X-SES-Virus-Verdict: PASS
Received-SPF: pass (spfCheck: domain of ses.example.com designates 23.251.234.10 as permitted sender) client-ip=23.251.234.10; envelope-from=0106018a1783f342-87c583bf-a541-44d0-bddb-91fa5f397628-000000@ses.example.com; helo=e234-10.smtp-out.ap-northeast-1.amazonses.com;
Authentication-Results: amazonses.com;
 spf=pass (spfCheck: domain of ses.example.com designates 23.251.234.10 as permitted sender) client-ip=23.251.234.10; envelope-from=0106018a1783f342-87c583bf-a541-44d0-bddb-91fa5f397628-000000@ses.example.com; helo=e234-10.smtp-out.ap-northeast-1.amazonses.com;
 dkim=pass header.i=@example.com;
 dkim=pass header.i=@amazonses.com;
 dmarc=pass header.from=example.com;
X-SES-RECEIPT: AEFBQUFBQUFBQUFIa04zRTA0VUpOMlIxbmtiUWNPaWg5WjNTdUE2TXBOaVI2ODJuU0U0aVZCZEQ3WVJZQllMK0l1VVRGNHZpekZsTU1oempQZE9wb1BSTCtFWlo5eVkzeTBJdTdoNk1jU2dxVjh6UGxQdG5YMWNBenhJZUFaVCs5NXZLSERkQmwvb0RJZVE4ek8rTktBYlAzSkoyN1hGVHEwWXlYZXptczNqZGZnc0lkS3dRUEQyYjJST0h0NjNWeVA5bXhqWHRUWWdjcHpQRkl3Tzd5bzNBNS9TWnh2cTM3YjN5bVhNa0NwRE03S2RhUS81Q3o4OU12VW9ZTHNZWXJYVWhIRUJjd0QrWDZ6WllqQ2IyNE84VENkUjJ5K3hsbWxLQllTY1NZOGo3RkRzMkRZVjY5dElBV29RWmdCOWttODNiaGszVnR5M2VNWnc1SmNKbDVxMnl4V0M5YjNHM0JpTHlrRVJlamlPbGlRRFA3Z2owN1k2a2s1eDZJVGdFa1BqUTNjY2l4dkdBPQ==
X-SES-DKIM-SIGNATURE: a=rsa-sha256; q=dns/txt; b=XPSnyM2eEkAbFVtJKBu5AA3QN/XJ7rBonw7rHS/3oEJ4scyc4ORJlnU02WsOgLoIygbncmei77oNHDU9/yG3QT6A84y+LlZIa9tlCPvJsiJ7Xkt+fvdk2F1S3uo/Rz+nqWjJ5g9WSjTYSTq45/8CPqjA0vgh6G4+9PJKHBLT4Hw=; c=relaxed/simple; s=224i4yxa5dv7c2xz3womw6peuasteono; d=amazonses.com; t=1692611642; v=1; bh=o6solQa8Aa4YV3Xbb2eudWnbQ8TTQxiUB4zEXn3S7c0=; h=From:To:Cc:Bcc:Subject:Date:Message-ID:MIME-Version:Content-Type:X-SES-RECEIPT;
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/simple;
	s=eogp72tvvmnugysm4vjttzghjnmzww36; d=example.com; t=1692611638;
	h=From:To:Subject:Message-ID:Date;
	bh=o6solQa8Aa4YV3Xbb2eudWnbQ8TTQxiUB4zEXn3S7c0=;
	b=Md0nkDPSAdsUiV+He2oWVPClg+gswbvUzK3mLVTSk9jfUa6Eu9ZLwmk8B9z1S4l0
	3S7KhYswZa7uPaqiZCwhHNHKqyzZVZOEJZMn+svyw1QjdjyQVdYlNkSCDu78l11+rnz
	WP17wZureLlSxGskOAmO2m3RUb6nlmUChK6z0Am3jKVqx9I9M5txqTN31Th834lwYR7
	DbAuzb8SwM14gPMOs05f4cA4N4Y4WUk1oLug2xvgDScTymnoxJ0oDlpZChXnX3XFlcW
	0bWNXO6oPL3C9IgvxdJVsNiFtYjXD/vcQCAbJY8W526azyZ/q3nI7A+bCED7rpcFxzc
	1lROWBThrw==
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/simple;
	s=zh4gjftm6etwoq6afzugpky45synznly; d=amazonses.com; t=1692611638;
	h=From:To:Subject:Message-ID:Date:Feedback-ID;
	bh=o6solQa8Aa4YV3Xbb2eudWnbQ8TTQxiUB4zEXn3S7c0=;
	b=XVXxU4FlWjGYptvnu7E0DPABGcne6tMJM3CONO/k6f3S+hD0JnqLWPyuqoEwIL8O
	+Yp2Xmh4iCMLtGomd/R1Y6wBsRhmSHcLCb5JC2fc4EUbSXQuiK2LZPfTBomXp6JSwEV
	StDFVVtDF05hHBR8IrZKHQDi9VGnCNH0LiMujQtQ=
From: success@example.com
To: receive@example.com
Subject: from ses
Message-ID: <0106018a1783f342-87c583bf-a541-44d0-bddb-91fa5f397628-000000@ap-northeast-1.amazonses.com>
Date: Mon, 21 Aug 2023 09:53:58 +0000
Feedback-ID: 1.ap-northeast-1.l/gZ9AdA66AoXDKqqW7JL8Sqq70qA5ce8pt+MQx0Zi4=:AmazonSES
X-SES-Outgoing: 2023.08.21-23.251.234.10

Im from SES

流石にHELOに関してはユーザ任意のものではなくSESのものとなるようです。

終わりに

カスタムMAIL FROMを設定してAmazon SESから送信されるメールをSPFとDMARC両方DMARCの要件を満たせるように設定してみました。

メールソースを見ても明確に認証失敗のようなエラーは出ませんしこの辺りについては知っていないと見てもわからないポイントではないかと思います(逆に知らなくとも問題ないレベルとも言える)。

現時点ではここまで厳密にチェックされるメールサービスがどの程度あるのか?というのは見えない部分ではありますが、正しく設定されていればメール到達に関してプラスになることはあってもマイナスになる可能性は低いでしょう。

ただこれが設定されていないから受信しなくなるか?と言われたら自分が見える範囲ではノーという感じであり無理に設定するほどのものではないかと思います。
(逆に何かの拍子でSPFレコード消してpass以外になるほうが実害ありそうな気がする)