В последние несколько лет в Интернет идёт активное внедрение технологии DMARC в качестве инструмента для эффективной борьбы со спамом.
Если не вдаваться в технические детали, с которыми лучше ознакомиться на специализированных ресурсах, к примеру dmarc.org или из статей на Habrahabr, то суть DMARC состоит в возможности, во-первых, основываясь на результатах проверки SPF и DKIM сообщить серверу-получателю о действиях, которые следует предпринять в случае обнаружения проблем при их проверке, а, во-вторых, получить статистику и оперативные отчёт об источниках отправки сообщений для данного домена.
Исходя из вышеизложенного, задача внедрения поддержки DMARC на конкретном почтовом сервере состоит в обеспечении реализации политики домена-отправителя на локальном уровне и отправки аналитических отчётов в качестве вклада в глобальный процесс борьбы со спамом.
Рассмотрим настройку DMARC для системы FreeBSD с установленным SMTP-сервером Exim.
Для включения поддержки DMARC и соответствующих опций для конфигурирования Exim должен быть собран с поддержкой опции Experimental_DMARC, а также DKIM и Experimental_SPF без которых использование DMARC невозможно.
При этом автоматически будет установлен необходимый для обеспечения функционала пакет OpenDMARC.
Для начала следует произвести базовую настройку конфигурации OpenDMARC. Она досточна проста и не требует серьёзных правок при использовании образца конфигурационного файла их документации.
Четырёх данных опций будет вполне достаточно для обеспечения работы DMARC в системе:
Создадим сразу же вышеупомянутый файл для статистики.
Далее внесём изменения в конфигурацию Exim. В секцию начальных значений переменных до begin acl следует добавить блок:
Две последние опции выполняют ту же роль, что и в конфигурационном файле OpenDMARC. Первая же — dmarc_tld_file определяет актуальную базу данных публичных суффиксов доменных имён от Mozilla foundation. Не откладывая дело в долгий ящик скачаем его локальную копию.
Хорошей идеей будет и поддержание его в актуальном состоянии при помощи CRON.
Ввиду того, что настройки конфигурации Exim могут разниться от потребностей того или иного сервера, остановимся на общих рекомендациях по использовнию DMARC (см. также секцию «DMARC support» в официальной документации).
Во-первых, рекомендую пройтись по конфигурации и отключить проверки DMARC для доверенных хостов (если они специально не требуют такого обслуживания) из списка +relayfromhosts в соответствующем правиле ACL командой:
Для всех прочих разумно будет предоставить поддержку возможностей DMARC и, более того, включить оперативное информирование по запросам правилом:
Примение заданной доменом-отправителем политики DMARC разумно начинать в секции acl_smtp_data сразу после принятия почты от аутентифицированных пользователей и доверенных хостов. В простейшем случае мы будем отказывать в получении письма для заданной политики reject и добавлять баллов в счётчик, являющийся критерием спама для политики quarantine. Однако, при желании можно реализовать и более тонкую поддержку используя необязательные поля записи DMARC, например pct.
Настройка Exim на этом окончена и можно перезапустить его, применив сделанные настройки.
Поддержка реализации политики DMARC домена-отправителя на нашем сервере реализована. Кроме того сервер будет мгновенно при отказе в приёме письма извещать систему отчётности владельца домена о возникшей ситуации путём отправки Forensic report. Ниже приведу пример такого письма-отчёта:
Теперь настало время реализовать периодическую рассылку отчётов DMARC.
Для этого потребует, во-первых, создать базу данных отправителей и получателей отчётов, а, во-вторых, реализовать их рассылку.
На данной системе для ряда служб связанных, в том числе, и с поддержкой работы почтовых сервисов, используется сервер баз данных MySQL, поэтому воспользуемся им для хранения базы данных OpenDMARC.
Теперь создадим скрипт для обновления базы данными из временного файла с собираемой Exim статистикой.
В нём используются три утилиты из пакета OpenDMARC. Первая opendmarc-import импортирует данные из временного файла статистики, вторая opendmarc-reports генерирует отчёты за заданный интервал не чаще чем один раз в 24 часа для одного домена, а третья opendmarc-expire удаляет устаревшие записи в базе срок жизни которых превышает 30 дней. После импорта файл статистики очищается.
Добавим созданный скрипт в CRON с периодичностью выполнения один раз в 6 часов.
Собственно, на этом настройки полностью закончены, равно как и завершён наш переход на сторону добра в активной борьбе со спамом.
Если не вдаваться в технические детали, с которыми лучше ознакомиться на специализированных ресурсах, к примеру 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 +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@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
Собственно, на этом настройки полностью закончены, равно как и завершён наш переход на сторону добра в активной борьбе со спамом.
Поделиться с друзьями