В последние несколько лет в Интернет идёт активное внедрение технологии DMARC в качестве инструмента для эффективной борьбы со спамом.
Если не вдаваться в технические детали, с которыми лучше ознакомиться на специализированных ресурсах, к примеру dmarc.org или из статей на Habrahabr, то суть 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» в официальной документации).
Во-первых, рекомендую пройтись по конфигурации и отключить проверки 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 +0200A 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@peek.ru>
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
Собственно, на этом настройки полностью закончены, равно как и завершён наш переход на сторону добра в активной борьбе со спамом.
Автор: mxms