Розбір DMARC-звіту

Як зрозуміти цей звіт від noreply-dmarc-support@google.com?

<?xml version="1.0" encoding="UTF-8" ?>
<feedback>
  <version>1.0</version>
  <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>14367678962996688413</report_id>
    <date_range>
      <begin>1757289600</begin>
      <end>1757375999</end>
    </date_range>
  </report_metadata>
  <policy_published>
    <domain>ans.kiev.ua</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>185.107.237.45</source_ip>
      <count>2</count>
      <policy_evaluated>
        <disposition>none</disposition>
        <dkim>pass</dkim>
        <spf>pass</spf>
      </policy_evaluated>
    </row>
    <identifiers>
      <header_from>ans.kiev.ua</header_from>
    </identifiers>
    <auth_results>
      <dkim>
        <domain>ans.kiev.ua</domain>
        <result>pass</result>
        <selector>mail</selector>
      </dkim>
      <spf>
        <domain>ans.kiev.ua</domain>
        <result>pass</result>
      </spf>
    </auth_results>
  </record>
</feedback>


Це типовий DMARC-звіт (Aggregate Report), який Google надсилає власникам доменів, щоб вони могли відстежувати, як обробляється їхня пошта в інших поштових сервісах. Розберу твій приклад по частинах 👇


1. Хто надіслав звіт

<org_name>google.com</org_name>
<email>noreply-dmarc-support@google.com</email>

Це звіт з поштових серверів Google, які обробляли пошту з твого домену.


2. Період звіту

<date_range>
  <begin>1757289600</begin>
  <end>1757375999</end>
</date_range>

Це UNIX-мітки часу (секунди від 1970-01-01). Якщо перевести — це доба, за яку формується звіт.


3. Опублікована політика DMARC

<policy_published>
  <domain>ans.kiev.ua</domain>
  <adkim>r</adkim>
  <aspf>r</aspf>
  <p>quarantine</p>
  <sp>quarantine</sp>
  <pct>100</pct>
  <np>quarantine</np>
</policy_published>
  • domain — твій домен: ans.kiev.ua

  • p=quarantine — політика: якщо повідомлення не проходить перевірку DMARC, його треба відправити у "спам" (карантин).

  • aspf / adkim = r — перевірка SPF та DKIM у "relaxed" режимі (не суворий збіг).

  • pct=100 — політика застосовується до всіх повідомлень (100%).


4. Запис про конкретні листи

<source_ip>185.107.237.45</source_ip>
<count>2</count>
  • Google отримав 2 листи з IP-адреси 185.107.237.45, які були відправлені від імені ans.kiev.ua.


5. Як перевірка пройшла

<policy_evaluated>
  <disposition>none</disposition>
  <dkim>pass</dkim>
  <spf>pass</spf>
</policy_evaluated>
  • dkim = pass — підпис DKIM пройшов.

  • spf = pass — SPF також пройшов.

  • disposition = none — Google не застосовував карантин, бо лист відповідав політиці.


6. Додатково

<auth_results>
  <dkim>
    <domain>ans.kiev.ua</domain>
    <result>pass</result>
    <selector>mail</selector>
  </dkim>
  <spf>
    <domain>ans.kiev.ua</domain>
    <result>pass</result>
  </spf>
</auth_results>
  • DKIM-підпис був з селектором mail і пройшов перевірку.

  • SPF перевірка теж підтвердила, що IP дозволений у SPF-записі домену.


Підсумок: Google повідомляє, що за добу він отримав 2 листи з твого домену ans.kiev.ua (IP: 185.107.237.45). Листи успішно пройшли перевірку SPF і DKIM, тому політика DMARC спрацювала коректно, і жодних проблем немає.


Я думав, що такі звіти будуть надсилатися лише при проблемах.

О, це поширене непорозуміння 🙂

Насправді DMARC aggregate reports (RUA-звіти) надсилаються завжди (щодня), якщо ти вказав у DNS-записі домену параметр rua=mailto:....

Вони потрібні не лише для сигналу про проблеми, а й для моніторингу:

  • скільки листів відправляється від імені твого домену;

  • з яких IP-адрес;

  • чи проходять вони SPF/DKIM;

  • чи хтось сторонній намагається підробити твій домен.

Тобто навіть якщо все гаразд (як у твоєму випадку — SPF і DKIM пройшли), ти все одно отримуєш щоденний звіт.


⚠️ Інша справа — форензичні DMARC-звіти (RUF). Вони відправляються тільки тоді, коли конкретний лист провалив перевірку DMARC.


Хочеш, я покажу, як можна автоматично зберігати й візуалізувати ці щоденні RUA-звіти, щоб не розбирати XML вручну?

Тоді поясню, як це робиться на практиці.


🔹 Як автоматизувати роботу з DMARC RUA-звітами

DMARC aggregate reports завжди приходять у форматі XML (часто всередині ZIP/GZ-архівів). Щоб не копирсатися руками, можна зробити одну з двох стратегій:


1. Використати готовий сервіс (найпростіше)

