Title: Обработка процентного модификатора политики DMARC в Exim Content: Тема особенностей использования Domain-based Message Authentication, Reporting and Conformance или DMARC уже затрагивалась в рамках этого блога. Теперь хотелось бы остановиться на уже упомянутой в статье "DMARC для борьбы со спам на локальном и глобальном фронтах" особенностью обработки DMARC связанной с использованием возможности постепенного введения в действие политик типа quarantine и reject через использование их процентного модификатора.
К примеру, для отправителей из домена kostikov.co в соответствующей DMARC DNS-записи мы имеем следующее описание.
root@beta:~ # host -t txt _dmarc.kostikov.co
_dmarc.kostikov.co descriptive text "v=DMARC1; p=quarantine; pct=100; rua=mailto:dmarc-rua@kostikov.co"
В поле p= которое предписывает применяемую для несоответствующих правилам SPF и / или DKIM политику quarantine с вероятностью использования, указанной в поле pct= в 100%.
Посколько поле pct= является опциональным и, по факту, используемым лишь при применении политик reject и quarantine, то в случае его отсутствии в DNS-записи DMARC его значение по умолчанию принимается за 100.
Стандарт RFC7489 помимо прочего, предписывает алгоритм поведения почтовой системы при реализации политики DMARC для домена отправителя. В случае с quarantine процентный модификатор означает вероятность помещения входящего сообщения в карантин (обычно это означает пометку его как спам). В случае с reject же с указанной вероятностью письмо должно быть отброшено, а в остальных случаях помещено в quarantine.
На основании этой методики напишем правила обработки DMARC для SMTP-сервера Exim. Но для начала следует убедиться, что он был собран с опцией поддержки DMARC.
root@beta:~ # uname -v
FreeBSD 11.0-RELEASE-p2 #0: Mon Oct 24 06:55:27 UTC 2016 root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC
root@beta:~ # exim --version | head -1
Exim version 4.87 #0 (FreeBSD 11.0) built 19-Nov-2016 16:00:52
root@beta:~ # make -C /usr/ports/mail/exim showconfig | grep DMARC
DMARC=on: Enable DMARC support
Сам набор правил ACL для Exim будет выглядеть следующим образом.
root@beta:~ # cat /usr/local/etc/exim/configure
# $Cambridge: exim/exim-src/src/configure.default,v 1.14 2009/10/16 07:46:13 tom Exp $
# --- by Max Kostikov (c) 2010...2016 v.20161123
...
acl_smtp_rcpt = acl_check_rcpt
acl_smtp_dkim = acl_check_dkim
acl_smtp_mime = acl_check_mime
acl_smtp_data = acl_check_data
...
acl_check_data:
...
accept authenticated = *
accept hosts = +relay_from_hosts
...
# --- check sender's DMARC policy
warn dmarc_status = *
set acl_m_pct = ${extract{pct}{${sg{${lookup dnsdb{defer_never,txt=_dmarc.$dmarc_used_domain}}}{;}{ }}}}
add_header = $dmarc_ar_header (p=$dmarc_domain_policy, pct=$acl_m_pct)
warn set acl_m_pct = ${if def:acl_m_pct{$acl_m_pct}{100}}
deny dmarc_status = reject
condition = ${if >{$acl_m_pct}{${randint:100}}}
message = Rejected by sender's DMARC policy (pct=$acl_m_pct)
warn dmarc_status = reject
set acl_m_pct = 100
warn dmarc_status = reject : quarantine
condition = ${if >{$acl_m_pct}{${randint:100}}}
set acl_c0 = ${eval:$acl_c0+40}
set acl_c1 = QDMARC(40) suspicious message according DMARC policy; $acl_c1
...
Первое правило получает процентный модицифактор из DNS для домена-отправителя, убирая возможно присутствующий разделитель ; и добавляет к письму заголовок с краткой расшифровкой данных DMARC. Второе в случае отсутствия значения у поля pct= устанавливает вероятность применения политики в 100%. Третье на основании полученного процента отклоняет сообщения при использовании отправителем политики reject с указанной вероятностью. Четвёртое в случае если в ходе применения политики rejeсt письмо не было отклонено устанавливает вероятность применения политики quarantine в 100%. И, наконец, пятое применяет политику quarantine с данным процентом сообщений путём увеличения специального счётчика-признака принадлежности письму к спаму используемому в этой конфигурации Exim.
Подробнее об опциях модуля DMARC в Exim смотрите в файле документации experimental-spec.txt.