Как настроить DKIM, SPF и DMARC
Настройка DKIM
Напишу своими словами как я понимаю работу dkim. С помощью dkim вся исходящая почта сервера подписывается электронной цифровой подписью, связанной с именем домена. Открытый ключ шифрования с помощью DNS публикуется в txt записи. Таким образом, удаленный сервер, при получении письма от вас, сравнивает цифровую подпись с опубликованным в dns открытым ключом вашего домена. Если все в порядке, то считает, что ваше письмо в самом деле пришло от вас, а не от мошенников. То есть с помощью этой технологии можно однозначно идентифицировать отправителя.
Не путать эту технологию с защитой от спама. Защиты тут нет. Любой спамер так же может себе сделать dkim подпись. Спамеру не составит большого труда настроить на своем сервере dkim и отправлять спам, но подписанный электронной цифровой подписью. Теоретически, dkim помогает защититься от подделки адреса отправителя, когда письмо якобы от вас шлет совсем другой сервер. Но с этим можно бороться и другими способами. В общем, я до конца не понимаю, зачем это надо. Я много лет эксплуатировал сервера без dkim подписей и проблем это не вызывало. Но так как настроить dkim не сложно, сейчас всегда это делаю.
Установка dkim на Centos 8 на момент написания статьи имеет некоторые сложности. Дело в том, что этого пакета до сих пор нет в стабильной версии репозитория Epel, где он обычно был для предыдущих версию. Хорошая новость в том, что он уже есть в тестовой ветке. Если будете настраивать по статье, то сначала попробуйте просто установить пакет через dnf из обычного репозитория epel. Если его там не будет, то ставьте из тестовой ветки, как я.
Для настройки dkim устанавливаем соответствующий пакет:
# dnf install opendkim
Создаем директорию для хранения ключей:
# mkdir -p /etc/postfix/dkim && cd /etc/postfix/dkim
Генерируем ключи для домена:
# opendkim-genkey -D /etc/postfix/dkim/ -d infoit.com.ua -s mail
infoit.com.ua | имя почтового домена |
непосредственно имя сервера |
На выходе получаете пару файлов — закрытый (приватный) и открытый ключ. Закрытый останется на сервере, открытый будет опубликован в dns. Переименуем их сразу, чтобы не путаться, если у вас будет несколько доменов. Ключи нужно будет делать для каждого домена.
# mv mail.private mail.infoit.com.ua.private # mv mail.txt mail.infoit.com.ua.txt
Создаем файл с таблицей ключей, в которой будут описаны все домены. В данном случае только один.
# mcedit keytable
mail._domainkey.infoit.com.ua infoit.com.ua:mail:/etc/postfix/dkim/mail.infoit.com.ua.private
Тут же создаем еще один файл, в котором будет описано, каким ключом подписывать письма каждого домена. У нас один домен, поэтому только одна запись.
# mcedit signingtable
*@infoit.com.ua mail._domainkey.infoit.com.ua
Выставляем права доступа на все файлы:
# chown root:opendkim * # chmod u=rw,g=r,o= *
Рисуем конфиг службы.
# mcedit /etc/opendkim.conf
AutoRestart Yes AutoRestartRate 10/1h PidFile /var/run/opendkim/opendkim.pid Mode sv Syslog yes SyslogSuccess yes LogWhy yes UserID opendkim:opendkim Socket inet:8891@localhost Umask 022 Canonicalization relaxed/relaxed Selector default MinimumKeyBits 1024 KeyFile /etc/postfix/dkim/mail.infoit.com.ua.private KeyTable /etc/postfix/dkim/keytable SigningTable refile:/etc/postfix/dkim/signingtable
Добавляем в конфигурационный файл postfix в самый конец следующие параметры:
# mcedit /etc/postfix/main.cf
smtpd_milters = inet:127.0.0.1:8891 non_smtpd_milters = $smtpd_milters milter_default_action = accept milter_protocol = 2
Перезапускаем postfix и dkim, последний добавляем в автозагрузку.
# systemctl restart postfix # systemctl restart opendkim.service # systemctl enable opendkim.service
Теперь нам надо добавить открытый ключ в dns. Идем в консоль управления dns и добавляем новую txt запись. Ее содержание берем из файла /etc/postfix/dkim/mail.infoit.com.ua.txt
# cat /etc/postfix/dkim/mail.infoit.com.ua.txt
mail._domainkey IN TXT ( "v=DKIM1; k=rsa; " "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRrqwnax3Slj2dkrrf3hk1X0pfSOWxPh67KYuz2lEwH/rEQARKs1W9bx/QTV5aQQ/pPEsJiEmVXbPjP8aYpfmSg16FA61SuVJBy2Or+xwVGjLDVkGFm1Lu/lxfViWtPaMR5PH2xTceoQfLkF+93y99KfgzTQ0UjAZcyvcPLuYdqQIDAQAB" ) ; ----- DKIM key mail for infoit.com.ua
Убираем кавычки, лишние проблемы и вставляем. Должно получиться вот так:
Проверяю работу. Отправляю письмо на gmail и смотрю лог почтового сервера:
# cat /var/log/maillog
Feb 11 12:20:38 mail postfix/smtpd[19615]: connect from localhost[127.0.0.1] Feb 11 12:20:38 mail postfix/smtpd[19615]: 4C1A4120F65: client=localhost[127.0.0.1], sasl_method=LOGIN, sasl_username=root@infoit.com.ua Feb 11 12:20:38 mail postfix/cleanup[19623]: 4C1A4120F65: message-id=<9f2b1abb24603b73584b05d89011adf5@infoit.com.ua> Feb 11 12:20:38 mail opendkim[19547]: 4C1A4120F65: DKIM-Signature field added (s=mail, d=infoit.com.ua) Feb 11 12:20:38 mail postfix/qmgr[19542]: 4C1A4120F65: from=<root@infoit.com.ua>, size=685, nrcpt=2 (queue active) Feb 11 12:20:38 mail postfix/pipe[19627]: 4C1A4120F65: to=<all_out@infoit.com.ua>, relay=dovecot, delay=0.23, delays=0.15/0.02/0/0.06, dsn=2.0.0, status=sent (delivered via dovecot service) Feb 11 12:20:38 mail postfix/smtpd[19615]: disconnect from localhost[127.0.0.1] ehlo=1 auth=1 mail=1 rcpt=1 data=1 quit=1 commands=6 Feb 11 12:20:38 mail postfix/smtp[19628]: Untrusted TLS connection established to gmail-smtp-in.l.google.com[64.233.162.26]:25: TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) Feb 11 12:20:39 mail postfix/smtp[19628]: 4C1A4120F65: to=<zeroxzed@gmail.com>, relay=gmail-smtp-in.l.google.com[64.233.162.26]:25, delay=1.5, delays=0.15/0.03/0.38/0.97, dsn=2.0.0, status=sent (250 2.0.0 OK 1581412839 y133si1852705lfc.170 - gsmtp) Feb 11 12:20:39 mail postfix/qmgr[19542]: 4C1A4120F65: removed
Все в порядке, электронная цифровая подпись установлена. Проверим, как гугл отреагировал на нашу подпись:
Тоже все в порядке. Подпись выполнена корректно, проверку прошла. Дополнительно, проверить корректность dkim записи в dns можно онлайн сервисом — http://dkimcore.org/c/keycheck.
Настройка SPF
Настроим еще одно средство для повышения доверия к нашей почте со стороны других серверов — spf. Расскажу опять своими словами для чего это нужно. Spf запись добавляется в виде txt записи в dns вашего домена. С помощью этой записи вы указываете, какие ip адреса имеют право отправлять почту от вашего имени. Если кто-то из спамеров будет использовать ваше имя домена при рассылке спама, он не пройдет проверку по spf и скорее всего будет идентифицирован как спам.
Можно указать конкретные ip адреса в записи, а можно сказать, чтобы ip адреса проверялись по спискам A и MX записей. У нас простой случай и только 1 сервер с одним ip, поэтому укажем конкретно этот ip адрес. Идем в панель управления dns и добавляем новую txt запись.
infoit.com.ua. TXT v=spf1 ip4:5.180.137.106 ~all
Больше ничего делать не надо. Можно снова отправить письмо на gmail и проверить. Обращаю внимание, что на прошлом скрине в gmail уже было указано, что проверка spf прошла, хотя txt запись еще не была создана. Гугл умный. Думаю, он автоматом сопоставил все dns записи домена и сам убедился, что отправка идет с доверенного сервера, к которому привязана A запись и MX запись.
Но отправка может идти не только с почтового сервера. К примеру, может быть отдельно web сервер с интернет магазином. Он по каким-то причинам может отправлять почту сам (нет модуля для smtp отправки, не работает smtp авторизация, разработчики хотят использовать php_mail и т.д.), а не через настроенный почтовый сервер. Так часто бывает. Тогда нужно обязательно добавить в spf запись ip адрес этого web сервера, с которого будет идти отправка.
Настройка DMARC
Для настройки DMARC на самом почтовом сервере ничего делать не надо. По своей сути это просто указание другим, что делать с письмами от вас, не прошедшими проверки dkim и spf (которые являются подделками, если у вас все настроено правильно). Для этого сам принимающий почтовый сервер должен поддерживать работу в соответствии с dmark. Плюс, для вашего домена должны быть настроены правила, что делать в том или ином случае.
Есть три типа действий, которые можно настроить с помощью dmark:
- Отклонить письмо.
- Пометить письмо как спам.
- Ничего не делать.
При этом можно настроить при каждом действии формирование отчета и отправку его на какой-то email адрес. Я очень осторожно отношусь к этим правилам и никогда не настраиваю блокировку или пометку о спаме. Так можно выстрелить себе в ногу и загубить всю свою почту из-за какой-нибудь ошибки. Мне кажется разумнее всего настроить пропускание всех писем, но сделать отправку отчетов на свой существующий адрес. Если вы заметите какую-то подозрительную активность по отчетам, то можно будет временно изменить настройки, чтобы помечать все поддельные письма, к примеру, как спам.
Указанные правила мы сейчас и добавим с помощью txt записи в DNS. Запись будет такая:
v=DMARC1; p=none; rua=mailto:dmarc@infoit.com.ua
Отчеты будут приходить в xml формате. Нужно будет еще потрудиться, чтобы в них разобраться 🙂 В общем случае, я вообще не слежу за dmark. Думаю, это актуально только для крупных компаний, где есть отдельные люди, которые занимаются обслуживанием почты.
Информация взята с сайта — САЙТ