DMARC集計レポートは、メールボックスプロバイダーが通常1日1回お送りするXMLファイルで、お客様のドメインを名乗って送信されたすべての送信元と、それぞれがSPF、DKIM、アラインメントを通過したかどうかが記載されています。これを読むことで、正当な送信元をすべて把握し、失敗しているものを修正し、なりすましている相手を発見できるため、正当なメールをブロックすることなくp=noneからp=rejectへ移行できます。
最初にご確認ください。本ガイドは、すでにDMARCレコードを公開していることを前提としています。まだの場合は、先に送信ドメインの認証のガイドに従い、レポートが届き始めてからこのガイドに戻ってください。
要点まとめ
- レポートを要求する。ポリシーがp=noneのうちに、DMARCレコードにruaアドレスを追加します。
- 待って収集する。月次の送信を含め、2〜4週間分のレポートを集めます。
- 送信元を分類する。各送信元IPを、正当でアラインしているもの、正当だが失敗しているもの、不明なものに分けます。
- 失敗を修正する。正当な各サービスに、アラインしたDKIM署名またはReturn-Pathを設定します。
- 段階的に適用する。低い割合でquarantineを始め、割合を上げてから、rejectに移行します。
レポートを要求するDMARCレコード
_dmarc.example.com. 3600 IN TXT "v=DMARC1; p=none; rua=mailto:dmarc-reports@example.com; adkim=r; aspf=r"
| タグ | 意味 |
|---|---|
p | 失敗したメールに対するポリシー:none(監視)、quarantine、reject |
rua | 集計レポートの送信先。1つ以上のmailto:アドレスで指定 |
adkim, aspf | アラインメントモード:r はリラックス(サブドメインも一致可)、s はストリクト(完全一致) |
sp | pと異なる場合のサブドメイン用ポリシー |
pct | ポリシーを適用する、失敗したメールの割合 |
専用のメールボックスを使ってください。レポートは数が多く、サイズも大きくなります。個人ではなく、専用のアドレスまたはレポート処理サービスに送るようにしてください。
別のドメインにレポートを送る
ruaアドレスが、レポート対象のドメインとは別のドメインにある場合、その別のドメインが受信を許可するレコードを公開している必要があります。そうでないと、プロバイダーはレポートを送信しません。example.comに関するレポートをreports.example.netに送る場合は次のとおりです。
example.com._report._dmarc.reports.example.net. 3600 IN TXT "v=DMARC1"
レポートの中身
レポートは、通常gzipまたはzipで圧縮された添付ファイルとして届きます。開くと、レポートの送信者に関する情報、プロバイダーが確認したポリシー、そして送信元IPと結果の組み合わせごとに1行ずつの一覧という3つの部分があります。
<feedback>
<report_metadata>
<org_name>google.com</org_name>
<report_id>1234567890</report_id>
<date_range><begin>1759708800</begin><end>1759795199</end></date_range>
</report_metadata>
<policy_published>
<domain>example.com</domain><adkim>r</adkim><aspf>r</aspf><p>none</p><pct>100</pct>
</policy_published>
<record>
<row>
<source_ip>203.0.113.10</source_ip>
<count>1250</count>
<policy_evaluated><disposition>none</disposition><dkim>pass</dkim><spf>pass</spf></policy_evaluated>
</row>
<identifiers><header_from>example.com</header_from></identifiers>
<auth_results>
<dkim><domain>example.com</domain><selector>mail1</selector><result>pass</result></dkim>
<spf><domain>bounce.example.com</domain><result>pass</result></spf>
</auth_results>
</record>
</feedback>
| フィールド | 分かること |
|---|---|
org_name | レポートを送ったメールボックスプロバイダー |
date_range | 対象期間(Unixタイムスタンプ) |
policy_published | プロバイダーが確認したDMARCポリシー。レコードが有効になっているかの確認に使える |
source_ip と count | 送信元サーバーと、その期間に送信したメッセージ数 |
policy_evaluated | DMARCで重要となる結果。ここでのdkimとspfは、アラインした上での通過または失敗を意味する |
auth_results | SPFとDKIMの生の結果と、認証されたドメイン(Fromドメインとは異なる場合がある) |
header_from | 表示上のFromアドレスのドメイン |
2種類の異なる結果があります。policy_evaluatedのpassは、チェックを通過し、かつアラインしていることを意味します。auth_resultsのpassは、使用されたドメインに対してチェックを通過したことだけを意味します。送信元がauth_resultsでは通過してもpolicy_evaluatedでは失敗することがあります。その差がアラインメントの問題です。
すべての送信元を3つのグループに分類する
| グループ | 見え方 | 対処 |
|---|---|---|
| 正当でアラインしている | 既知のサービスで、policy_evaluatedでDKIMまたはSPFがアラインしている | 何もしない。その状態を維持する |
| 正当だが失敗している | 既知のサービスで、auth_resultsは通過するがpolicy_evaluatedは失敗する | そのサービスにアラインしたDKIMまたは独自のReturn-Pathを設定する |
| 不明 | 見覚えのないIPで、多くの場合、失敗が多数ある | 調査する:忘れられたシステム、転送元、またはなりすまし。正体が分かるまで承認しない |
送信元の特定方法
- 逆引きDNS:
dig -x 203.0.113.10 +shortで、プロバイダー名が分かることが多くあります。 - 認証ドメイン:auth_resultsにあるSPFとDKIMのドメインから、サービスが分かる場合がほとんどです。
- 自社の一覧:お客様のドメインとして送信するすべてのツール(マーケティングプラットフォーム、ヘルプデスク、CRM、請求システム、Webフォーム、人事ツール、サーバー)を一覧にします。
- 送信量とパターン:既知のサービスからの少量で安定した件数は正常です。不明なIPからの突然の急増は疑わしいといえます。
短いスクリプトでレポートを集計する
展開済みレポートが入ったフォルダーを最初に確認するには、次のスクリプトで、送信元IPとDMARCの結果ごとにメッセージ数を集計できます。
import glob
import xml.etree.ElementTree as ET
from collections import defaultdict
totals = defaultdict(int)
for path in glob.glob("reports/*.xml"):
for rec in ET.parse(path).getroot().iter("record"):
row = rec.find("row")
ip = row.findtext("source_ip")
ev = row.find("policy_evaluated")
key = (ip, ev.findtext("dkim"), ev.findtext("spf"))
totals[key] += int(row.findtext("count"))
for (ip, dkim, spf), n in sorted(totals.items(), key=lambda x: -x[1]):
print(f"{ip:18} dkim={dkim:5} spf={spf:5} messages={n}")
アラインメント失敗の修正
| レポートのパターン | 原因 | 対処 |
|---|---|---|
| SPFは通過するがDMARCは失敗する | SPFが認証したのはプロバイダーのドメインで、お客様のドメインではない | ご自身のドメインで独自のReturn-Pathを使う |
| DKIMは通過するがDMARCは失敗する | 署名のd=にプロバイダーのドメインが使われている | ご自身のドメインで署名する:そのサービス用のDKIMセレクターを公開する |
| 既知のサービスで両方とも失敗する | そのサービスがお客様のドメイン用に設定されていない | ドメイン認証を完了する |
| 転送元経由でのみ失敗する | 転送によりSPFが壊れ、DKIMが改変された | 少数の失敗は残るものと考える。DKIMが存在し、本文に署名していることを確認する |
| サブドメインで失敗する | サブドメインに専用のレコードがない | そのサブドメイン用にSPFとDKIMを公開する |
段階的に適用を強める
正当な送信元がアラインし、失敗するのが不明な送信元だけになったら、ポリシーを徐々に引き上げます。各段階で少なくとも1週間待ち、レポートを確認してから次に進んでください。
| ステップ | レコード | 動作 |
|---|---|---|
| 1 | p=none | 監視のみ。レポートを収集する |
| 2 | p=quarantine; pct=10 | 失敗したメールのうち10%のメッセージが迷惑メールに振り分けられる |
| 3 | p=quarantine; pct=50 | 失敗したメールの半分が隔離される |
| 4 | p=quarantine | 失敗したメールがすべて隔離される |
| 5 | p=reject; pct=25 | 失敗したメールの4分の1が拒否される |
| 6 | p=reject | 失敗したメールがすべて拒否される。ruaアドレスは残しておく |
p=noneで止まらないでください。p=noneは、Gmail、Yahoo、Outlook.comの大量送信者向けの最低限のルールを満たしますが、なりすましは防げません。ドメインと受信者を守るのは、ポリシーの適用です。
p=reject後も監視を続ける
- 最初は毎週確認し、その後は毎月確認します。お客様のドメインとして送信する新しいツールは、失敗として現れます。
- オンボーディングに手順を追加する:お客様のドメインとしてメールを送る新しいシステムは、稼働前に認証を行います。
- 未使用ドメインを保護する:送信に使わないドメインには、p=rejectと空のSPFレコードを公開します。
- BIMIへの準備に注意する:将来、受信箱にロゴを表示したい場合、DMARCポリシーの適用が前提条件となります。
レポートについてセカンドオピニオンが必要ですか?サンプルレポートと、お客様のドメインとして送信しているサービスの一覧をお送りください。修正すべき点の整理をお手伝いします。
参考資料と出典
よくある質問
DMARC集計レポートとは何ですか?
メールボックスプロバイダーが、DMARCレコードのruaアドレス宛に、通常は1日1回送信するXMLファイル(通常は圧縮済み)です。お客様のドメインを名乗るメールとしてプロバイダーが確認した内容(送信元IP、メッセージ数、SPF、DKIM、DMARCの通過可否)をまとめたもので、メッセージの内容は含まれません。
DMARCレポートが届かないのはなぜですか?
ruaアドレスが正しく、mailto: の接頭辞付きで記述されていること、メールボックスが大きな添付ファイルを受け付けること、少なくとも1日待ったことを確認してください。レポートの宛先が別のドメインにある場合は、そのドメインが承認レコードを公開している必要があります。すべてのプロバイダーがレポートを送るわけではなく、小規模なドメインに届くレポートは少ないこともあります。
ruaとrufの違いは何ですか?
ruaタグは、概要である集計レポートを要求します。rufタグは、失敗した個々のメッセージについてのフォレンジック(失敗)レポートを要求します。個人データを含む可能性があるため、大手プロバイダーの多くはフォレンジックレポートを送信しません。集計レポートを前提に計画してください。
ツールなしでDMARCレポートを読めますか?
数ファイル程度であれば、プレーンなXMLなので可能です。それ以上の量になる場合は、レポート処理サービスや短いスクリプトを使って送信元ごとに結果を集計してください。小規模なドメインでも、1日に数十件のレポートが届くことがあるためです。
アラインメントの失敗とは何を意味しますか?
DMARCが通過するのは、SPFまたはDKIMが通過し、かつ認証されたドメインが表示上のFromドメインと一致する場合のみです。送信元がサービスプロバイダーのドメインでSPFを通過していても、Fromドメインが異なれば、SPFが通過していてもDMARCは失敗します。解決策は、独自のReturn-Pathや、ご自身のドメインを使ったDKIM署名によって、ご自身のドメインで認証することです。
p=noneにはどれくらいの期間とどまるべきですか?
すべての正当な送信元を確認できるまでで、通常は2〜4週間です。請求書のように月次で送るメールがある場合は、月末の送信サイクルも含めてください。p=noneのままでは何も保護されないため、移行する期日を決めましょう。
pctタグは何をしますか?
pctタグは、ポリシーを失敗したメッセージの一定割合にのみ適用します(例:pct=25)。quarantineやrejectを段階的に展開できます。対応は一般的ですが普遍的ではないため、ゆるやかな制御と考え、レポートの確認を続けてください。
p=rejectでメールが届かなくなりませんか?
DMARCに失敗したメッセージはすべてブロックされます。それが目的です。正当なメールが届かなくなるのは、本物の送信元が認証・アラインされていない場合だけです。だからこそ、先にレポートを収集し、正当な送信元をすべて修正してから、段階的に移行します。
転送されたメールやメーリングリストはどうなりますか?
転送元がお客様のレコードに含まれていないため、転送はSPFを壊すことがよくあります。また、リストがメッセージを変更してDKIMを壊すこともあります。維持されるDKIM署名と、転送元が追加するARCヘッダーは、受信側の判断に役立ちます。健全な環境でも、転送による少数の失敗は残るものと考えてください。
サブドメインにも専用のDMARCレコードが必要ですか?
メインドメインのDMARCレコードは、上書きしない限りサブドメインにも適用されます。spタグでサブドメイン用のポリシーを設定でき、サブドメインにレコードを置くと両方が上書きされます。使っていないサブドメインはなりすましの標的になるため、それらに厳格なポリシーを設定するのは手軽で効果的な対策です。