結論(SPFの一意性・構文・DNS参照数)
SPFの一意性・構文・DNS参照数とは、ドメインのSPFレコードが正しく評価されるための3つの条件です。v=spf1で始まるTXTレコードは1件だけにし、+allや修飾子なしのallで全許可にせず、include・a・mx・ptr・exists・redirectによるDNS参照を合計10回以内に収めます。RFC 7208はレコードが2件以上ある場合や参照が10回を超えた場合をpermerror(恒久的エラー)としており、なりすまし防止効果が失われます。
この記事のポイント
- v=spf1で始まるTXTレコードが2件以上あると、受信側の評価はpermerrorになります(RFC 7208 §3.2・§4.5)。
- 修飾子を省略したallは+allと同じ「全許可」で、SPFを置いていないより悪い状態です。
- include・a・mx・ptr・exists・redirectのDNS参照は、include先も含めて合計10回までです(§4.6.4)。
- ptr機構は公開すべきでない(SHOULD NOT)とされています(§5.5)。
- セキュリティAIチェッカーは、重複・全許可・トップレベル参照10超を×、SPFなし・終端なし・ptr使用を△、MXが無ければ対象外と判定します。
| 診断項目名 | SPFの一意性・構文・DNS参照数 |
|---|---|
| 項目ID | dns.spf-validity |
| 分類 | DNS・メールのなりすまし対策 |
| 重大度・配点の重み | 重要(high) 重み 3 |
| 関連する標準・ガイドライン | RFC 7208「Sender Policy Framework (SPF)」§3.2・§4.5・§4.6.4・§5.5・§6.1/RFC 9989(DMARC。2026年5月発行、RFC 7489を廃止)/Googleメール送信者のガイドライン/関連項目 dns.spf・dns.spf-policy・dns.dmarc |
SPFの一意性・構文・DNS参照数とは
SPFの一意性・構文・DNS参照数とは、ドメインのSPFレコードが受信側で正しく評価されるための3つの条件です。
- 一意性:
v=spf1で始まるTXTレコードは1件だけにする。 - 構文:
+allや修飾子なしのall(全許可)を使わず、終端を-all・~allなどで明示し、非推奨のptrを使わない。 - DNS参照数:
include・a・mx・ptr・exists・redirectによるDNS照会を合計10回以内に収める。
city.example.lg.jp. 3600 IN TXT "v=spf1 ip4:203.0.113.0/24 include:spf.protection.outlook.com -all"
SPF(Sender Policy Framework)は、あるドメイン名を名乗ってメールを送ってよいサーバーを、DNSのTXTレコードで宣言する仕組みです。受信側はエンベロープFrom(MAIL FROM)のドメインのSPFレコードを参照し、送信元IPアドレスが許可されているかを判定します。DMARCはSPFまたはDKIMの認証結果をヘッダーFromのドメインと照合するため、SPFが壊れているとDMARCも期待どおりに機能しません。
SPFは「レコードがあれば有効」ではありません。レコードが2つある、all の扱いを誤っている、DNS参照が10回を超えている、といった状態では、受信側は permerror(恒久的エラー)や「すべて許可」と評価し、なりすまし防止効果が失われたり、正規メールまで迷惑メール扱いされたりします。セキュリティAIチェッカーのこの項目は、自治体のメールドメインに公開されたSPFレコードについて、一意性・危険な all・DNS参照数・非推奨機構を確認します。
SPFレコードの有無は「SPFレコード」、終端の -all/~all の強さは「SPFの終端ポリシー」、DMARCは「DMARCレコード」の各項目で評価します。このページは、SPFが「壊れていないか」に集中して解説します。
SPFがpermerrorや全許可になる仕組み(RFC 7208)
レコードの選択と一意性(RFC 7208 §4.5・§3.2)
受信側は対象ドメインのTXTレコードのうち v=spf1 で始まり、その後が空白か終端であるものだけを選びます。
| 該当レコード数 | 結果 |
|---|---|
| 0件 | none(SPF未設定) |
| 1件 | そのレコードを評価 |
| 2件以上 | permerror |
§3.2は「選択されるレコードが複数になるような公開をしてはならない(MUST NOT)」と定めています。よくある原因は、メール配信サービスを追加導入したときに、既存レコードへ追記せず新しいTXTレコードを作ってしまうことです。
修飾子と all の意味(§4.6.2・§5.1)
各機構の前には修飾子を付けられ、省略時は + です。
| 修飾子 | 結果 | 例 |
|---|---|---|
+(省略時) | pass | +all、all |
- | fail | -all |
~ | softfail | ~all |
? | neutral | ?all |
したがって v=spf1 include:_spf.example.jp all の all は +all と同じ意味になり、世界中のどのサーバーからの送信も「許可」と評価されます。+all は構文上は有効ですが、SPFを置いていないより悪い状態です。
末尾の all が無い場合、どの機構にも一致しない送信元は neutral になります。ただし redirect= 修飾子がある場合は、リダイレクト先のレコードの結果が使われるため、all が無くても問題ありません(§6.1。all がある場合 redirect は無視されます)。
DNS参照数の上限は10回(§4.6.4)
include、a、mx、ptr、exists の各機構と redirect 修飾子はDNS照会を発生させます。RFC 7208は、これらの合計を10回に制限しなければならない(MUST)とし、超えた場合は permerror を返すとしています。数え方は include 先のレコードに含まれる参照も含めた再帰的な合計です。このほか、空応答・NXDOMAINとなる「void lookup」は2回まで(SHOULD)、mx 機構1つあたりのアドレス照会は10件までと定められています。
| 数える(DNS照会あり) | 数えない(DNS照会なし) |
|---|---|
include:、a、mx、ptr、exists:、redirect= | ip4:、ip6:、all |
Microsoft 365、Google Workspace、各種配信サービスの include をいくつも並べると、再帰分を含めて10回を超えやすくなります。
ptr 機構は使わない(§5.5)
ptr は逆引きを使う機構で、RFC 7208は「この機構は公開すべきでない(SHOULD NOT)」と明記しています。RFCは、処理が遅く、DNSエラー時の信頼性が低く、.arpa のネームサーバーに大きな負荷をかけるとし、長年の運用経験から「不要であり、より信頼性の高い代替手段を使うべき」と結論づけています(受信側の実装は互換性のためサポート必須です)。
レコード長(§3.4)
SPFレコードは、問い合わせ結果がUDPの512オクテットに収まる程度に小さく保つべき(SHOULD)とされています。目安として、DNS名の長さと、その種別の全レコード(TXTなら同じ名前の他のTXTレコードも含む)のテキストの長さの合計が450オクテット未満であれば収まるとされています。
メールを送らないドメイン
メール送信に使わないドメインは v=spf1 -all を公開することで、「このドメインからの正規メールは存在しない」と宣言できます。
SPFの一意性・構文・DNS参照数の診断基準(セキュリティAIチェッカー)
取得対象
- 対象ドメイン:最終URLのホスト名から先頭の
www.を除いたもの(例www.city.example.lg.jp→city.example.lg.jp)。 - DNS-over-HTTPS(
https://dns.google/resolve)で、対象ドメインのTXTレコードとMXレコードを照会します(タイムアウト5秒)。 - TXTは種別16の回答だけを使い、複数文字列に分割されたレコードは連結して評価します。
- MXは種別15の回答のうち、Null MX(
0 .)以外が1件以上あれば「メール利用あり」とみなします。
DNS参照数の算出方法
v=spf1 レコードを空白で区切り、修飾子(+ - ~ ?)を除いた項目が include:、a(a:・a/を含む)、mx(同)、ptr、exists:、または redirect= で始まるものを数えます。include 先は展開しないため、算出値は「トップレベルの参照数」です。トップレベルだけで10を超えれば再帰分を数えるまでもなく permerror が確定します。
判定条件
| 判定 | 条件 | 得点への影響 |
|---|---|---|
| 対象外(na) | 有効なMXが無い。根拠欄は「メール受信設定がなく対象外です。」 | 採点から除外 |
| 対象外(na) | MXレコードのDNS照会に失敗した。根拠欄は「MXレコードのDNS照会に失敗したため判定できません。」(受信設定なしとは区別して表示) | 採点から除外 |
| 対象外(na) | TXTレコードのDNS照会に失敗した | 採点から除外 |
| △ 要確認(warn) | v=spf1 レコードが無い | 重み3×0.45 |
| × 要改善(fail) | v=spf1 レコードが2件以上(permerror) | 重み3×0 |
| × 要改善(fail) | +all または修飾子なしの all を含む(全許可) | 重み3×0 |
| × 要改善(fail) | トップレベルのDNS参照数が10を超える(permerror) | 重み3×0 |
| △ 要確認(warn) | -all・~all・?all が無く、redirect= も無い | 重み3×0.45 |
| △ 要確認(warn) | ptr 機構を使用している | 重み3×0.45 |
| ○ 問題なし(pass) | 上記のいずれにも該当しない | 重み3×1.00 |
- 根拠欄には、SPFレコード件数とトップレベルのDNS参照数を表示します。
- 重大度はhigh、重みは3です。
自治体サイトでの判定例
| SPFの状態 | 判定 |
|---|---|
v=spf1 ip4:203.0.113.0/24 include:spf.protection.outlook.com -all | ○ 問題なし(参照1件) |
既存の v=spf1 ip4:203.0.113.10 -all に加え、配信サービス導入時に v=spf1 include:mail.example-delivery.jp ~all を別レコードで追加 | × 要改善(2件、permerror) |
v=spf1 a mx include:_spf.example.jp all | × 要改善(修飾子なしall=全許可) |
v=spf1 redirect=_spf.city.example.lg.jp | ○ 問題なし(allが無くてもredirectで評価が継続) |
| ウェブ専用のサブドメインでMXが無い | 対象外(ただし v=spf1 -all の公開を推奨) |
判定の限界
include 先を再帰展開しないため、トップレベルが10以下でも実際は10を超えている場合があります。void lookupの回数、include 先の構文誤り、レコード長、実際の送信サーバーが網羅されているかは評価していません。専用の検証ツールでの確認を併用してください。
SPFが壊れているとどんなリスクがあるか
- なりすましメール:SPFが
permerrorや全許可になると、自治体ドメインを詐称したフィッシングメール(給付金・税金還付・マイナンバー関連を装うもの)が受信側の認証をすり抜けやすくなります。DMARCの効果も失われます。 - 正規メールの不達:レコード重複や参照数超過で
permerrorになると、DMARCを強制している受信側では、自治体からの通知メール・メールマガジン・電子申請の受付通知が迷惑メール扱いや拒否になることがあります。 - 大手メール事業者の要件不適合:Googleの送信者ガイドラインは、すべての送信者にSPFまたはDKIMの設定とTLS接続を求め、1日5,000通以上の大量送信者にはSPF・DKIM・DMARCすべてを求めています。SPFが壊れていると、DKIM未設定の環境では配信に影響します。
SPFを1レコードに統合し参照数を減らす方法(DNS設定例)
修正の手順
- 自治体ドメインからメールを送るシステムを棚卸しします(メールサーバー、Microsoft 365等、メール配信サービス、電子申請、防災メール、委託先の送信サーバー)。
- すべてを1つの
v=spf1レコードに統合します。 - 末尾は、送信元を網羅できていれば
-all、確認期間中は~allにします。+all・修飾子なしallは使いません。 - 参照数が10を超える場合は、不要な
includeを削除する、固定IPをip4:/ip6:で直接書く、送信システムをサブドメインに分ける、のいずれかで減らします。 ptrは削除し、ip4:/ip6:やa:へ置き換えます。
DNSゾーンファイルの例
; 統合したSPF(1レコードのみ)
city.example.lg.jp. 3600 IN TXT "v=spf1 ip4:203.0.113.0/24 include:spf.protection.outlook.com include:mail.example-delivery.jp -all"
; 長い場合は255文字ごとに分割(1つのTXTレコード内の複数文字列)
city.example.lg.jp. 3600 IN TXT ( "v=spf1 ip4:203.0.113.0/24 include:spf.protection.outlook.com "
"include:mail.example-delivery.jp -all" )
; メールを送らないサブドメイン
www.city.example.lg.jp. 3600 IN TXT "v=spf1 -all"
分割する場合、文字列の連結時に空白は補われないため、区切りの空白を文字列内に含めます。
クラウドDNS・委託管理の場合
DNSを委託事業者や庁内ネットワーク運用者が管理している場合は、「SPFは1件に統合」「末尾は -all または ~all」「参照は10回以内」を作業指示に明記します。メール配信サービスを追加導入する際の手順書に「既存SPFへの追記」を加えておくと、重複の再発を防げます。
SPFの確認方法
# SPFレコードの件数と内容
dig +short TXT city.example.lg.jp | grep -i 'v=spf1'
# include先を1段ずつ確認
dig +short TXT spf.protection.outlook.com
Resolve-DnsName -Type TXT city.example.lg.jp | Where-Object { $_.Strings -match 'v=spf1' }
送信テストでは、Gmail等で受信したメールの「メッセージのソースを表示」を開き、Authentication-Results ヘッダーの spf=pass を確認します。修正後はセキュリティAIチェッカーで再診断し、根拠欄のSPF件数が1件、参照数が10以下になっていることを確認します。
配信を止めないための注意点(ガードレール)
- いきなり
-allにすると、棚卸し漏れの送信システム(複合機のスキャン送信、委託先のサーバー等)のメールが拒否されます。DMARCの集計レポート(rua)で送信元を把握してから厳格化します。レポートの受け取りは「DMARC集計レポート送信先」で確認します。 - DNSのTTLを事前に短くしておくと、誤りがあったときの切り戻しが速くなります。
- SPFだけでは転送メールで失敗しやすいため、DKIM署名とDMARCを併用します。
よくある質問(FAQ)
SPFレコードを2つ登録するとどうなりますか?
受信側の評価はpermerror(恒久的エラー)になり、SPFが機能しなくなります。RFC 7208 §3.2は、選択されるレコードが複数になるような公開をしてはならない(MUST NOT)と定めています。配信サービスを追加するときは、新しいTXTレコードを作らず既存のレコードへ追記します。
SPFのDNS参照数の上限は何回ですか?
include・a・mx・ptr・existsの各機構とredirect修飾子によるDNS照会の合計で10回です。include先のレコードに含まれる参照も再帰的に数えます。超えるとpermerrorになります。
SPFのDNS参照が10回を超えたらどうすればよいですか?
不要なincludeを削除する、固定IPをip4:やip6:で直接書く、送信システムをサブドメインに分ける、のいずれかで減らします。ip4:・ip6:はDNS参照を発生させません。
末尾を「all」だけにするのは問題ですか?
問題です。修飾子を省略すると+(pass)とみなされるため、allは+allと同じ「すべてのサーバーを許可」になります。末尾は-allか、確認期間中は~allにします。
末尾にallが無いSPFは不正ですか?
不正ではありませんが、どの機構にも一致しない送信元はneutralになります。redirect=修飾子がある場合はリダイレクト先の結果が使われるため、allが無くても問題ありません。セキュリティAIチェッカーではallもredirectも無い場合を△とします。
SPFのDNS参照数を数えるとき、セキュリティAIチェッカーはinclude先の参照も数えていますか?
数えていません。算出するのはトップレベルの参照数で、10を超えれば×が確定します。トップレベルが10以下でも、include先を含めると10を超えている場合があるため、専用の検証ツールでの確認を併用してください。
SPFでptr機構を使ってもよいですか?
使わないでください。RFC 7208 §5.5は、ptr機構を公開すべきでない(SHOULD NOT)と明記しています。処理が遅く、DNSエラー時の信頼性が低く、.arpaのネームサーバーに大きな負荷をかけるためです。セキュリティAIチェッカーもptrを使用していると△とします。ptrは削除し、ip4:/ip6:やa:へ置き換えます。
この項目を含む127項目を、URLを入れるだけで無料診断します。