📧

DMARCレポートを読んでみる

2025/02/12に公開

DMARC(Domain-based Message Authentication, Reporting & Conformance)の設定によりDMARCレポートが届くようになったのですが、何が書かれてあって何を確認するべきなのかが分からなかったので調べてみました。
DMARCレポートには集約レポート(ruaレポート)と失敗レポート(rufレポート)の2種類あるようですが、今回調べたのは集約レポートの方です。

前提:DMARCの設定内容

Google CloudのDNSには以下のように設定しています。

"v=DMARC1;p=quarantine;rua=mailto:DMARCレポートを受信するメールアドレス"

届いた集約レポートがこちら

<?xml version="1.0" encoding="UTF-8" ?>
<feedback>
  <report_metadata>
    <org_name>google.com</org_name>
    <email>noreply-dmarc-support@google.com</email>
    <extra_contact_info>https://support.google.com/a/answer/2466580</extra_contact_info>
    <report_id>12516310370892191740</report_id>
    <date_range>
      <begin>1738886400</begin>
      <end>1738972799</end>
    </date_range>
  </report_metadata>
  <policy_published>
    <domain>my.domain</domain>
    <adkim>r</adkim>
    <aspf>r</aspf>
    <p>quarantine</p>
    <sp>quarantine</sp>
    <pct>100</pct>
    <np>quarantine</np>
  </policy_published>
  <record>
    <row>
      <source_ip>IPその1</source_ip>
      <count>12</count>
      <policy_evaluated>
        <disposition>none</disposition>
        <dkim>pass</dkim>
        <spf>pass</spf>
      </policy_evaluated>
    </row>
    <identifiers>
      <header_from>my.domain</header_from>
    </identifiers>
    <auth_results>
      <dkim>
        <domain>my.domain</domain>
        <result>pass</result>
        <selector>s1</selector>
      </dkim>
      <spf>
        <domain>em0000.my.domain</domain>
        <result>pass</result>
      </spf>
    </auth_results>
  </record>
  <record>
    <row>
      <source_ip>IPその2</source_ip>
      <count>1</count>
      <policy_evaluated>
        <disposition>none</disposition>
        <dkim>pass</dkim>
        <spf>fail</spf>
      </policy_evaluated>
    </row>
    <identifiers>
      <header_from>my.domain</header_from>
    </identifiers>
    <auth_results>
      <dkim>
        <domain>my.domain</domain>
        <result>pass</result>
        <selector>s1</selector>
      </dkim>
      <spf>
        <domain>hoge.co.jp</domain>
        <result>pass</result>
      </spf>
    </auth_results>
  </record>
  <record>
    <row>
      <source_ip>IPその3</source_ip>
      <count>2</count>
      <policy_evaluated>
        <disposition>none</disposition>
        <dkim>pass</dkim>
        <spf>fail</spf>
      </policy_evaluated>
    </row>
    <identifiers>
      <header_from>my.domain</header_from>
    </identifiers>
    <auth_results>
      <dkim>
        <domain>my.domain</domain>
        <result>pass</result>
        <selector>s1</selector>
      </dkim>
      <spf>
        <domain>hoge.co.jp</domain>
        <result>pass</result>
      </spf>
    </auth_results>
  </record>
  <record>
    <row>
      <source_ip>IPその4</source_ip>
      <count>1</count>
      <policy_evaluated>
        <disposition>none</disposition>
        <dkim>pass</dkim>
        <spf>fail</spf>
      </policy_evaluated>
    </row>
    <identifiers>
      <header_from>my.domain</header_from>
    </identifiers>
    <auth_results>
      <dkim>
        <domain>my.domain</domain>
        <result>pass</result>
        <selector>s1</selector>
      </dkim>
      <spf>
        <domain>hoge.co.jp</domain>
        <result>pass</result>
      </spf>
    </auth_results>
  </record>
</feedback>

XMLは大きく3つのブロック(report_metadata,policy_published,record)に分かれています。
各ブロックから得られる情報を一つずつ見ていきます。