Є сервіси, які «збирають» усі RUA-звіти з поштової скриньки й малюють зрозумілу статистику:

В більшості з них безкоштовний тариф дозволяє моніторити 1 домен.


2. Зробити самому (гнучкіше)

Можна налаштувати власний парсер XML:

Приклад на Python:

import xml.etree.ElementTree as ET

with open("google-dmarc-report.xml", "r") as f:
    tree = ET.parse(f)
    root = tree.getroot()

# Звіт про всі записи
for record in root.findall("record"):
    ip = record.find("row/source_ip").text
    count = record.find("row/count").text
    dkim = record.find("row/policy_evaluated/dkim").text
    spf = record.find("row/policy_evaluated/spf").text
    disposition = record.find("row/policy_evaluated/disposition").text

    print(f"IP: {ip}, Листів: {count}, DKIM: {dkim}, SPF: {spf}, Рішення: {disposition}")

Цей код витягне з твого прикладу такий результат:

IP: 185.107.237.45, Листів: 2, DKIM: pass, SPF: pass, Рішення: none

3. Візуалізація

Далі дані можна:

  • зберігати у SQLite/PostgreSQL;

  • будувати дашборди у Grafana / Metabase;

  • або навіть у Google Sheets (через CSV-експорт).


Як виглядають проблеми в такому звіті.

Дуже слушне питання 👌 Давай розглянемо, як у DMARC RUA-звітах видно проблеми.


🔹 Ознаки проблем у звіті

1. SPF або DKIM = fail

У секції <policy_evaluated>:

<policy_evaluated>
  <disposition>quarantine</disposition>
  <dkim>fail</dkim>
  <spf>fail</spf>
</policy_evaluated>
  • dkim=fail — підпис не збігся або не був знайдений.

  • spf=fail — IP-адреса не входить у твій SPF-запис.

  • Якщо обидва = fail → DMARC вважає, що лист неавтентичний.


2. Disposition ≠ none

<disposition>quarantine</disposition>

або

<disposition>reject</disposition>

Це означає, що отримувач застосував твою політику DMARC (листи відправлені у спам або відхилені).


3. Підозрілі IP-адреси

У <source_ip> може з’явитися адреса, яку ти не очікуєш (наприклад, сервер у чужій країні). Це часто вказує на те, що хтось намагається підробити твій домен (spoofing/phishing).


🔸 Приклад проблемного запису

<record>
  <row>
    <source_ip>203.0.113.55</source_ip>
    <count>15</count>
    <policy_evaluated>
      <disposition>quarantine</disposition>
      <dkim>fail</dkim>
      <spf>fail</spf>
    </policy_evaluated>
  </row>
  <identifiers>
    <header_from>ans.kiev.ua</header_from>
  </identifiers>
  <auth_results>
    <dkim>
      <domain>ans.kiev.ua</domain>
      <result>fail</result>
    </dkim>
    <spf>
      <domain>ans.kiev.ua</domain>
      <result>fail</result>
    </spf>
  </auth_results>
</record>

👉 Це означає:

  • 15 листів прийшли з IP 203.0.113.55.

  • SPF і DKIM не пройшли.

  • Google застосував твою політику: quarantine (листи у спам).

  • Імовірно, це підробка від чужого сервера.


✅ Якщо все добре (як у твоєму попередньому прикладі) — завжди бачиш dkim=pass, spf=pass, disposition=none. ⚠️ Якщо проблема — бачиш fail і quarantine/reject, або невідомі IP.


Тільки Google надсилає такі звіти?


🔹 Хто надсилає DMARC aggregate reports

Коли ти вказуєш у DNS-домені DMARC-запис із параметром rua=mailto:..., ти фактично кажеш усім поштовим провайдерам:

«Будь ласка, шліть мені щоденні зведені звіти про те, як ви бачили мою пошту».

Тобто:

  • Gmail (Google)

  • Outlook/Hotmail (Microsoft)

  • Yahoo

  • Apple iCloud

  • інші великі поштові сервіси

— усі вони можуть надсилати тобі RUA-звіти, якщо через їхні сервери пройшла пошта від твого домену.


🔹 Чому ти отримав саме від Google

Бо упродовж того дня, за який складено звіт:

  • якісь листи від твого домену потрапили в Gmail (отримувачі користувалися поштою Google),

  • і Google згенерував для тебе щоденний агрегований звіт.

Тому адреса відправника звіту виглядає як:

noreply-dmarc-support@google.com

🔹 А якби пошта йшла ще кудись

Наприклад, твої листи надходили в Yahoo або Microsoft — ти отримав би додаткові звіти від їхніх доменів (з різних email-адрес).


✅ Висновок: ти отримуєш звіти від кожного великого поштового провайдера, який бачив пошту з твого домену. Тому зараз бачиш саме Google, бо у тебе були отримувачі з Gmail.


Хочеш, я покажу, як у твоєму DNS-записі DMARC можна перевірити, куди саме різні провайдери відправляють ці звіти (RUA/RUF)?

Last updated