SPF, DKIM, DMARC設定について、わからないことを調べる

一時期話題になったSPF, DKIM, DMARCを、実際に設定しながら分からないことを調べていく。

まずは、SPFから。

SPFとは
SPF(Sender Policy Framework)は、メールの送信元ドメインが詐称されていないことを証明するための技術です。これにより、送信元のドメインが詐称されていないドメインだと確認でき、SPF認証を受けたメールは迷惑メールやなりすましでないことが証明されます。

メールの受信サーバが、送信元のドメインが詐称されていないことを確認するための設定みたい

実際に設定してみる。
前提条件
- メールの送受信は、Google Workspaceが担当
- これ以外に送信を担当しているサーバは無い
- ネームサーバは、Cloudflareを利用している
設定の参考リンク

Google Workspace のみを使用している場合: v=spf1 include:_spf.google.com ~all というテキスト行をコピーし、SPF レコードを追加する(後述)に進みます。

Cloudflareの設定画面

v=spf1
とは?
Claudeに聞いてみた。
v=spf1 について説明します。
これはSPF(Sender Policy Framework)レコードのバージョン指定で、以下を意味します:
バージョン識別子
▪ v= はバージョンを示す識別子
▪ spf1 は SPF バージョン1を示す
▪ 現在使用されているSPFの標準バージョンは1のみSPFレコードの開始
▪ すべてのSPFレコードは必ず v=spf1 で始まる必要がある
▪ これがないとSPFレコードとして認識されない歴史的背景
▪ SPFの最初のバージョンを示す
▪ SPF2は提案されましたが、実装されることはなく、現在も spf1 が標準として使用されている

_spf.google.com
とは?
_spf.google.com はGoogleが提供するSPFレコードで、Google WorkspaceやGmailなどのGoogleのメールサービスから送信される正当なメールサーバーのIPアドレス一覧を含んでいます。このレコードを含めることで、Googleのメールサーバーからの送信を認証済みとして許可します。

IPアドレスを直接指定しなくてもいけるんや。
Google側が即時IPアドレスを追加したり、削除できるようになっている。
メンテナンスしやすくて、いいね。
あと、各IPアドレスやドメインの前に、+
や~
の設定をすることができるみたい。
+
の場合は省略可能。
特定のIPアドレスやドメインからのメールを確実に拒否したい場合などに使う。
-ip4:x.x.x.x
みたいに。

_spf.google.com
の中身を見てみる。
dig _spf.google.com TXT
;; ANSWER SECTION:
_spf.google.com. 300 IN TXT "v=spf1 include:_netblocks.google.com include:_netblocks2.google.com include:_netblocks3.google.com ~all"

dig _netblocks.google.com TXT
;; ANSWER SECTION:
_netblocks.google.com. 300 IN TXT "v=spf1 ip4:35.190.247.0/24 ip4:64.233.160.0/19 ip4:66.102.0.0/20 ip4:66.249.80.0/20 ip4:72.14.192.0/18 ip4:74.125.0.0/16 ip4:108.177.8.0/21 ip4:173.194.0.0/16 ip4:209.85.128.0/17 ip4:216.58.192.0/19 ip4:216.239.32.0/19 ~all"

dig _netblocks2.google.com TXT
;; ANSWER SECTION:
_netblocks2.google.com. 300 IN TXT "v=spf1 ip6:2001:4860:4000::/36 ip6:2404:6800:4000::/36 ip6:2607:f8b0:4000::/36 ip6:2800:3f0:4000::/36 ip6:2a00:1450:4000::/36 ip6:2c0f:fb50:4000::/36 ~all"

dig _netblocks3.google.com TXT
;; ANSWER SECTION:
_netblocks3.google.com. 300 IN TXT "v=spf1 ip4:172.217.0.0/19 ip4:172.217.32.0/20 ip4:172.217.128.0/19 ip4:172.217.160.0/20 ip4:172.217.192.0/19 ip4:172.253.56.0/21 ip4:172.253.112.0/20 ip4:108.177.96.0/19 ip4:35.191.0.0/16 ip4:130.211.0.0/22 ~all"

~all
とは?
~all はSPFレコードのソフトフェイル(Softfail)設定を示します。この設定では、SPFレコードに記載されていない送信元IPアドレスからのメールは完全には拒否されず、スパムフォルダに振り分けられたり、疑わしいメールとしてマークされたりします。

