メール認証(SPF/DKIM/DMARC)
概要
メールの**なりすまし(フィッシング・スパム)**を防ぐために、現代のメール送受信では複数の認証技術が組み合わせて使われています。
| 技術 | 目的 |
|---|---|
| SPF | 送信サーバーのIPアドレスを検証する |
| DKIM | 電子署名でメールの正当性・完全性を保証する |
| DMARC | SPF/DKIMの結果をポリシーとして統合し、受信側の処理を指示する |
この3つを正しく設定することで、メールの到達率が向上し、ブランドの信頼性も高まります。
SPF(Sender Policy Framework)
仕組み
SPFは、特定のドメインから送信が許可されているIPアドレスのリストをDNSに公開する仕組みです。受信サーバーは、メールの**Envelope From(Return-Path)**に記載されたドメインのSPFレコードを参照して送信元の正当性を検証します。
DNS TXTレコードの例
v=spf1 include:sendgrid.net ~all
| 要素 | 説明 |
|---|---|
v=spf1 | SPFバージョン1 |
include:sendgrid.net | SendGridのIPアドレスセットを許可リストに含める |
~all | リスト外からの送信はSoftFail(警告として処理) |
-all | リスト外からの送信はHardFail(拒否) |
- SPFレコードは1ドメインにつき1つのTXTレコードのみ有効です。複数記述すると無効になります。
includeのネストが深くなりすぎると(10回を超えると)DNS参照エラーになります。- SPFのみではメール転送時に破綻しやすいため、DKIMと組み合わせることが重要です。
DKIM(DomainKeys Identified Mail)
仕組み
DKIMは電子署名を使ってメールの正当性を証明します。送信側が秘密鍵でメールヘッダーと本文にデジタル署名を付与し、受信側がDNSの公開鍵で検証します。
DKIMシグネチャの例(メールヘッダー)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=example.com;
s=s1; h=from:to:subject:date; bh=...; b=...
| フィールド | 説明 |
|---|---|
d= | 署名しているドメイン(DMARC Alignmentに使われる) |
s= | セレクター(DNS参照パスに使われる) |
h= | 署名対象のヘッダーフィールド |
bh= | 本文のハッシュ値 |
b= | 署名値 |
DKIMセレクターとは
**セレクター(Selector)**は、DKIMの公開鍵をDNSで一意に識別するための文字列です。1つのドメインに対して複数の鍵ペアを管理できるようにするために導入されています。
{セレクター}._domainkey.{ドメイン}
たとえば、SendGridから「DKIM Selector: sgqcd」と指示された場合、DNS上で公開鍵を参照するレコード名は次のようになります:
sgqcd._domainkey.example.com
セレクターを複数持つ理由
| ユースケース | 例 |
|---|---|
| 複数のメール送信サービスを使い分ける | SendGrid用: sgqcd、自社MTAサーバー用: mail |
| 鍵のローテーション(新旧の鍵を切り替える移行期間) | 旧鍵: v1、新鍵: v2 |
| 環境ごとの分離(本番・テスト) | 本番: prod、テスト: stg |
SendGrid の sgqcd のようなセレクター名は、SendGrid が自動生成する固有の識別子です。この名前はSendGridのAutomated Securityによって決まるものであり、任意に変更することはできません。
CNAMEレコードを使う場合、実際のDNS登録名は:
sgqcd._domainkey.example.com→sgqcd.domainkey.u1234567.wl.sendgrid.net
のような形になります(SendGrid管理画面から発行された実際のCNAME値を使用してください)。
DNS TXTレコードの例(公開鍵)
セレクターが s1、ドメインが example.com の場合:
s1._domainkey.example.com. TXT "v=DKIM1; k=rsa; p=MIGfMA0G..."
DMARC(Domain-based Message Authentication, Reporting & Conformance)
仕組み
DMARCは、SPFとDKIMの検証結果をポリシーとして統合し、受信側にどのように処理するかを指示します。さらに、認証に失敗したメールのレポートを送信者に送る機能も持ちます。
Alignment(アライメント)の概念
DMARCが重要なのは、単なる認証の合否だけでなく、**メールのFrom ヘッダーと認証ドメインの一致(Alignment)**を要求するからです。
| 技術 | 一致確認する対象 |
|---|---|
| SPF Alignment | Envelope From(Return-Path)と From ヘッダーのドメイン |
| DKIM Alignment | DKIM-Signature の d= タグと From ヘッダーのドメイン |
DMARC TXTレコードの例
_dmarc.example.com. TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc-report@example.com; pct=100"
| タグ | 説明 |
|---|---|
v=DMARC1 | DMARCバージョン |
p= | ポリシー(none / quarantine / reject) |
rua= | 集計レポートの送信先メールアドレス |
ruf= | 個別フォレンジックレポートの送信先 |
pct= | ポリシー適用割合(%)。段階的に強化する際に使用 |
DMARC適用フェーズの例
| フェーズ | ポリシー | 目的 |
|---|---|---|
| 監視フェーズ | p=none | まず現状を把握する(メール配信は通常通り) |
| 段階適用 | p=quarantine; pct=10 | 徐々に適用割合を増やす |
| 完全適用 | p=reject | なりすましメールを完全にブロック |
最初から p=reject にすると、設定ミスで自社の正規メールが届かなくなるリスクがあります。p=none から始めてレポートを分析し、徐々に強化するのがベストプラクティスです。
Envelope From(Return-Path)と From ヘッダーの違い
メールには複数の「差出人」アドレスが存在します。この違いを理解することはDMARC設定において非常に重要です。
┌─────────────────────────────────────────────────┐
│ SMTPエンベロープ │
│ Envelope From: bounce@sendgrid.net ← Return-Path(バウンスメールの返送先)│
│ │
│ ┌───────────────────────────────────────────┐ │
│ │ メールヘッダー │ │
│ │ From: sender@yourdomain.com ← ユーザーが目にするFromアドレス │
│ │ To: recipient@example.com │ │
│ │ Subject: ... │ │
│ └───────────────────────────────────────────┘ │
└─────────────────────────────────────────────────┘
| 項目 | 役割 | DMARC Alignment |
|---|---|---|
| Envelope From(Return-Path) | バウンスメールの返送先。SMTP通信で使われる | SPF の検証対象 |
| From ヘッダー | メールクライアントで表示される差出人 | DMARC の基準ドメイン |
| DKIM d= タグ | 署名したドメイン | DKIM Alignmentの検証対象 |
SendGridのデフォルト設定では、Envelope Fromが bounce.xxx.sendgrid.net のようなSendGridドメインになります。これをカスタムドメインに統一するには**Sender Authentication(ドメイン認証)**の設定が必要です。
SendGrid のドメイン認証(Sender Authentication)
概要
SendGridを利用しながら、独自ドメイン(例: example.com)でSPF/DKIM認証を通過させるための設定です。CNAME レコードをDNSに追加することで実現します。
Automated Security(推奨)
SendGridの Automated Security を有効にする方法では、TXTレコードを直接DNSに追加する必要がなく、CNAME経由でSendGridが自動的に認証を管理します。
CNAMEレコードの構成
Automated Security が生成するCNAMEは以下の3件です:
| 目的 | DNS名(ホスト) | 指す先(値) |
|---|---|---|
| メールサブドメイン(Envelope From設定) | em1234.example.com | u1234567.wl.sendgrid.net |
| DKIM公開鍵(1件目) | s1._domainkey.example.com | s1.domainkey.u1234567.wl.sendgrid.net |
| DKIM公開鍵(2件目) | s2._domainkey.example.com | s2.domainkey.u1234567.wl.sendgrid.net |
上記はサンプルです。実際の値はSendGrid管理画面から発行されたCNAMEを使用してください。
設定手順
-
SendGrid管理画面にログイン
- Settings → Sender Authentication → 「Authenticate Your Domain」をクリック
-
ドメイン情報を入力
- DNSホストを選択(例: AWS Route 53、Cloudflare など)
- 認証するドメイン(例:
example.com)を入力 - 「Use automated security」にチェックが入っていることを確認
-
CNAMEレコードが生成される
- 3件のCNAMEレコードが表示されるので控えておく
-
DNS事業者でCNAMEを登録
- 発行された3件のCNAMEレコードをDNS管理画面に追加
- DNS反映には最大48時間かかる場合がある
-
SendGrid管理画面でVerify実行
- Settings → Sender Authentication → 対象ドメインの「Verify」をクリック
- 3件すべてにチェックマークが付けば認証完了
Verifyが失敗する場合
| 原因 | 対処法 |
|---|---|
| CNAMEがまだDNSに反映されていない | 数時間から最大48時間待ってから再試行 |
| CNAME値のタイプミス | DNS管理画面でレコード内容を再確認 |
| 既存のDKIMレコードとの競合 | 古いTXTレコードを削除する |
| TTL設定が長い | TTLを短くして変更の反映を早める |
設定後のメール送信フロー
まとめ
| 設定 | DNS レコード種別 | 効果 |
|---|---|---|
| SPF | TXTレコード(Automated Security利用時はCNAMEで代替) | 送信サーバーIPの正当性証明 |
| DKIM | TXTレコード(Automated Security利用時はCNAMEで代替) | メール署名による完全性証明 |
| DMARC | TXTレコード(_dmarc. プレフィックス) | SPF/DKIMの統合ポリシー適用 |
| SendGrid Sender Authentication | CNAMEレコード 3件 | Envelope FromとDKIM署名ドメインを独自ドメインに統一 |
- まず
p=noneでDMARCを有効にし、レポートで現状の認証状況を確認する - SendGridのAutomated Securityを使うとSPF/DKIMの管理が簡素化される
- DMARC
rua=に設定したアドレスに届くレポートを定期的に確認し、異常な送信元がないかチェックする - 最終的には
p=rejectに設定してなりすましメールを完全にブロックする