🔐 SPF(Sender Policy Framework)の仕組み
目次
1. SPFとは?
- メールのなりすましを防ぐための送信ドメイン認証技術。
- 「そのドメインのメールを送る権限を持つサーバ(IPアドレス)はどこか?」を DNS に登録しておき、受信サーバがチェックします。
👉 送信者アドレス(MAIL FROM / Return-Path)のドメインを基準に検証します。
2. DNSに登録されるSPFレコード(例)
example.com. IN TXT "v=spf1 ip4:203.0.113.5 include:_spf.google.com -all"
意味:
v=spf1
→ SPFバージョンip4:203.0.113.5
→ このIPからの送信は許可include:_spf.google.com
→ Googleの送信サーバも許可-all
→ 上記以外のサーバは不許可
🌐 SPF での「Fail」と「SoftFail」の違い
SPF レコードの末尾には「ポリシー指定」があります。代表的なものは以下です:
-all
→ 明示的に「これ以外は全部不許可」
→ 該当しなければ Fail になる
→ 受信サーバは「確実に偽装」と判断して拒否/迷惑行き~all
→ 「推奨しないが不許可までは言わない(SoftFail)」
→ 該当しなければ SoftFail になる
→ 受信サーバは「怪しい」扱い。拒否はせず、迷惑メール行きなど「緩い対応」?all
→ 「何も判断しない(Neutral)」
DNS SPFレコードとは?
センダーポリシーフレームワーク(SPF)レコードは、特定ドメインからのメール送信が許されたすべてのサーバーをリスト化した一種のDNS TXTレコードです。DNS TXT(テキスト)レコードは、ドメイン管理者がドメインネームシステム(DNS)に任意のテキストを入力できるようにします。TXTレコードは当初ドメインに関する重要な通知を含める目的で作られましたが、後に他の目的も果たすようになっています。
📑 SPFチェックフロー
(1) 送信側(準備)
- ドメイン管理者は、自分のドメイン(例: example.com)のDNSに SPFレコード(TXT形式) を設定しておく。
(2) 受信側(メール受信時)
- MAIL FROM のドメインを確認
- 例: Return-Path:
<info@example.com>
→ 「example.com」を抽出
- 例: Return-Path:
- そのドメインのDNSに問い合わせ
- 「SPFレコード(TXTレコード)を教えてください」
- SPFレコードを取得
- 例:
"v=spf1 ip4:203.0.113.5 include:_spf.google.com -all"
- 例:
- 送信元IPアドレスをチェック
- 実際に接続してきた送信サーバのIP(例: 203.0.113.5)が、SPFレコードで許可されているかを確認
- 結果を判定
- 許可されていれば → spf=pass
- 許可されていなければ → spf=fail(または softfail / neutral など)
✅ SPF認証結果の種類
- Pass → 正規サーバから送信
- Fail (-all) → 許可されていないサーバ → 拒否対象
- SoftFail (~all) → 本来は許可していないが「参考に」扱う(多くは迷惑メールフォルダへ)
- Neutral (?all) → チェックせず「不明」と扱う
- None → SPFレコードが存在しない
📊 SPFチェックフロー図解
[送信者] [DNS] [受信者]
│ │ │
│ Return-Path=info@example.com │
│──────────────────────▶│ │
│ │ SPFレコード要求 │
│ │◀──────────────────────────────│
│ │ v=spf1 ip4:203.0.113.5 -all │
│ │ │
│ (実送信IP=203.0.113.5) │
│─────────────────────────────────────────────────────▶│
│ │ │
│ │ 照合 → Pass │
│ │ │
✅ まとめ
- SPFは Return-Pathのドメインと接続IPを突き合わせてチェックする。
- DNSに登録されるSPFレコード(TXT形式)が基準。
- Pass / Fail / SoftFail などの結果は
Authentication-Results
ヘッダーに記録される。 - ただし注意:From: の表示アドレスとは直接関係ないため、SPFだけでは「表示名のなりすまし」は防げない。
→ DKIMやDMARCと組み合わせるのが必須。
コメント