ARC
ARC (Authenticated Received Chain, RFC 8617) — механизм сохранения результатов SPF/DKIM/DMARC когда письмо проходит через посредников (mailing-lists, forwarding-сервисы, alias-сервисы). Каждый посредник добавляет свою подпись цепочкой, позволяя финальному получателю доверять оценке от промежуточного сервера.
Проблема которую решает
Пример: Alice в mailing-list discuss@list.com. Cписок пересылает её письмо всем подписчикам, но переписывает тело (добавляет footer «unsubscribe: ...»).
- Alice → list.com. SPF/DKIM/DMARC от example.com проходят.
- list.com обрабатывает, добавляет footer, пересылает Bob@gmail.com.
- Gmail проверяет:
- SPF: envelope-from
list.com, IP list.com. Pass — но не aligned сFrom: alice@example.com. - DKIM: подпись example.com ломается (тело изменено). Fail.
- DMARC на example.com:
p=reject. Итог — Gmail отклонит.
- SPF: envelope-from
Alice не может участвовать в mailing-list.
Как ARC решает
Промежуточный сервер (list.com) добавляет три ARC-заголовка:
- ARC-Authentication-Results — что list.com видел до модификации («SPF pass, DKIM pass, DMARC pass»).
- ARC-Message-Signature — DKIM-подобная подпись текущего состояния письма от list.com.
- ARC-Seal — подпись предыдущих ARC-заголовков + всей цепочки, чтобы её нельзя было переставить.
Финальный получатель:
- Видит битые SPF/DKIM/DMARC текущие → плохо.
- Проверяет ARC-цепочку → «list.com говорит что при получении от example.com всё было валидно».
- Если доверяет list.com — принимает письмо.
Формат заголовков
ARC-Seal: i=1; a=rsa-sha256; s=arc; d=list.com; cv=none;
b=cD8DfsQi... (подпись)
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed;
d=list.com; s=arc;
h=from:subject:date:to:message-id;
bh=iNP0PMSMjW...=;
b=cP7Sv4c8...=
ARC-Authentication-Results: i=1; list.com;
spf=pass smtp.mailfrom=example.com;
dkim=pass header.d=example.com;
dmarc=pass header.from=example.com
Instance number (i=)
Каждый ARC-посредник получает свой instance (i=1, i=2, ...). Максимум 50 хопов. Каждый хоп добавляет свою тройку, включая ссылки на предыдущие через ARC-Seal.
Chain Validation (cv=)
ARC-Seal имеет тег cv=:
- cv=none — первый хоп, нет цепочки до этого.
- cv=pass — предыдущая цепочка была валидна и я её продолжаю.
- cv=fail — предыдущая цепочка сломана. Дальше в цепочке будет только fail.
Финальный получатель смотрит на cv= самого последнего ARC-Seal и решает.
Trust
ARC работает только если получатель доверяет посреднику. Google, Yahoo, Microsoft поддерживают ARC и имеют внутренние списки reputable ARC-signers. Мелкий mailing-list на VPS может добавить ARC-подпись, но её никто не проверит с доверием.
Кто использует
| Кто | ARC-действия |
|---|---|
| Google Groups | Подписывает при пересылке |
| Office 365 (Exchange Online) | Подписывает и проверяет |
| Yahoo mailing-lists | Подписывает |
| Mailman 3+ | Может подписывать |
| OpenARC | Реализация милтера для Postfix |
| Rspamd | ARC-модуль |
DKIM vs ARC
| DKIM | ARC | |
|---|---|---|
| Что подписывает | Оригинальные заголовки + тело | Текущее состояние + предыдущие результаты |
| Кто ставит | Отправитель (origin) | Промежуточные MTA |
| Ломается при модификации | Да | Нет — каждый хоп заново подписывает |
| Использует | Все домены | Только forwarding-серверы |
Использование в DMARC-оценке
Черновик DMARCbis (draft-ietf-dmarc-dmarcbis) описывает как использовать ARC для DMARC-override. Идея: если DMARC fail, но ARC от доверенного посредника показывает что оригинал был валиден → override к «локальной политике».
Setup OpenARC на Postfix
apt install opendkim opendkim-tools
# Сгенерировать ключ
opendkim-genkey -s arc -d list.example.com -b 2048
# добавить arc.txt в DNS как TXT arc._domainkey.list.example.com
# /etc/postfix/main.cf
milter_default_action = accept
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891