全体像:なぜこの3つが必要か
メールには「差出人アドレスを自由に詐称できる」という根本的な欠陥がある。たとえば、悪意のある第三者が From: noreply@yourbank.com と書いたメールを送ることは技術的に簡単にできてしまう。
これを防ぐために生まれたのが SPF・DKIM・DMARC の3つ。役割はそれぞれ異なる:
SPF → 「送信元 IP は正規のものか?」を検証
DKIM → 「メールが改ざんされていないか?」を検証
DMARC → 「SPF/DKIM に失敗したメールをどう扱うか?」のポリシー設定
SPF(Sender Policy Framework)
一言で言うと: 「うちのドメインからのメール送信を許可するサーバーはこれです」と DNS に宣言する仕組み。
仕組み:
- ドメイン管理者が DNS の TXT レコードに「許可する送信元 IP(またはサービス)」を登録する
- 受信サーバーは「送ってきたサーバーの IP」と「DNS に登録された許可リスト」を照合する
- 一致すれば OK、一致しなければ怪しいと判定される
DNS の設定例(SendGrid を使う場合):
自分のドメイン(例: yourdomain.com)の DNS に以下の TXT レコードを追加する:
v=spf1 include:sendgrid.net ~all
これは「日本語に訳すと」こういう意味:
「
yourdomain.comから送るメールは、SendGrid のサーバーからのみ許可します。それ以外から送られてきたら怪しいと思ってください」
各パーツの意味:
| パーツ | 意味 |
|---|---|
v=spf1 | SPF バージョン 1 の記法ですよ、という宣言 |
include:sendgrid.net | SendGrid が管理する IP アドレス群を許可リストに含める |
~all | 許可リスト外の IP からの送信は「怪しい(でも拒否はしない)」と判定 |
-all | 許可リスト外は「完全に拒否」(より厳しい設定) |
~all と -all の使い分けイメージ:
~all(ソフトフェイル): 「怪しいけど、一応受け取って迷惑メールフォルダへ」
-all(ハードフェイル): 「問答無用で拒否」
最初は ~all にしておいて、動作確認後に -all に変えるのが一般的。
限界: SPF は「どの IP から送られたか」しか検証しない。メール本文の改ざんや From: ヘッダーの詐称は検知できない → それを補うのが DKIM。
DKIM(DomainKeys Identified Mail)
一言で言うと: メールに「デジタル署名」を付けて、改ざんされていないことを証明する仕組み。
仕組み:
- 送信者(SendGrid)が秘密鍵でメールにデジタル署名を付ける
- 対応する公開鍵を DNS の TXT レコードに公開しておく
- 受信サーバーが DNS から公開鍵を取得し、署名を検証する
- 署名が一致すれば「このメールは本物で、途中で改ざんされていない」と判断される
イメージ:
送信側: メール内容 + 秘密鍵 → 署名を生成してメールに添付
受信側: メール内容 + 公開鍵 → 署名を検証 → OK なら本物
SPF との違い: SPF は「どこから送ったか(IP)」、DKIM は「メール自体が本物か(内容)」を検証する。
DMARC(Domain-based Message Authentication, Reporting & Conformance)
一言で言うと: SPF・DKIM の検証に失敗したメールを「どう処理するか」を宣言し、レポートも受け取れる仕組み。
SPF・DKIM だけでは足りない理由: SPF や DKIM が失敗しても、それだけでは「拒否する」かどうかは受信サーバー任せだった。DMARC は送信者側が「失敗したら拒否して」とポリシーを宣言できる。
DNS の設定例:
自分のドメインの DNS に _dmarc.yourdomain.com という TXT レコードを追加する:
v=DMARC1; p=quarantine; rua=mailto:dmarc-report@yourdomain.com
「日本語に訳すと」こういう意味:
「SPF か DKIM の検証に失敗したメールは迷惑メールフォルダに入れてください。失敗レポートを
dmarc-report@yourdomain.comに送ってください」
各パーツの意味:
| パーツ | 意味 |
|---|---|
v=DMARC1 | DMARC の記法ですよ、という宣言 |
p=none | 何もしない(ログだけ取る。様子見フェーズ) |
p=quarantine | 迷惑メールフォルダへ移動 |
p=reject | 完全に拒否(受信箱に届かない) |
rua=mailto:... | 認証失敗が起きたときのレポート送り先 |
導入時の推奨ステップ:
① p=none → まず様子見。レポートを見て正規メールが失敗していないか確認
② p=quarantine → 問題なければ迷惑メール扱いに格上げ
③ p=reject → 十分安定したら完全拒否に
3つの関係をまとめると
受信サーバーの検証フロー
メール受信
├─ SPF チェック → 送信元 IP は許可リストにあるか?
├─ DKIM チェック → 署名は正しいか?(改ざんなし?)
└─ DMARC チェック → SPF/DKIM の結果を見て、ポリシー通りに処理
(none / quarantine / reject)
SendGrid で Domain Authentication を設定すると、SPF・DKIM の DNS レコードが自動的に案内されるので、指示通りに追加するだけで3つともカバーできる。