DMARC
DMARC (Domain-based Message Authentication, Reporting, and Conformance, RFC 7489) — надстройка над SPF и DKIM. Определяет политику: что делать если проверки не прошли, и отчёты: кто должен слать сводки о попытках подделки. Основной механизм защиты домена от spoofing и phishing.
Что решает
SPF и DKIM работают, но:
- SPF проверяет envelope-from, а пользователь видит
From:— можно обмануть. - DKIM подписывает какой угодно домен, необязательно совпадающий с From.
- Получатель не знает: «должен ли этот домен быть подписан», «что делать при failure».
DMARC добавляет:
- Alignment. SPF или DKIM должны совпадать с
From:заголовком. - Policy. Что делать: none / quarantine / reject.
- Reporting. Отправлять отчёты об успехах и провалах на email домена.
Запись
_dmarc.example.com. IN TXT "v=DMARC1; p=reject; rua=mailto:dmarc@example.com; ruf=mailto:dmarc@example.com; sp=reject; adkim=s; aspf=s; pct=100"
Теги
| Тег | Значения | Смысл |
|---|---|---|
| v | DMARC1 | Обязательно |
| p | none / quarantine / reject | Основная политика |
| sp | none / quarantine / reject | Политика для поддоменов |
| pct | 0-100 | Применять политику к N% почты. Для постепенного rollout |
| rua | mailto:... | Куда слать агрегированные отчёты (XML, каждые 24 часа) |
| ruf | mailto:... | Куда слать failure-отчёты (по каждому провалу) |
| adkim | r / s | DKIM alignment: relaxed (subdomain OK) или strict (точное совпадение) |
| aspf | r / s | Аналогично для SPF |
| fo | 0/1/d/s | Условия отправки forensic-отчётов |
Alignment
Ключевая концепция. DMARC говорит: «SPF или DKIM должны aligned с From:»:
From: alice@example.com
SPF alignment:
envelope-from bounce@mail.example.com → domain "mail.example.com"
From domain example.com
Strict: должно совпадать полностью → не aligned (subdomain)
Relaxed: organizational domain одинаковое → aligned ✅
DKIM alignment:
DKIM d=example.com
From domain example.com
→ aligned ✅
DMARC pass = (SPF pass AND SPF aligned) OR (DKIM pass AND DKIM aligned).
Политики
| p= | Что делает получатель | Когда использовать |
|---|---|---|
| none | Ничего, только шлёт отчёты | Первые 1-3 месяца после публикации. Monitoring mode |
| quarantine | Кладёт в спам | Промежуточный шаг. Ловим ошибки конфига |
| reject | Отклоняет на SMTP-уровне | Финальная цель |
Roll-out plan
- Месяц 1-2:
p=none; pct=100; rua=.... Собираем отчёты, видим кто шлёт от имени домена. - Месяц 3: Настроить SPF/DKIM для всех легитимных источников (Google, Mailchimp, свой сервер).
- Месяц 4:
p=quarantine; pct=10. Начинаем. - Месяц 5-6:
p=quarantine; pct=50 → 100. - Месяц 7:
p=reject; pct=10 → 100. - Готово. Никто больше не может спуфить твой домен.
Aggregate reports (RUA)
Каждые 24 часа получатели (Google, Microsoft, Mail.ru, Yahoo) шлют XML-отчёт:
<feedback>
<report_metadata>
<org_name>google.com</org_name>
<date_range>
<begin>1700000000</begin>
<end>1700086400</end>
</date_range>
</report_metadata>
<record>
<row>
<source_ip>1.2.3.4</source_ip>
<count>150</count>
<policy_evaluated>
<disposition>none</disposition>
<dkim>pass</dkim>
<spf>fail</spf>
</policy_evaluated>
</row>
<identifiers>
<header_from>example.com</header_from>
</identifiers>
</record>
</feedback>
Failure reports (RUF)
Отдельные отчёты по каждому провалу. Содержат заголовки и тело письма — приватность!. Многие крупные получатели не шлют RUF, потому что нарушает конфиденциальность отправителя.
Инструменты анализа
XML-отчёты неудобно читать. Есть сервисы-агрегаторы:
- EasyDMARC, Postmark DMARC Digests, Valimail, DMARCian, URIports — платные / freemium.
- parsedmarc — open-source Python-парсер, шлёт в Elasticsearch.
DMARCbis
Продолжение стандарта — draft-ietf-dmarc-dmarcbis (в процессе). Ключевые изменения:
- Removes SPF fallback for organizational domain lookup.
- Public Suffix List → отдельный tree walk.
- Более чёткая обработка null MX, unparseable.
Что делать при mailing-list
Проблема: рассылки (Google Groups, mailman) переписывают тело письма (добавляют footer). DKIM ломается, SPF не совпадает → DMARC reject.
Решения:
- Mailing-list переписывает
From:на свой (alice via list <list@example.com>). Некрасиво. - ARC — сохраняет цепочку подписей через промежуточные хопы.