• 診断項目 No.92/127
  • DNS・メールのなりすまし対策
  • 重大度 重要(high)

SPFの一意性・構文・DNS参照数とは?レコード重複・+all・10回制限の確認方法と診断基準

SPFの一意性・構文・DNS参照数は、SPFを1レコードに統合し、+allや修飾子なしallを使わず、DNS参照を10回以内に収めることです。permerrorの原因、統合手順、DNS設定例、確認方法、診断基準を解説します。

結論(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参照数
項目IDdns.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つの条件です。

  1. 一意性:v=spf1 で始まるTXTレコードは1件だけにする。
  2. 構文:+all や修飾子なしの all(全許可)を使わず、終端を -all・~all などで明示し、非推奨の ptr を使わない。
  3. 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設定例)

修正の手順

  1. 自治体ドメインからメールを送るシステムを棚卸しします(メールサーバー、Microsoft 365等、メール配信サービス、電子申請、防災メール、委託先の送信サーバー)。
  2. すべてを1つの v=spf1 レコードに統合します。
  3. 末尾は、送信元を網羅できていれば -all、確認期間中は ~all にします。+all・修飾子なし all は使いません。
  4. 参照数が10を超える場合は、不要な include を削除する、固定IPを ip4:/ip6: で直接書く、送信システムをサブドメインに分ける、のいずれかで減らします。
  5. 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:へ置き換えます。

セキュリティAIチェッカーを利用する

この項目を含む127項目を、URLを入れるだけで無料診断します。

参考資料