🎈

俺の考えた一番わかりやすいSPF/DKIM/DMARC解説(N番煎じ)

に公開2

そもそもなぜメール認証が必要なのか

メールは受信者側にとって「送信元が本物かどうか」を判断する仕組みがほとんどありません
その結果、以下のような なりすまし・フィッシング・詐欺 が横行しています

  • example.com を名乗った偽メールが届く
  • 送信元を偽装してわざと存在しない宛先に送り,バウンスメールを大量に送りつける(Backscatter)
  • 自社ドメインがスパム扱いになる

このような被害を防ぐために、送信元の正当性や内容の整合性を検証する仕組み が必要になりました
そこで登場するのが SPF / DKIM / DMARC です

登場人物(技術の役割)

仕組み 検証する対象 何を保証するか
SPF 送信元の IP / エンベロープFrom(MAIL FROM) このサーバーから送ってOK https://datatracker.ietf.org/doc/html/rfc7208
https://tex2e.github.io/rfc-translater/html/rfc7208.html
DKIM メールへの電子署名 内容が改ざんされてないこと https://datatracker.ietf.org/doc/html/rfc6376
https://tex2e.github.io/rfc-translater/html/rfc6376.html
DMARC SPF/DKIM + From の整合性 ドメイン名の真正性 https://datatracker.ietf.org/doc/html/rfc7489
https://tex2e.github.io/rfc-translater/html/rfc7489.html

全体の流れ(受信時の挙動)

  1. 受信サーバーが送信元 IP をチェック(SPF)
  2. メールに署名があれば検証(DKIM)
  3. From と SPF / DKIM の結果を突き合わせる(DMARC)
  4. DMARC ポリシーに従って合否を判断・処理

各技術の仕組みと注意点

SPF(Sender Policy Framework)

  • やっていること:
    • DNS の TXT レコードに「うちのドメインはどの IP から送るよ」と宣言する仕組み。
    • (追記 2026/1/12)受信サーバーがHELO/EHLOとMAIL FROMの両方をチェックする場合、以下の順序が推奨される(RFC 7208 セクション2.3):
      1. HELO/EHLOドメインのSPFレコードを確認
      2. MAIL FROM(エンベロープFrom)ドメインのSPFレコードを確認
example.com TXT "v=spf1 include:_spf.google.com ~all"
example.com. TXT "v=spf1 ip4:203.0.113.10 -all"
example.com. TXT "v=spf1 ip4:203.0.113.10 ip4:198.51.100.0/24 -all"

# さらなる具体例は以下
設定例

IPv4 を許可

example.com. TXT "v=spf1 ip4:203.0.113.10 -all"
  • 203.0.113.10 からの送信を許可
  • それ以外は すべて拒否

IPv4 複数

example.com. TXT "v=spf1 ip4:203.0.113.10 ip4:198.51.100.0/24 -all"

IPv6 を許可

example.com. TXT "v=spf1 ip6:2001:db8::/32 -all"

IPv4 + IPv6 混在

example.com. TXT "v=spf1 ip4:203.0.113.10 ip6:2001:db8::/32 -all"

include(外部メールサービスを使う場合)

Google Workspace

example.com. TXT "v=spf1 include:_spf.google.com -all"

Amazon SES

example.com. TXT "v=spf1 include:amazonses.com -all"

SendGrid

example.com. TXT "v=spf1 include:sendgrid.net -all"

include = 相手ドメインのSPFを丸ごと信頼

a(AレコードのIPを許可)

example.com. TXT "v=spf1 a -all"
  • example.com の A/AAAA レコードのIPからの送信を許可

mx(MXレコードのIPを許可)

example.com. TXT "v=spf1 mx -all"
  • example.comメール受信サーバーIP からの送信を許可

IP + ドメイン混在

example.com. TXT "v=spf1 ip4:203.0.113.10 include:_spf.google.com include:amazonses.com -all"
  • 自社サーバー
  • Google Workspace
  • Amazon SES
    をすべて許可
  • ポイント
    • 受信サーバーは ENVELOPE FROM(Return-Path)のドメインを参照して SPF 判定
    • 設定ミス(正規送信元を列挙漏れ)すると正規送信なのに fail になることがある
    • TXTレコードで設定する.SPFレコードは一つしか効果がない.複数レコード設定すると無視される.

DKIM(DomainKeys Identified Mail)

  • やっていること
    • 送信ドメインがメールに秘密鍵で 電子署名 を付け、受信側が DNS 公開鍵で検証する仕組み。
  • メール本文やヘッダが途中で改ざんされていないことを保証
  • 署名に使われる DKIM ドメイン(d=)が Header-From と一致しているかが DMARC で重要

DNSレコードの例

# TXTの場合
selector1._domainkey.example.com. TXT "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEExamplePublicKeyHere"

# CNAMEの場合
abcdefg1234567._domainkey.example.com. CNAME abcdefg1234567.dkim.amazonses.com

メールヘッダの例

