ARC

ARC (Authenticated Received Chain, RFC 8617) — механизм сохранения результатов SPF/DKIM/DMARC когда письмо проходит через посредников (mailing-lists, forwarding-сервисы, alias-сервисы). Каждый посредник добавляет свою подпись цепочкой, позволяя финальному получателю доверять оценке от промежуточного сервера.

Проблема которую решает

Пример: Alice в mailing-list discuss@list.com. Cписок пересылает её письмо всем подписчикам, но переписывает тело (добавляет footer «unsubscribe: ...»).

  1. Alice → list.com. SPF/DKIM/DMARC от example.com проходят.
  2. list.com обрабатывает, добавляет footer, пересылает Bob@gmail.com.
  3. 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 отклонит.

Alice не может участвовать в mailing-list.

Как ARC решает

Промежуточный сервер (list.com) добавляет три ARC-заголовка:

  1. ARC-Authentication-Results — что list.com видел до модификации («SPF pass, DKIM pass, DMARC pass»).
  2. ARC-Message-Signature — DKIM-подобная подпись текущего состояния письма от list.com.
  3. ARC-Seal — подпись предыдущих ARC-заголовков + всей цепочки, чтобы её нельзя было переставить.

Финальный получатель:

  1. Видит битые SPF/DKIM/DMARC текущие → плохо.
  2. Проверяет ARC-цепочку → «list.com говорит что при получении от example.com всё было валидно».
  3. Если доверяет 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= самого последнего 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
RspamdARC-модуль

DKIM vs ARC

DKIMARC
Что подписываетОригинальные заголовки + телоТекущее состояние + предыдущие результаты
Кто ставитОтправитель (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

См. также