Розбір 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