report_metadataブロック

  • org_name: レポートを生成した組織の名前 (google.com)
  • email: レポートに関する連絡先メールアドレス (noreply-dmarc-support@google.com)
  • extra_contact_info: 追加の連絡先情報 (https://support.google.com/a/answer/2466580)
  • report_id: レポートの一意の識別子 (12516310370892191740)
  • date_range: レポートに含まれるデータの期間
  • begin: 開始日時 (1738886400)
  • end: 終了日時 (1738972799)

policy_publishedブロック

  • domain: 対象ドメイン (my.domain)
  • adkim: DKIMアライメントモード (r - リラックス)
  • aspf: SPFアライメントモード (r - リラックス)
  • p: メインポリシー (quarantine - 隔離)
  • sp: サブドメインポリシー (quarantine - 隔離)
  • pct: ポリシーを適用するメールの割合 (100%)
  • np: 非同期ポリシー (quarantine - 隔離)

adkimタグ

DMARCポリシーの「Alignment Mode for DKIM」の略。FromヘッダーのドメインとDKIM署名で使用されるドメインの間のアライメントをどの程度厳密にするかを指定する。
アライメントとは、電子メールの「From」アドレスのドメインが、電子メールのSPFおよびDKIM認証チェックで使用されるドメインと一致していることを確認するプロセスを指す。

adkimは2つの値を取りうる。

  • r(relaxed):FromヘッダーのドメインがDKIM署名のドメインのサブドメインの場合、DKIM署名は有効である。例えばsub.example.comexample.comはアライメントされているとみなされる。
  • s (strict):FromヘッダーのドメインがDKIM署名のドメインと完全に一致する場 合のみ、DKIM署名が有効である。例えばsub.example.comexample.comはアライメントされていないとみなされる。

aspfタグ

aspfはDMARCポリシーの「Alignment Mode for SPF」の略。これは、FromヘッダーのドメインとSPFチェックで使用されるドメインの間のアライメントをどの程度厳密にするかを指定する。
aspfは2つの値を取りうる。

  • r(relaxed):Fromヘッダーのドメインが、SPFチェックで使用するドメインのサブドメインである場合、SPFチェックは有効である。
  • s (strict): SPFチェックは、FromヘッダーのドメインがSPFチェックで使用したドメインと完全に一致する場合にのみ有効である。

pタグ、spタグ

メインドメインとサブドメインのDMARCポリシーアクションを指定する。

  • p: このタグはメインドメインのポリシーを定義する。以下の値を持つことができる:
    • none: 特定のアクションは実行されないがレポートが生成される。
    • quarantine(隔離): DMARCチェックに失敗したメールは疑わしいものとして扱われ、スパム/迷惑メールフォルダに入れられることがある。
    • reject(拒否): DMARCチェックに失敗したメールは完全に拒否される。
  • sp: このタグはサブドメインのポリシーを定義する。pタグと同じ値(none、quarantine、reject)を持つことができる。spタグが指定されていない場合、pタグで定義されたポリシーがサブドメインにも適用される。

pctタグ、npタグ

追加ポリシーの詳細を指定する。

  • pct: このタグはDMARCポリシーが適用されるメッセージの割合を定義する。例えば、pctが100に設定された場合、ポリシーはすべてのメッセージに適用される。50に設定された場合、ポリシーはメッセージの半分に適用される。
  • np: このタグは存在しないサブドメインに対するポリシーを定義する。pタグと同じ値(none、quarantine、reject)を持つことができる。このポリシーは、DNSに存在しないサブドメインからのメッセージに適用される。

recordブロック

各レコードは特定の送信元IPアドレスからのメールの評価結果を示す。

レコード1
  • source_ip: 送信元IPアドレス (IPその1)
  • count: 送信元IPアドレスから受信したメールの数 (12)
  • policy_evaluated: ポリシー評価結果
    • disposition: 処置 (none - なし)
    • dkim: DKIM検証結果 (pass)
    • spf: SPF検証結果 (pass)
  • identifiers: メールの識別子
    • header_from: 送信元ヘッダー (my.domain)
  • auth_results: 認証結果
    • dkim: DKIM認証結果
      • domain: ドメイン (my.domain)
      • result: 結果 (pass)
      • selector: セレクタ (s1)
    • spf: SPF認証結果
      • domain: ドメイン (em0000.my.domain)
      • result: 結果 (pass)
レコード2
  • source_ip: 送信元IPアドレス (IPその2)
  • count: メールの数 (1)
  • policy_evaluated: ポリシー評価結果
    • disposition: 処置 (none - なし)
    • dkim: DKIM検証結果 (pass)
    • spf: SPF検証結果 (fail)
  • identifiers: メールの識別子
    • header_from: 送信元ヘッダー (my.domain)
  • auth_results: 認証結果
    • dkim: DKIM認証結果
      • domain: ドメイン (my.domain)
      • result: 結果 (pass)
      • selector: セレクタ (s1)
    • spf: SPF認証結果
      • domain: ドメイン (hoge.co.jp)
      • result: 結果 (pass)
レコード3
  • source_ip: 送信元IPアドレス (IPその3)
  • count: メールの数 (2)
  • policy_evaluated: ポリシー評価結果
    • disposition: 処置 (none - なし)
    • dkim: DKIM検証結果 (pass)
    • spf: SPF検証結果 (fail)
  • identifiers: メールの識別子
    • header_from: 送信元ヘッダー (my.domain)
  • auth_results: 認証結果
    • dkim: DKIM認証結果
      • domain: ドメイン (my.domain)
      • result: 結果 (pass)
      • selector: セレクタ (s1)
  • spf: SPF認証結果
    • domain: ドメイン (hoge.co.jp)
    • result: 結果 (pass)
レコード4
  • source_ip: 送信元IPアドレス (IPその4)
  • count: メールの数 (1)
  • policy_evaluated: ポリシー評価結果
    • disposition: 処置 (none - なし)
    • dkim: DKIM検証結果 (pass)
    • spf: SPF検証結果 (fail)
  • identifiers: メールの識別子
    • header_from: 送信元ヘッダー (my.domain)
  • auth_results: 認証結果
    • dkim: DKIM認証結果
      • domain: ドメイン (my.domain)
      • result: 結果 (pass)
      • selector: セレクタ (s1)
    • spf: SPF認証結果
      • domain: ドメイン (hoge.co.jp)
      • result: 結果 (pass)

policy_evaluatedタグ

  • disposition
    メールがDMARCチェックに合格したかどうか、またはどのように処理されたかを示す。dispositionはnone、quarantine、rejectを持ち、メールがどのように処理されたかを理解することができる。
  • dkim:dkimの認証結果
  • spf:spfの認証結果

auth_resultsタグ

  • dkim
    • domain: DKIM署名を行ったドメイン名。
    • result: DKIM認証の結果。pass (成功) や fail (失敗) などの値が含まれる。
    • selector: DKIM署名に使用されたセレクター。セレクターはDNSレコード内の公開鍵を特定するための識別子のこと。
    <auth_results>
      <dkim>
        <domain>my.domain</domain>
        <result>pass</result>
        <selector>s1</selector>
      </dkim>
        ...
    </auth_results>

この例では my.domainドメインのs1セレクターを使用してDKIM認証が行われ、結果はpass であることを示している。

  • spf
    • domain: SPF認証を行ったドメイン名。
    • result: SPF認証の結果。pass (成功) や fail (失敗) などの値が含まれる。
    <auth_results>
      ... 
      <spf>
        <domain>em0000.my.domain</domain>
        <result>pass</result>
      </spf>
    </auth_results>

この例では、em0000.my.domainドメインのSPF認証が行われ、結果はpassであることを示している。

policy_evaluatedタグのSPFとauth_resultsタグのSPFの結果が異なっているのはなぜ?

レコード1はpolicy_evaluatedタグのSPFとauth_resultsタグのSPFがいずれもpassとなっていましたが、レコード2/3/4はpolicy_evaluatedのSPFがfailauth_resultsタグのSPFがpassでした。

この理由についてCopilotに聞いてみたところ、以下の返答がありました。

1.SPF認証の評価タイミングの違い:  
auth_results タグは、メールが受信された時点でのSPF認証結果を示します。一方、policy_evaluated タグは、DMARCポリシーの評価時点での結果を示します。メールが受信された後にSPFレコードが変更された場合、結果が異なることがあります。

2.SPF認証の評価基準の違い:  
auth_results タグの spf は、送信元IPアドレスがSPFレコードに一致するかどうかのみを評価します。一方、policy_evaluated タグの spf は、DMARCポリシーに基づいてSPF認証結果を評価します。例えば、SPF認証が pass でも、DMARCポリシーで要求されるアライメントが一致しない場合、policy_evaluated の spf は fail となることがあります。

3.メールの転送:  
メールが転送された場合、転送元のIPアドレスがSPFレコードに含まれていないため、policy_evaluated タグの spf が fail となることがあります。しかし、元の送信者のSPF認証が pass であれば、auth_results タグの spf は pass となることがあります。

Copilotの返答のうち、メールの転送は心当たりがあります。レコード2/3/4のauth_resultsタグのspfdomain(hoge.co.jp)は会社のドメインでした。SendGridから会社のメールアドレス宛に送信したメールをGmailに転送していたので、SPFの認証を行ったドメインが会社のドメインとなったようです。
ということで、レコード2/3/4も問題はなさそうだと判断しました。

DMARCレポートの何に注目するべきかCopilotに聞いてみた

Copilotの返答は以下です。

1.認証結果:  
SPFとDKIMの認証結果を確認します。pass (成功) や fail (失敗) の結果が表示されます。これにより、どのメールが認証に成功し、どのメールが失敗したかを把握できます。

2.送信元ドメイン:  
メールが送信されたドメインを確認します。これにより、正当なドメインからのメールかどうかを判断できます。

3.送信元IPアドレス:  
メールが送信されたIPアドレスを確認します。これにより、不正なIPアドレスからのメールを特定できます。

4.ポリシー適用結果:  
DMARCポリシーがどのように適用されたかを確認します。none (ポリシーなし)、quarantine (隔離)、reject (拒否) などの結果が表示されます。

5.アライメント:  
SPFとDKIMのアライメント結果を確認します。これにより、メールの送信元ドメインと認証ドメインが一致しているかどうかを判断できます。

6.レポートの集計データ:  
認証結果やポリシー適用結果の集計データを確認します。これにより、全体的なメールの認証状況を把握できます。

レコード1については全く問題がなさそうです。送信元IPアドレスはSendGridのIPでした。
レコード2/3/4について、送信元IPアドレスは見覚えのないIPアドレスでSPFのポリシー評価結果はfailでしたが、認証結果はpassでした。これについて、SPF認証を行ったドメインが会社のメールアドレスのドメインであったことから、メールを転送したことが原因であり、問題はないと判断しました。
レコード1/2/3/4ともポリシー適用結果はnoneだったので、ここも問題なしと判断しました。

最後に

DMARCレポートに何が書いてあるのか、どこに着目するべきかを知りたかったので今回は自力でXMLを解析しましたが(といってもレコード4つしかないので大したことない)、実際の業務でDMARCレポートを活用していくにはツールに頼るべきだろうなと実感しました。

レスキューナウテックブログ

Discussion