Содержание статьи
Сразу скажу – это не спасет Вас от спама как получателя, но поможет отправлять свои письма чисто, красиво и с подтверждением Вашей подлинности.
Введение
Сначала расшифрую эти термины.
SPF – Sender Policy Framework, инфраструктура политики отправителя. Позволяет подтвердить подлинность домена отправителя. Владелец домена с помощью TXT записи определяет какие сервера могут отправлять почту от имени этого самого домена. Получатели проверяют сервер отправителя с помощью обычного DNS запроса и на основании полученной информации могут либо принимать либо отклонять письма.
DKIM — DomainKeys Identified Mail. Защита домена отправителя при помощи ключей. Потребуется создать публичный и приватный ключи. Приватный ключ зашифрует подпись к заголовкам письма, а публичный ключ нужно будет добавить в DNS при помощи txt записи. Когда Ваше письмо приходит на сервер адресата, он обращается к DNS записям Вашего домена, берет публичный ключ и расшифровывает подпись в письме. Тем самым подтверждается подлинность письма и принадлежность к Вашему домену. На текущий момент большинство почтовых серверов будут отклонять или помечать как спам письма без правильно настроенного DKIM.
DMARC — Domain-based Message Authentication, Reporting and Conformance. Это набор правил для писем от Вашего домена, которые не прошли проверку по SPF и DKIM. Обязательное условие перед установкой DMARC – правильно настроенные SPF и DKIM.
BIMI — Brand Indicators for Message Identification (вишенка на торте), это опция, которая позволяет отображать логотип Вашего бренда в виде иконки в списке писем, если письмо прошло все проверки – SPF, DKIM и DMARC.
Вводные данные:
- Ubuntu 20.04
- Postfix 3.4.13
- Для проверки я пользуюсь сервисом mxtoolbox.com
SPF
В интерфейсе управления DNS записями домена нужно создать новую запись типа TXT:
1 |
v=spf1 a mx ip4:141.8.193.61 ~all |
Примерно это выглядит так:
- TXT – индикатор что это запись типа TXT
- В поле Name вписывается Ваш домен, или символ @ — для указания корневого домена. Если указываете домен – смотрите как именно его нужно писать – у разных хостеров разные требования. К примеру Cloudflare – просто домен (gurin.ru), а sprinthost – домен с точкой на конце (gurin.ru.)
- v=spf1 – индикатор что это запись SPF и версия используется SPF1
- a – означает, что хосту, указанному в записи типа A разрешено отправлять письма от имени домена
- mx – означает, что всем хостам, перечисленным в записях MX,разрешено отправлять письма от имени домена
- ip4:141.8.193.61 – означает, что указанному IP адресу (или диапазону), разрешено отправлять письма от имени домена
- ~all – означает, что электронные письма от Вашего домена должны приходить только с хостов, указанных в записи SPF. Электронные письма от других хостов будут помечены как ненадежные.
Сохраняем и проверяем. Два варианта – браузером через сервис mxtoolbox и просто dig из консоли на самой ubuntu.
DKIM
Тут будет поинтереснее. Устанавливаем OpenDKIM и инструменты
1 |
apt install opendkim opendkim-tools |
Добавим юзера postfix в группу opendkim
1 |
gpasswd -a postfix opendkim |
Настройка DKIM
Теперь открываем конфиг OpenDKIM
1 |
nano /etc/opendkim.conf |
Нужно убрать символ комментария со следующих строк
1 2 3 |
Canonicalization simple Mode sv SubDomains no |
Значение simple заменить на relaxed/simple и добавить следующие строки сразу после SubDomains no
1 2 3 4 5 |
AutoRestart yes AutoRestartRate 10/1M Background yes DNSTimeout 5 SignatureAlgorithm rsa-sha256 |
Теперь в самом конце файла, после строки UserID opendkim добавляем вот эти строки
1 2 3 4 5 6 7 |
# путь к файлам ключей для подписи сообщений и таблице доменов KeyTable refile:/etc/opendkim/key.table SigningTable refile:/etc/opendkim/signing.table # Список хостов, которые могут отправлять почту через сервер в качестве одного из подписывающих доменов без учетных данных ExternalIgnoreList /etc/opendkim/trusted.hosts # Список хостов, почта которых должна быть подписана, а не проверена InternalHosts /etc/opendkim/trusted.hosts |
У меня не будет внешних хостов, только сам почтовик, поэтому путь у этих двух параметров одинаковый. Вот так это выглядит:
Сохраняем и закрываем. Идем дальше. Создадим структуру папок.
Структура папок и файлов DKIM
1 2 |
mkdir -p /etc/opendkim mkdir -p /etc/opendkim/keys |
Меняем владельца папки и делаем папку ключей доступной на чтение и запись только пользователю okendkim
1 2 |
chown -R opendkim:opendkim /etc/opendkim chmod go-rw /etc/opendkim/keys |
Создадим файл signing.table
1 |
nano /etc/opendkim/signing.table |
Добавляем в этот файл строчку
1 |
*@gurin.ru default._domainkey.gurin.ru |
Это означает, что DKIM должен подписать сообщения с этого сервера, которые используют в адресе @gurin.ru, и подписывать нужно закрытым ключом default._domainkey.gurin.ru
Если необходимо подписывать почту не только основного домена, но и поддоменов – строчка должна выглядеть так:
1 |
*@*.gurin.ru default._domainkey.gurin.ru |
Сохраняем и закрываем. Теперь создадим файл key.table
1 |
nano /etc/opendkim/key.table |
Добавляем строку, в которой указан путь до закрытого ключа:
1 |
default._domainkey.gurin.ru gurin.ru:default:/etc/opendkim/keys/gurin.ru/default.private |
Сохраняем и закрываем. Теперь создадим файл trusted.hosts
1 |
nano /etc/opendkim/trusted.hosts |
Добавляем следующие строчки в этот файл.
1 2 3 |
127.0.0.1 localhost *.gurin.ru |
Это означает, что если письмо пришло с локалхоста или из этого же домена – DKIM должен подписать эти письма, а не проверять. Сохраняем и закрываем.
Ключи DKIM
Создаем пару ключей – публичный и закрытый. Для подписи исходящих сообщений будет использоваться закрытый ключ, а для проверки входящих – публичный ключ. Публичный ключ будет прописан в TXT запись для домена.
Создадим папку для домена:
1 |
mkdir -p /etc/opendkim/keys/gurin.ru |
Генерируем ключ, используя opendkim-genkey
1 |
opendkim-genkey -b 2048 -d gurin.ru -D /etc/opendkim/keys/gurin.ru -s default -v |
Этак команда создаст 2048 битный ключ. -d (domain) – указывает для какого домена. -D (path) указывает в какую директорию сохранить ключи. -s default – с каким именем сохранить файлы ключей. После выполнения команды в нашей папке будет два файла: default.private – закрытый ключ и default.txt – публичный ключ.
Теперь сменим владельца закрытого ключа на opendkim:
1 |
chown opendkim:opendkim /etc/opendkim/keys/gurin.ru/default.private |
И сменим права на файл, что бы читать и писать его мог только opendkim пользователь.
1 |
chmod 600 /etc/opendkim/keys/gurin.ru/default.private |
Теперь нужно опубликовать публичный ключ как запись TXT в DNS
1 |
cat /etc/opendkim/keys/gurin.ru/default.txt |
Все что расположено после p= и есть наш публичный ключ. Нужно скопировать его и вставить в поле значение (value) текстовой записи. Добавляем запись типа TXT, в поле имя (name) нужно указать default._domainkey , а в поле значение (value) нужно вставить
1 |
v=DKIM1; k=rsa; p=….. |
Обязательно нужно удалить все кавычки и пробелы из ключа, иначе будет ошибка.
Проверяем ключ следующей командой:
1 |
opendkim-testkey -d gurin.ru -s default -vvv |
Если все правильно – будет примерно такая картина
1 2 3 4 |
opendkim-testkey: using default configfile /etc/opendkim.conf opendkim-testkey: checking key 'default._domainkey.gurin.ru' opendkim-testkey: key secure opendkim-testkey: key OK |
Главное тут для нас – Key OK. Если Вы используете cloudflare, то в третьей троке у Вас будет key not secure – пусть Вас это не пугает, это нормально.
И проверим через mxtoolbox, должно быть примерно так:
Postfix и OpenDKIM
Postfix может общаться с OpenDKIM посредством Unix-socket файла. По умолчанию OpenDKIM использует сокет файл /var/run/opendkim/opendkim.sock
указанный в конфиге /etc/opendkim.conf
. Но SMTP демон Postfix в Ubuntu работает в режиме chroot, и поэтому демон SMTP определяет все пути к файлам относительно директории очереди Postfix — /var/spool/postfix
. Поэтому нужно создать новый сокет файл и поменять в конфиге пути. Создаем папку и меняем владельца – user будет opendkim, group – postfix:
1 2 |
mkdir -p /var/spool/postfix/opendkim chown opendkim:postfix /var/spool/postfix/opendkim |
Теперь меняем путь в конфиг файле
1 |
nano /etc/opendkim.conf |
Нужно найти строку
1 |
Socket local:/run/opendkim/opendkim.sock |
И заменить на
1 |
Socket local:/var/spool/postfix/opendkim/opendkim.sock |
Сохраняем и закрывам. Следующий файл:
1 |
nano /etc/default/opendkim |
Находим строку
1 |
SOCKET=local:$RUNDIR/opendkim.sock |
И меняем ее на:
1 |
SOCKET="local:/var/spool/postfix/opendkim/opendkim.sock" |
Сохраняем и закрываем.
Настройка Postfix:
1 |
nano /etc/postfix/main.cf |
Добавляем следующие строки, что бы Postfix мог вызывать OpenDKIM посредством протокола milter:
1 2 3 4 5 6 |
# DKIM # ----------------------- milter_protocol = 6 milter_default_action = accept smtpd_milters = local:opendkim/opendkim.sock non_smtpd_milters = $smtpd_milters |
Сохраняем и закрываем. Перезапускаем OpenDKIM и Postfix и проверяем.
1 |
systemctl restart opendkim postfix |
Проверка DKIM
Для проверки можно отправить письмо с нашего почтового сервера на аккаунт Gmail и посмотреть служебные заголовки. В полученном письме в интерфейсе Gmail открываем меню и нажимаем «показать оригинал»
DMARC
DMARC можно настраивать только после того, как убедились, что SPF и DKIM правильно настроены и работают. Для начала необходимо проверить, что три поля в заголовках указывают на один и тот же домен – домен отправителя. Поля такие: Return-Path, d=domain в подписи DKIM и FROM
Если все совпадает – создаем запись типа TXT для нашего домена. В поле name пишем _dmarc
в значение пишем:
1 |
v=DMARC1; p=none; pct=100; rua=mailto:support@gurin.ru |
- v=DMARC1 – версия протокола DMARC1
- p=none – политика действия для нашего домена
- pct=100 – сколько процентов писем обрабатывать
- rua=mailto: – адрес, на который будут приходить отчеты о срабатывании
Политику действий можно выбрать одну из трех:
- none – сообщает почтовым серверам, что они не должны выполнять ничего особенного если проверка DMARC не прошла
- quarantine – сообщает серверу получателю, что необходимо поместить письмо в карантин, если проверка DMARC не прошла
- reject – сообщает серверу получателю, что необходимо отклонить письмо, если проверка DMARC не прошла.
Я не буду в этот раз описывать подробности работы DMARC – лучше опишу в отдельной статье. Хочу лишь заметить, что если планируется использовать BIMI – то политика действий не может быть none, только quarantine или reject.
Проверить правильность записи DMARC можно тоже через mxtoolbox или через консоль с помощью dig.
1 |
dig txt +short _dmarc.gurin.ru |
BIMI
Этой вишенки нет у большинства доменов в интернете. Долго искал для примера среди известных, и только у paypal нашел полностью настроенный. На нем и покажу.
Итак, для начала нужно создать логотип, который хочется отображать в качестве иконки письма. Требования к логотипу:
- SVG файл, параметр baseProfile должен быть установлен tiny-ps
- Параметр version должен быть установлен 1.2
- Элемент title должен отражать название компании, но четких требований к нему нет
Создаем SVG файл, выкладываем его в директорию, доступную для всего интернета и добавляем запись типа TXT в DNS.
1 |
v=BIMI1; l=https://www.paypalobjects.com/marketing/web/logos/paypal.svg; a=https://www.paypalobjects.com/marketing/web/logos/paypal_com.pem |
- v=BIMI1 – версия протокола
- l= путь к файлу логотипа
- a= путь к файлу сертификату
Вот с сертификатом все не просто. На текущий момент его можно получить только в двух сертификационных центрах:
Нужно получить, так называемый, VMC сертификат, почитать можно тут — DigiCert Verified Mark Certificates (VMC) for BIMI
После всех этих манипуляций Вашим письмам можно будет доверять и они будут выглядеть гораздо симпатичней других отправителей. К примеру как письма от paypal
Заключение
Чуть позже расскажу, как можно отслеживать кто пытается отправлять почту от имени Вашего домена, как это анализировать и что с этим делать (DMARC).
Статья получилась большой, все размышлял делить ее на части или нет. Решил оставить так, добавив оглавление.