fo タグ(Failure Reporting Options)
概要
fo タグ(障害レポートオプション) は、DMARC レコードの fo= タグで指定する設定で、フォレンジックレポート(Failure Report)を送信する条件を制御します。RFC 7489(2015年)で定義されています。
デフォルト値は fo=0 で、SPF と DKIM の両方がアライメント fail のとき(DMARC fail のとき)にレポートを送信します。fo=1 に変更すると、SPF または DKIM のどちらか一方でも fail すればレポートが送信されるため、認証の問題をより早く検出できます。
fo タグは ruf= タグと組み合わせて使います。ruf= が設定されていなければ、fo の値に関係なくフォレンジックレポートは送信されません。ただし、Gmail や Microsoft 365 はフォレンジックレポート自体を送信しないため、fo タグの効果はレポートを送信するプロバイダーに限られます。
仕組み
fo タグには 4 つの値があり、SPF・DKIM の認証失敗やアライメント失敗のどの組み合わせでレポートを送信するかを制御します。
4 つのオプション
| fo 値 | 送信条件 |
|---|---|
0 | SPF アライメントと DKIM アライメントの両方が fail のとき(デフォルト) |
1 | SPF アライメントまたは DKIM アライメントのどちらかが fail のとき |
d | DKIM 署名検証が fail のとき(アライメントではなく署名自体の検証) |
s | SPF 検証が fail のとき(アライメントではなく SPF 自体の検証) |
fo=0 は DMARC 全体が fail した場合のみレポートを送信します。DKIM が pass していれば SPF が fail していてもレポートは送信されません。
fo=1 はより広い条件でレポートを送信します。DKIM が pass で DMARC 全体は pass していても、SPF が fail していればレポートが送信されます。設定ミスの早期発見に役立ちます。
fo=d は DKIM 署名の検証失敗(署名破損、鍵不一致、セレクターの問題など)を報告します。fo=s は SPF の検証失敗(送信元 IP が許可リストにない、レコードが存在しないなど)を報告します。
複数オプションの指定
fo タグにはコロン区切りで複数のオプションを指定できます。
fo=1:d:s
この設定では、SPF または DKIM のアライメント fail、DKIM 署名の fail、SPF の fail のいずれかが発生するたびにレポートが送信されます。
ruf タグとの関係
fo タグはフォレンジックレポートの送信条件を決定しますが、レポートの送信先は ruf= タグで指定します。ruf= がなければ fo の設定は無効です。
v=DMARC1; p=reject; rua=mailto:agg@example.com; ruf=mailto:forensic@example.com; fo=1
rua は集計レポート、ruf はフォレンジックレポートの送信先です。
設定例
DMARC レコードに fo タグと ruf タグを組み合わせて設定し、障害検出の範囲を調整します。
デフォルト(fo=0)
_dmarc.example.com. IN TXT "v=DMARC1; p=reject; rua=mailto:dmarc@example.com; ruf=mailto:forensic@example.com"
fo タグを省略するとデフォルトの 0 が適用されます。DMARC 全体が fail したメールのみレポートを受信します。
広範な障害検出(fo=1)
_dmarc.example.com. IN TXT "v=DMARC1; p=reject; rua=mailto:dmarc@example.com; ruf=mailto:forensic@example.com; fo=1"
SPF か DKIM のどちらかが fail するだけでレポートが送信されます。DMARC 導入初期や新しい送信サービスを追加した直後に設定ミスを素早く検出する目的で使います。
DKIM 署名の問題のみ検出(fo=d)
_dmarc.example.com. IN TXT "v=DMARC1; p=reject; rua=mailto:dmarc@example.com; ruf=mailto:forensic@example.com; fo=d"
DKIM 署名の検証失敗に限定してレポートを受信します。DKIM 鍵のローテーション時に署名の問題を検出する場合に使います。
全条件を指定
_dmarc.example.com. IN TXT "v=DMARC1; p=reject; rua=mailto:dmarc@example.com; ruf=mailto:forensic@example.com; fo=0:1:d:s"
すべてのオプションを指定すると、あらゆる認証失敗でレポートが送信されます。レポート量が増えるため、解析サービスで処理する環境で使います。
確認方法
DMARC レコードの fo タグは dig で確認できます。
dig TXT _dmarc.example.com
;; ANSWER SECTION:
_dmarc.example.com. 3600 IN TXT "v=DMARC1;p=reject;rua=mailto:dmarc@example.com;ruf=mailto:forensic@example.com;fo=1"
fo=1 が設定されています。タグが存在しなければデフォルトの 0 です。
外部の視点からも確認したい場合は、Labee Dev Toolbox の Mail Auth API を使うと、外部の視点から見た結果を取得できます。
curl "https://labee.dev/api/mail-auth?domain=example.com"
{
"success": true,
"data": {
"spf": { "record": "v=spf1 include:_spf.google.com ~all", "exists": true },
"dkim": { "record": "v=DKIM1; k=rsa; p=MIIBIjANBgkqh...", "exists": true, "selector": "default" },
"dmarc": {
"record": "v=DMARC1; p=reject; rua=mailto:dmarc@example.com; ruf=mailto:forensic@example.com; fo=1",
"exists": true
},
"bimi": { "record": null, "exists": false }
},
"error": null,
"meta": { "responseTime": 123 }
}
data.dmarc.record フィールドから fo= タグの値と ruf= の有無を確認できます。
よくある問題
fo タグの設定ミスは、ruf タグの未設定やレポート量の想定超過、プロバイダーの対応状況の誤解に起因します。
ruf を設定せずに fo だけ指定する
fo=1 を設定しても、ruf= がなければフォレンジックレポートは送信されません。fo と ruf はセットで設定します。
fo=1 でレポートが大量に届く
fo=1 は SPF か DKIM のどちらか一方でも fail するとレポートを送信するため、転送メールや SaaS 送信サービスの SPF 不一致などでレポート量が急増することがあります。専用のメールアドレスや解析サービスを使い、レポートの受信容量を確保します。
プロバイダーがフォレンジックレポートを送信しない
Gmail、Microsoft 365、Yahoo Mail はプライバシー保護のためフォレンジックレポートを送信しません。fo タグの効果を得られるのは、フォレンジックレポートに対応した一部のプロバイダーのみです。メール認証の問題検出は rua の集計レポートを主軸にします。
fo=d と fo=s の使いどころを誤解する
fo=d は DKIM 署名検証の失敗、fo=s は SPF 検証の失敗を報告対象にします。アライメントの失敗ではなく、認証プロトコル自体の失敗です。DKIM 鍵の更新漏れや SPF レコードの設定ミスを検出する用途に特化しています。