Cloudflareの設定画面にも書いてあった

このポリシーの挙動は、送信者側が指定する感じなのか?
ちょい違和感がある。

いいえ、受信側は送信側が指定した ~all(Softfail)の指示に必ずしも従う必要はありません。
受信側には以下のような裁量があります:
SPF検証結果の扱い
▪ 送信側の ~all 指定は「推奨」や「ヒント」程度の意味
▪ 受信側は独自のポリシーに基づいて判断可能
▪ より厳しく(完全拒否)することも、緩く(普通に受信)することも可能受信側の判断例
▪ スパムフォルダに振り分ける
▪ 受信を完全に拒否する
▪ スパムスコアの一要素として扱う
▪ 警告フラグを付けるだけ
▪ 通常のメールとして扱う他の要素との組み合わせ
▪ SPFは判断材料の1つに過ぎない
▪ DKIM、DMARC等の他の認証結果と組み合わせて判断
▪ 受信者独自のスパム対策ルールと組み合わせて最終判断つまり、SPFレコードの ~all は送信側からの提案であり、最終的な判断は受信側のポリシーに委ねられています。

なるほど、提案、推奨的な設定なのか。

Cloudflareの設定画面で、
- ドメイン:
_spf.google.com
- ポリシー:
~all
を設定した。

ちょっと気になったので、他のドメインのSPFを見てみる。
dig cyberagent.co.jp TXT
;; ANSWER SECTION:
cyberagent.co.jp. 300 IN TXT "v=spf1 include:_spf.cyberagent.co.jp include:_spf.google.com include:amazonses.com include:_spf.activegate-ss.jp include:spf-bma.mpme.jp include:spf.protection.outlook.com ~all"
(一部抜粋)

dig apple.com TXT
;; ANSWER SECTION:
apple.com. 3600 IN TXT "v=spf1 include:_spf.apple.com include:_spf-txn.apple.com ~all"
(一部抜粋)

次に、DKIM。

DKIMとは
DKIM(DomainKeys Identified Mail)は、電子署名を利用してメールの送信元および内容の改ざんがないかどうかを認証する仕組みです。DKIM認証を受けたメールは、改ざんされていないことが証明されます。

Claudeにも聞いてみる。
DKIMは電子メールの認証技術で、以下の特徴があります:
仕組み
▪ メール送信時に電子署名を付加
▪ 暗号化された署名(ハッシュ値)をメールヘッダーに追加
▪ 受信側がDNSから公開鍵を取得して署名を検証主な目的
▪ メールの内容が途中で改ざんされていないことを確認
▪ 送信ドメインの正当性を証明
▪ なりすましメールを防止検証内容
▪ メールの送信元が正当なものか
▪ メール本文が送信後に改ざんされていないか
▪ 送信者が主張するドメインの所有者からの正当な送信か

SPFとの違いは?
認証の対象と方法
▪ SPF:送信元メールサーバーのIPアドレスを認証
「このIPアドレスからの送信は許可されているか?」を確認
DNSで許可されたIPアドレスリストと照合
▪ DKIM:メール自体の内容と送信者の認証
電子署名によってメールの内容を保証
公開鍵暗号方式で署名を検証
メール本文の改ざんも検知可能転送時の動作
▪ SPF:メール転送時に認証が失敗する可能性が高い
転送すると送信元IPが変わってしまうため
▪ DKIM:メール転送後も有効
署名はメールヘッダーに含まれているため、転送されても署名は維持されるなりすまし対策の観点
▪ SPF:送信サーバーの正当性を確認
許可されたサーバーからの送信かを検証
▪ DKIM:送信者の身元とメール内容の完全性を保証
電子署名により送信者を認証
メール内容の改ざんも検知このように、SPFとDKIMは異なる側面からメールの認証を行う補完的な技術となっています。そのため、多くの場合両方を併用することで、より強固なメール認証を実現しています。

Cloudflareの設定画面

設定の参考リンク

Googleのヘルプページ (上の投稿のページ) の説明が分かりやすい
どのようなフローで処理されるのか

「送信メール ゲートウェイを使用する場合」という記載があるが、今回の場合は使用していなさそうなので、スキップ

ヘルプページを参考にGoogle Workspaceの管理画面で値を発行
DNSホストの名前 (TXTレコード名):google._domainkey
TXTレコードの値:v=DKIM1; k=rsa; p=hogefuga
(公開される値なので伏せる必要はないが、長いので省略)

