Тема особенностей использования 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.


Buy Bitcoin at CEX.IO