DKIM-Signature:
 v=1;
 a=rsa-sha256;
 c=relaxed/relaxed;
 d=example.com;
 s=selector1;
 h=from:to:subject:date;
 bh=abc123Base64Hash;
 b=def456Base64Signature
  • メールヘッダにある,DKIM-Signatureを受信サーバーは確認する
  • d=s=をみて,selector1._domainkey.example.com のDNSレコードを取得し,公開鍵で署名を検証

DMARC(Domain-based Message Authentication, Reporting & Conformance)

  • SPF / DKIM の結果を踏まえ、From のドメイン整合性(alignment) もチェックして最終判断する仕組み
  • SPF や DKIM が pass でも、From と一致していなければ DMARC は pass にならない
  • (追記 2026/1/12)メールに複数のDKIM署名が付与されている場合、Header-Fromドメインと一致(alignment)する有効な署名が1つでも存在すれば DMARC は PASS となる
  • (追記 2026/1/12)p=none / quarantine / reject のポリシーを受信側に要望として伝えることができる
    • ただし、これは送信側の「要望」に過ぎず、受信側MTAはローカルポリシーで上書き可能
    • 最終的な処理(受信・隔離・拒否)は受信側MTAが決定する
  • レポートによって失敗状況を可視化できる
_dmarc.example.com. TXT "v=DMARC1; p=none; rua=mailto:dmarc-rua@example.com; ruf=mailto:dmarc-ruf@example.com; fo=1"

_dmarc.example.com. TXT "v=DMARC1; p=quarantine; pct=25; rua=mailto:dmarc-rua@example.com; ruf=mailto:dmarc-ruf@example.com"

_dmarc.example.com. TXT "v=DMARC1; p=reject; rua=mailto:dmarc-rua@example.com; ruf=mailto:dmarc-ruf@example.com; adkim=r; aspf=r"
  • ruf は「失敗時の詳細レポート」なので、p=none かつ fo 未指定だと送られないケースが多い
  • alignment には strict(s) / relaxed(r) があり、 relaxed の場合は「サブドメイン一致」でも PASS になる
    • adkim=, aspf= とした箇所

仕組みを式で表すと

( SPF=PASS AND SPFドメイン=Fromドメイン )
 OR
( DKIM=PASS AND DKIM署名のドメイン=Fromドメイン )
 → DMARC=PASS

困ったときの確認手順

  1. (optional) もしDMARCレポートが受け取れていない場合,DMARCレコードのrua, rufを指定して受け取れるようにする
  2. 自分自身にメールを送ってみる
    • 送信元サービスなどが複数ある場合,その全てから送信する
  3. Gmailの場合,「原文を表示」してみる
  4. SPF, DKIM, DMARCのPASS / FAIL を確認する
    • 実務的にはこのタイミングで表(送信元サービス,SPF, DKIM, DMARC)に整理するとよい
  5. SPFがFAILの場合,SPFレコードの設定を更新する必要がある
  6. DKIMがFAILの場合,DKIMレコードの設定を更新する必要がある
  7. DMARCがFAILの場合,DMARCレコードの設定 or SPFかDKIMとのalignmentを一致させる必要がある
    • SPFのHELO/EHLO or ENVELOPE-FROM/MAIL-FROM と,Header-FROMの一致 (修正 2026/1/12)
    • DKIMのメールヘッダd=(DNSドメイン)と,Header-Fromの一致
  8. DMARC含めて全てPASSするようになったら,DMARCのpolicy(p=)を段階的に引き上げる

参考文献

GitHubで編集を提案

Discussion

竹洞陽一郎竹洞陽一郎

SPF/DKIM/DMARCに関する技術的補足

1. SPFのチェック順序

SPFでは、HELO/EHLOドメインをMAIL FROMより先にチェックすることが推奨順序です。

Checking "HELO" before "MAIL FROM" is the RECOMMENDED sequence if both are checked.

RFC 7208 Section 2.3


2. DMARCのDKIMアライメント

DKIMは経路上のMTAごとに署名を追加できるため、複数の署名が付与されることが多々あります。DMARCのDKIMアライメントでは、「署名に使われるDKIMドメイン(d=)がHeader-Fromと一致しているか」ではなく、複数のDKIM署名のうち、d=ドメインがHeader-Fromとアライメント(strictまたはrelaxed)する有効な署名が1つでも存在すれば合格となります。

RFC 7489 Section 3.1.1


3. DMARCポリシーの強制力

DMARCポリシーは送信側ドメインの「要望」であり、受信側MTAはローカルポリシーに基づいてこれを上書きできます。例えば、送信側がp=rejectを指定していても、受信側が受け入れる判断をすることがあります。つまり、DMARCポリシーに強制力はなく、最終判断は受信側にあります。

RFC 7489 Section 6.7

miyatakamiyataka

ご指摘ありがとうございます!
指摘部分について追記・修正を行いました.
おかげさまで記事の正確性が向上できました.ありがとうございました!