構文
(Claude回答を一部編集)
- 基本構文
v=DKIM1; k=rsa; p=公開鍵; [オプションのタグ...]
- 必須タグ
- v=DKIM1
- バージョン指定
- DKIM バージョン1を示す
- 現状、バージョン1しか存在しない
- k=rsa
- 使用する暗号化アルゴリズム
- 通常は RSA を使用
-
k=ed25519
もあるが、まだ広く採用されていない
- p=
- 公開鍵の値
- Base64エンコードされたRSA公開鍵
- 鍵を削除する場合は p= と空の値を指定
- v=DKIM1
- 主なオプションタグ
- t=
- フラグ(テストモード等)を指定
- t=y:テストモード
- t=s:サブドメインでのDKIM署名を禁止している
- n=
- メモ書き(注釈)
- 人間が読むための説明文
- s=
- サービスタイプ
- *:全てのサービスタイプ
- email:メールのみ
- t=
- 構文ルール
- セミコロン(;)で区切る
- スペースは任意
- タグは「タグ名=値」の形式
- 大文字小文字は区別しない
その他参考になりそうなリンク

Cloudflareに設定した
再びGoogle Workspaceの管理画面に戻り、認証を開始
ボタンをクリックした

「DKIM でメールを認証しています」と表示されている
ちょい時間かかりそう
最大48時間ほどかかるとのこと
他の設定をしながら待つ

その前に、他社のDKIM設定を見てみる

dig google._domainkey.cyberagent.co.jp TXT
;; ANSWER SECTION:
google._domainkey.cyberagent.co.jp. 300 IN TXT "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ZQjDjLh5qZIBSRebPK5zP3E9x8vde0FRSvUMXFN5yMsv9g4UXCBD0ZYEmLwDaNktqb+1WYSoTAMBD+8VFnLAO2KTmTGKoGXBqKeeiDi0d4XZO7z2H+ydRAh3/nAM1XDazlFNIsJqIH6QOR6/" "hvcOLWuNocwPhANG2dHTV7B1Xm55UqkRbXNBV9iz6BZ4Kcy52Q6oL3UfXyL2QoaSfKryVukEx/QtfWo+CngXtGXLwihPyC8DBrly8SoOxtqocet30bE/NYYXIC17854YVzCnDSRLNhLLL0XLOPtEcRj3tZMk5DeAaPC0LjdMmd56J5gh6t/GmexP+akz9/3jtSNcQIDAQAB"
公開鍵が複数ある?
このDNSレコードの見た目上の複数の値は、実際には1つの長い文字列を複数に分割して表示しているだけです。
DNSの仕様では、TXTレコードの1つの文字列は255バイトまでという制限があります。そのため、255バイトを超える長い文字列の場合、複数の文字列に分割して格納されます:
TXTレコードの仕様上、分割しているらしい。

AppleのDKIMを見たいが、プレフィックス (google
の部分) が分からない

実際に受信したメールがないと分からなさそう

Appleから受信したメールがあったので、それで確認した
ドメインはemail.apple.com
だった
プレフィックスはemail0517
だった
0517
はなんの番号なんだろう??

dig email0517._domainkey.email.apple.com TXT
;; ANSWER SECTION:
email0517._domainkey.email.apple.com. 30756 IN TXT "v=DKIM1; k=rsa; h=sha256; " "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy4V3QZgjpUK3HSijzU+u" "GQlfBx8N40Ese/TaM0P8BES/kTKJS7OvtEfmA+ihMYcwh+vpvjK7aBIpV2CT49Qn" "C/lXm8KwXad64VF18pgaCiuOW4rxC2L687Gn2BHEekcbl5FozRa716DLXpo07j5I" "X5sdvKPi6KylnmyOmjD/NqfvbLZf/lRlTb9pXf1N3fLu+W25vaotR4ZQpbrMQkKI" "ANDafdL4KvPmfFOfYuZYiLpQfHfuJYok0aROsS5as1cEthN9MnkdSBAJHLG/f63+" "jNLgSC9x77YBWH2gPIDIqEanPVPFPJjs0yNh1zCWJUma9ihNXNwBP9GDclt042th" "AwIDAQAB"

次にDMARC

DMARCとは
DMARC(Domain-based Message Authentication, Reporting & Conformance)は、メール詐欺攻撃から保護するための送信ドメイン認証技術です。SPFとDKIMを基にしており、メールに表示される送信元ドメインが信頼できるものかどうかを判断できます。

