В последние несколько лет в Интернет идёт активное внедрение технологии DMARC в качестве инструмента для эффективной борьбы со спамом.

Если не вдаваться в технические детали, с которыми лучше ознакомиться на специализированных ресурсах, к примеру https://dmarc.org, то суть DMARC состоит в возможности, во-первых, основываясь на результатах проверки SPF и DKIM сообщить серверу-получателю о действиях, которые следует предпринять в случае обнаружения проблем при их проверке, а, во-вторых, получить статистику и оперативные отчёт об источниках отправки сообщений для данного домена.

Исходя из вышеизложенного, задача внедрения поддержки DMARC на конкретном почтовом сервере состоит в обеспечении реализации политики домена-отправителя на локальном уровне и отправки аналитических отчётов в качестве вклада в глобальный процесс борьбы со спамом.

Рассмотрим настройку DMARC для системы FreeBSD с установленным SMTP-сервером Exim.

root@beta:~ # uname -v
FreeBSD 10.3-RELEASE-p3 #0: Tue May 17 08:43:55 UTC 2016     root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC
root@beta:~ # pkg info | grep exim
exim-4.87                      High performance MTA for Unix systems on the Internet

1. Конфигурирование OpenDMARC

Для включения поддержки DMARC и соответствующих опций для конфигурирования Exim должен быть собран с поддержкой опции Experimental_DMARC, а также DKIM и Experimental_SPF без которых использование DMARC невозможно.

root@beta:~ # exim --version
Exim version 4.87 #0 (FreeBSD 10.3) built 21-Apr-2016 19:02:37
Copyright (c) University of Cambridge, 1995 - 2016
(c) The Exim Maintainers and contributors in ACKNOWLEDGMENTS file, 2007 - 2016
Probably Berkeley DB version 1.8x (native mode)
Support for: crypteq iconv() use_setclassresources PAM Perl Expand_dlfunc TCPwrappers OpenSSL Content_Scanning Old_Demime DKIM DNSSEC I18N PRDR Experimental_SPF Experimental_DCC Experimental_DMARC
Lookups (built-in): lsearch wildlsearch nwildlsearch iplsearch cdb dbm dbmjz dbmnz dnsdb dsearch mysql nis nis0 passwd
Authenticators: cram_md5 dovecot plaintext spa
Routers: accept dnslookup ipliteral manualroute queryprogram redirect
Transports: appendfile/maildir/mailstore/mbx autoreply lmtp pipe smtp
Fixed never_users: 0
Size of off_t: 8
Configuration file is /usr/local/etc/exim/configure

При этом автоматически будет установлен необходимый для обеспечения функционала пакет OpenDMARC.

root@beta:~ # pkg info | grep dmarc
opendmarc-1.3.1_3              DMARC library and milter implementation

Для начала следует произвести базовую настройку конфигурации OpenDMARC. Она досточна проста и не требует серьёзных правок при использовании образца конфигурационного файла их документации.

root@beta:~ # cd /usr/local/etc/mail/
root@beta:/usr/local/etc/mail # cp opendmarc.conf.sample opendmarc.conf
root@beta:/usr/local/etc/mail # cat opendmarc.conf | egrep -v '^#|^$'
AuthservID my.server
ForensicReports true
ForensicReportsSentBy noreply@my.server
HistoryFile /usr/local/etc/exim/dmarc.dat

Четырёх данных опций будет вполне достаточно для обеспечения работы DMARC в системе:

  • AuthservID определяет имя сервера от имени которого будут отправляться отчёты - рекомендуется указать основное имя хоста, под которым он фигурирует в A-записи DNS;
  • ForensicReports включает отправку немедленных отчётов о проблемах если они затребованы политикой домена-отправителя;
  • ForensicReportsSentBy задаёт адрес отправителя отчётов - в данном случае несуществующий локально адрес с тем, чтобы не получать сообщения об ошибках доставки для ошибочно сконфигурированных записей DMARC;
  • HistoryFile, наконец, определяет место размещения временного файла для сбора статистики для формирования отчётов.

Создадим сразу же вышеупомянутый файл для статистики.

root@beta:/usr/local/etc/mail # cd ../exim
root@beta:/usr/local/etc/exim # touch dmarc.dat
root@beta:/usr/local/etc/exim # chmod 666 dmarc.dat
root@beta:/usr/local/etc/exim # ll dmarc.dat
-rw-rw-rw-  1 root  wheel  0 24 май 22:47 dmarc.dat

2. Настройка Exim для поддержки DMARC

Далее внесём изменения в конфигурацию Exim. В секцию начальных значений переменных до begin acl следует добавить блок:

