⭐️メール: DMARC・SPF・DKIMについて

全体像:なぜこの3つが必要か

メールには「差出人アドレスを自由に詐称できる」という根本的な欠陥がある。たとえば、悪意のある第三者が From: noreply@yourbank.com と書いたメールを送ることは技術的に簡単にできてしまう。

これを防ぐために生まれたのが SPF・DKIM・DMARC の3つ。役割はそれぞれ異なる:

SPF   → 「送信元 IP は正規のものか?」を検証
DKIM  → 「メールが改ざんされていないか?」を検証
DMARC → 「SPF/DKIM に失敗したメールをどう扱うか?」のポリシー設定

SPF(Sender Policy Framework)

一言で言うと: 「うちのドメインからのメール送信を許可するサーバーはこれです」と DNS に宣言する仕組み。

仕組み:

  1. ドメイン管理者が DNS の TXT レコードに「許可する送信元 IP(またはサービス)」を登録する
  2. 受信サーバーは「送ってきたサーバーの IP」と「DNS に登録された許可リスト」を照合する
  3. 一致すれば OK、一致しなければ怪しいと判定される

DNS の設定例(SendGrid を使う場合):

自分のドメイン(例: yourdomain.com)の DNS に以下の TXT レコードを追加する:

v=spf1 include:sendgrid.net ~all

これは「日本語に訳すと」こういう意味:

yourdomain.com から送るメールは、SendGrid のサーバーからのみ許可します。それ以外から送られてきたら怪しいと思ってください」

各パーツの意味:

パーツ意味
v=spf1SPF バージョン 1 の記法ですよ、という宣言
include:sendgrid.netSendGrid が管理する IP アドレス群を許可リストに含める
~all許可リスト外の IP からの送信は「怪しい(でも拒否はしない)」と判定
-all許可リスト外は「完全に拒否」(より厳しい設定)

~all-all の使い分けイメージ:

~all(ソフトフェイル): 「怪しいけど、一応受け取って迷惑メールフォルダへ」
-all(ハードフェイル): 「問答無用で拒否」

最初は ~all にしておいて、動作確認後に -all に変えるのが一般的。

限界: SPF は「どの IP から送られたか」しか検証しない。メール本文の改ざんや From: ヘッダーの詐称は検知できない → それを補うのが DKIM。


DKIM(DomainKeys Identified Mail)

一言で言うと: メールに「デジタル署名」を付けて、改ざんされていないことを証明する仕組み。

仕組み:

  1. 送信者(SendGrid)が秘密鍵でメールにデジタル署名を付ける
  2. 対応する公開鍵を DNS の TXT レコードに公開しておく
  3. 受信サーバーが DNS から公開鍵を取得し、署名を検証する
  4. 署名が一致すれば「このメールは本物で、途中で改ざんされていない」と判断される

イメージ:

送信側: メール内容 + 秘密鍵 → 署名を生成してメールに添付
受信側: メール内容 + 公開鍵 → 署名を検証 → 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=DMARC1DMARC の記法ですよ、という宣言
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つともカバーできる。