基本概念
▪ Domain-based Message Authentication, Reporting & Conformance の略
▪ SPFとDKIMの認証結果を統合的に評価するフレームワーク
▪ メール受信者に具体的な対処方法を指示できる主な機能
▪ 認証ポリシーの設定
none (p=none): 何もしない
quarantine (p=quarantine): 疑わしいメールを隔離
reject (p=reject): 認証失敗したメールを拒否
▪ 認証結果のレポート受信
送信ドメインの管理者が認証状況を把握可能
なりすましメールの検出と対策に活用SPF・DKIMとの関係
▪ SPFとDKIMの両方または一方の認証結果を利用
▪ より包括的なメール認証を実現
▪ 認証失敗時の具体的な対応方法を指定メリット
▪ なりすましメール対策の強化
▪ メール配信の透明性向上
▪ 送信ドメインの評判管理
▪ 不正利用の早期発見DMARCは、SPFとDKIMを補完し、より強固なメール認証システムを実現する重要な技術として位置づけられています。

SPFやDKIMの認証に失敗した際に、どのような対応を行うのかを指定するものかな

DMARCのポリシーは、SPFのポリシー同様、推奨値であり、受信者側が必ずしも従うわけではない。

設定の参考

48時間空けた方がいいと書いてあったので、何日か空けてみた
DMARC を有効にする前に SPF と DKIM を設定していない場合、ドメインから送信されたメールの配信に問題が発生する可能性があります。
SPF と DKIM を設定してから DMARC を設定するまでに、48 時間の間隔を空けてください。

構文ついて、Claudeに聞いた
基本フォーマット
v=DMARC1; p=policy; [追加のタグ]必須タグ
• v: バージョン(必ず"DMARC1")
• p: ポリシー(none, quarantine, reject のいずれか)主な任意タグ
• rua: 集計レポートの送信先メールアドレス
• ruf: 失敗レポートの送信先メールアドレス
• pct: ポリシーを適用するメールの割合(0-100)
• sp: サブドメインに対するポリシー
• aspf: SPFのアライメントモード(r/s)
• adkim: DKIMのアライメントモード(r/s)
• fo: 失敗レポートの生成オプション
• ri: レポート間隔(秒単位)

ポリシーは、どれにするのがいいか調べてみる

最初、最低1週間はnone
にするのがいいみたい
1週間レポートを監視して、送信メールに問題がないことを確認できたら、quarantine
に移行する

レポートの送信先としてメールアドレスを指定できるけど、メールの中身を毎回チェックするのはしんどい
DMARC Managementというのがあるみたい
メールを解析して、ダッシュボードで確認できるようにしてくれる
ネームサーバとしてCloudflareを使用しているので、これを利用するることにしよう

DMARC Managementの設定をすると、DMARCのレコードも生成される
設定を完了すると、以下のTXTレコードが追加された
v=DMARC1; p=none; rua=mailto:hogefuga@dmarc-reports.cloudflare.net
(公開される値だから伏せる必要はないけど、ボットとかにクロールされると迷惑なので一応)
(Cloudflare側で、スパムメールは解析不可として弾いてくれるとは思うけど、、)

休み明けしばらくダッシュボードをチェックして、問題がなさそうだったらquarantine
に移行しようかな

他社の設定を見てみる

dig _dmarc.cyberagent.co.jp TXT
_dmarc.cyberagent.co.jp. 300 IN TXT "v=DMARC1;p=none;rua=mailto:dmarc-reports@m.cyberagent.co.jp;"

dig _dmarc.email.apple.com TXT
_dmarc.email.apple.com. 2213 IN TXT "v=DMARC1; p=reject; rua=mailto:d@rua.agari.com; ruf=mailto:d@ruf.agari.com;"

agari.comとは?
アクセスしたら、ここにリダイレクトした

DMARCの設定終了!
にしても、Google WorkspaceのDKIMのステータスが「DKIM でメールを認証しています」のままだな、、
メールの送受信と認証はできてそうだし、一旦経過観察

今回の話については、以下の記事も参考になった

今回の話とは関係ないけど、BIMI (Brand Indicators for Message Identification) というものがあるみたい。
これは、メールの受信ボックスで会社等のロゴを表示するための仕組み。
ただ、ロゴが商標登録されている必要があるなど、対応が大変そう。
対応は見送り。