root@beta:/usr/local/etc/exim # cat configure | grep dmarc
dmarc_tld_file          = /usr/local/etc/exim/public_suffix_list.dat
dmarc_history_file      = /usr/local/etc/exim/dmarc.dat
dmarc_forensic_sender   = noreply@my.server

Две последние опции выполняют ту же роль, что и в конфигурационном файле OpenDMARC. Первая же - dmarc_tld_file определяет актуальную базу данных публичных суффиксов доменных имён от Mozilla foundation. Не откладывая дело в долгий ящик скачаем его локальную копию.

root@beta:/usr/local/etc/exim # fetch https://publicsuffix.org/list/public_suffix_list.dat
public_suffix_list.dat                        100% of  179 kB  227 kBps 00m01s
root@beta:/usr/local/etc/exim # ll public_suffix_list.dat
-rw-r--r--  1 root  wheel  183718 24 май 18:52 public_suffix_list.dat

Хорошей идеей будет и поддержание его в актуальном состоянии при помощи CRON.

root@beta:/usr/local/etc/exim # cat /etc/crontab | grep publicsuffix
0       3       *       *       1       root    fetch -q https://publicsuffix.org/list/public_suffix_list.dat -o /usr/local/etc/exim && service exim reload

Ввиду того, что настройки конфигурации Exim могут разниться от потребностей того или иного сервера, остановимся на общих рекомендациях по использовнию DMARC (см. также секцию "DMARC support" в официальной документации https://github.com/Exim/exim/blob/master/doc/doc-txt/experimental-spec.txt).

Во-первых, рекомендую пройтись по конфигурации и отключить проверки DMARC для доверенных хостов (если они специально не требуют такого обслуживания) из списка +relayfromhosts в соответствующем правиле ACL командой

         control        = dmarc_disable_verify

Для всех прочих разумно будет предоставить поддержку возможностей DMARC и, более того, включить оперативное информирование по запросам правилом

  warn   control        = dmarc_enable_forensic

Примение заданной доменом-отправителем политики DMARC следует начинать в секции acl_smtp_data сразу после принятия почты от аутентифицированных пользователей и доверенных хостов. В простейшем случае мы будем отказывать в получении письма для заданной политики reject и добавлять баллов в счётчик, являющийся критерием спама для политики quarantine. Однако, при желании можно реализовать и более тонкую поддержку используя необязательные поля записи DMARC, например pct.

  accept authenticated  = *

  accept hosts          = +relay_from_hosts

  # --- check sender's DMARC policy
  warn   dmarc_status   = *
         add_header     = $dmarc_ar_header

  deny   dmarc_status   = reject
         message        = Rejected by sender's DMARC policy

  warn   dmarc_status   = quarantine
         set acl_c0     = ${eval:$acl_c0+40}
         set acl_c1     = QDMARC(40) suspicious message according DMARC policy; $acl_c1

Настройка Exim на этом окончена и можно перезапустить его, применив сделанные настройки.

root@beta:/usr/local/etc/exim # service exim restart
Stopping exim.
Waiting for PIDS: 78683.
Starting exim.

Поддержка реализации политики DMARC домена-отправителя на нашем сервере реализована. Кроме того сервер будет мгновенно при отказе в приёме письма извещать систему отчётности владельца домена о возникшей ситуации путём отправки Forensic report. Ниже приведу пример такого письма-отчёта:

Return-path: <>
Envelope-to: d@ruf.agari.com
Delivery-date: Wed, 18 May 2016 19:25:30 +0200
Received: from mailnull by my.server with local (Exim 4.87 (FreeBSD))
    id 1b35Du-0000Te-QK
    for d@ruf.agari.com; Wed, 18 May 2016 19:25:30 +0200
Auto-Submitted: auto-replied
From: noreply@my.server
To: d@ruf.agari.com
Subject: DMARC Forensic Report for mail.ru from IP 190.223.42.106
Message-Id: <E1b35Du-0000Te-QK@my.server>
Date: Wed, 18 May 2016 19:25:30 +0200

A message claiming to be from you has failed the published DMARC
policy for your domain.

  Sender Domain: mail.ru
  Sender IP Address: 190.223.42.106
  Received Date: Wed, 18 May 2016 19:25:30 +0200
  SPF Alignment: no
  DKIM Alignment: no
  DMARC Results: Reject

------ This is a copy of the headers that were received before the error
       was detected.

Received: from [190.223.42.106]
    by my.server with esmtp (Exim 4.87 (FreeBSD))
    (envelope-from <outletqn@mail.ru>)
    id 1b35Du-0000TE-Eb
    for sales@my.server; Wed, 18 May 2016 19:25:30 +0200
Received: from [163.116.8.100] (account frontenace19@inbox.ru HELO exbtaaovmshlgq.peejojgxxotd.tv)
    by  (CommuniGate Pro SMTP 5.2.3)
    with ESMTPA id 745786287 for sales@my.server; Wed, 18 May 2016 12:17:49 -0500
Date:    Wed, 18 May 2016 12:17:49 -0500
From:    =?koi8-r?B?48XO1NIg4dfUz83B1MnawcPJyQ==?= <outletqn@mail.ru>
X-Mailer: The Bat! (v2.12.00) Educational
X-Priority: 3 (Normal)
Message-ID: <2803497135.OXX007B0034066@xnfwvhhklng.fffnarj.va>
To: <sales@my.server>
Subject: =?koi8-r?B?8M8g0M/Xz8TVIMvPztTSz8zRIMvB3sXT1NfBINDSz8TVy8PJyQ==?=
MIME-Version: 1.0
Content-Type: text/plain;
  charset=koi8-r
Content-Transfer-Encoding: 8bit
Received-SPF: softfail (my.server: transitioning domain of mail.ru does not designate 190.223.42.106 as permitted sender) client-ip=190.223.42.106; envelope-from=outletqn@mail.ru; helo=[190.223.42.106];

3. Настройка рассылки отчётов DMARC

Теперь настало время реализовать периодическую рассылку отчётов DMARC.

Для этого потребует, во-первых, создать базу данных отправителей и получателей отчётов, а, во-вторых, реализовать их рассылку.

На данной системе для ряда служб связанных, в том числе, и с поддержкой работы почтовых сервисов, используется сервер баз данных MySQL, поэтому воспользуемся им для хранения базы данных OpenDMARC.

root@beta:/usr/local/etc/exim # cd /usr/local/share/doc/opendmarc/
root@beta:/usr/local/share/doc/opendmarc # mysql -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 29062
Server version: 5.6.30 Source distribution

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> CREATE DATABASE opendmarc;
mysql> GRANT ALL PRIVILEGES ON opendmarc.* TO opendmarc IDENTIFIED BY 'opendmarc';
mysql> quit;
root@beta:/usr/local/share/doc/opendmarc # root@beta:/usr/local/share/doc/opendmarc # mysql -h localhost -u opendmarc -p opendmarc < schema.mysql

Теперь создадим скрипт для обновления базы данными из временного файла с собираемой Exim статистикой.

root@beta:/usr/local/share/doc/opendmarc # cd /usr/local/etc/exim
root@beta:/usr/local/etc/exim # touch dmarc-cron.sh
root@beta:/usr/local/etc/exim # chmod 755 dmarc-cron.sh
root@beta:/usr/local/etc/exim # ll dmarc-cron.sh
-rwxr-xr-x  1 root  wheel  735 24 май 22:48 dmarc-cron.sh*
root@beta:/usr/local/etc/exim # cat dmarc-cron.sh
#!/bin/sh

# Update DMARC database and send reports
# (c)2014 by Max Kostikov http://kostikov.co e-mail: max@kostikov.co
#
# cat /etc/crontab | grep dmarc
# 0 */6 * * * root /usr/local/etc/exim/dmarc-cron.sh >/dev/null 2>&1

LOG="/usr/local/etc/exim/dmarc.dat"
HOST="localhost"
PORT="3306"
USER="opendmarc"
PASS="opendmarc"
DB="opendmarc"

opendmarc-import --dbhost=$HOST --dbport=$PORT --dbname=$DB --dbuser=$USER --dbpasswd=$PASS --verbose < $LOG

cat /dev/null > $LOG

opendmarc-reports --dbhost=$HOST --dbport=$PORT --dbname=$DB --dbuser=$USER --dbpasswd=$PASS --interval=86400 --verbose --report-email 'noreply@my.server'

opendmarc-expire --dbhost=$HOST --dbport=$PORT --dbname=$DB --dbuser=$USER --dbpasswd=$PASS --verbose --expire=30

В нём используются три утилиты из пакета OpenDMARC. Первая opendmarc-import импортирует данные из временного файла статистики, вторая opendmarc-reports генерирует отчёты за заданный интервал не чаще чем один раз в 24 часа для одного домена, а третья opendmarc-expire удаляет устаревшие записи в базе срок жизни которых превышает 30 дней. После импорта файл статистики очищается.

Добавим созданный скрипт в CRON с периодичностью выполнения один раз в 6 часов.

root@beta:/usr/local/etc/exim # cat /etc/crontab | grep dmarc
0       */6     *       *       *       root    /usr/local/etc/exim/dmarc-cron.sh >/dev/null 2>&1

Собственно, на этом настройки полностью закончены.

4. PROFIT!

Статья была полезной? Тогда прошу не стесняться и деньгами или биткоинами.


Buy Bitcoin at CEX.IO