Если попытаться отправить мэйл с только что созданного сервера, то скорее всего он не дойдёт до адресата. Потому что письмо не будет иметь необходимых подписей, которые бы говорили, что оно не является спамом. К числу таких подписей относится DKIM. В статье описывается процесс настройки DKIM подписи.
Всё описание будет верным для CentOS и установленным на неё SendMail.
Буду приводить пример только для настройки подписи исходящей почты. Без проверки входящей. Потому что лучше всего принимать почту в «Яндекс.Почта для доменов» — это безопасно и бесплатно.
В примерах будет указан домен alexgur.ru. Меняйте его на домен, который хотите подписать. Конечно же, сайт должен находится на том сервере, куда ссылается домен.
Установка DKIM
DKIM подпись — это самый сложный по настройке способ придания веса мэйлам. Для сравнения, чтобы настроить SPF надо прописать одну TXT запись к DNS. А для DKIM нужен примерно час возни с сервером. И то при условии, что делаешь такую процедуру каждый день и помнишь всю последовательность действий.
Устанавливаем opendkim:
yum install opendkim
Эта команда загрузит и установит OpenDKIM, который будет подписывать исходящие письма.
Теперь надо сгенерировать private и public ключи для всех доменов, которым необходимо сделать подпись почты. Ключ private хранится на сервере и не доступен для просмотра из вне. Ключ public находится в DNS записи домена и виден всем. Так что принимающий от нас почту сервер всегда может посмотреть эту запись и подтвердить достоверность DKIM подписи на письме.
Создаём папку для ключей, создаём ключи и настраиваем права доступа:
mkdir -p /etc/opendkim/keys/alexgur.ru
/usr/sbin/opendkim-genkey -D /etc/opendkim/keys/alexgur.ru/ -d alexgur.ru -s default
chown -R opendkim:opendkim /etc/opendkim/keys
chown -R opendkim:opendkim /etc/opendkim/keys/alexgur.ru
chmod 640 /etc/opendkim/keys/alexgur.ru/default.private
chmod 644 /etc/opendkim/keys/alexgur.ru/default.txt
Отлично! Ключи созданы. Теперь надо настроить OpenDKIM, чтобы тот подписывал письма. Обратим внимание на четыре файла:
- /etc/opendkim.conf – главный файл конфигурации OpenDKIM
- /etc/opendkim/KeyTable – список ключей, которыми можно подписывать
- /etc/opendkim/SigningTable – список доменов, почта с которых должна быть подписана
- /etc/opendkim/TrustedHosts – список серверов, которым надо доверять при подписывании или верифицировании
Придётся покопаться в каждом файле. Пойдём по порядку.
opendkim.conf
Если сейчас попытаться отправить мэйл с сайта на сервере через PHP функцию mail(), то письмо не будет подписано. И скорее всего оно не дойдёт до адресата. Потому что надо активировать функцию подписи исходящей почты в файле конфигурации (по умолчанию активна только проверка входящей почты). Заходим в первый файл из списка /etc/opendkim.conf и даём понять OpenDKIM, что надо подписывать исходящую почту. Для этого комментируем/меняем следующие строки:
Задаём:
Mode sv
Комментируем:
# LogWhy yes
и
# KeyFile /etc/opendkim/keys/default.private
Снимаем комментарий с
KeyTable /etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts
Сохраняем изменения в файле.
KeyTable
Файл KeyTable говорит OpenDKIM где искать ключи. Каждая строка в этом файле говорит о местоположении ключа. Для одного домена вставим одну в этом файле:
default._domainkey.alexgur.ru alexgur.ru:default:/etc/opendkim/keys/alexgur.ru/default.private
Всё должно уместиться в одну строку. Все остальные строки в файле буду закомментированы (будут начинаться с #). Если необходимо использовать несколько ключей (для подписи нескольких разных доменов на одном сервере), то пишем несколько строк. К примеру, для доменов alexgur1.ru и alexgur2.ru фал будет содержать:
default._domainkey.alexgur1.ru alexgur1.ru:default:/etc/opendkim/keys/alexgur1.ru/default.private
default._domainkey.alexgur2.ru alexgur2.ru:default:/etc/opendkim/keys/alexgur2.ru/default.private
Получится две строки с настройками для двух доменов. Сохраняем изменения в файле.
SigningTable
Теперь заходим в файл /etc/opendkim/SigningTable. В этом файле можно задать какие письма будут подписываться. Воспользуемся первой возможной опцией — подписываем письма, у которых в поле «От кого» находится наш домен. Для этого в файле ставим строчку:
*@alexgur.ru default._domainkey.alexgur.ru
И если доменов несколько, то содержимое файла будет выглядеть так:
*@alexgur1.ru default._domainkey.alexgur1.ru
*@alexgur2.ru default._domainkey.alexgur2.ru
Все остальные строчки в файле должны быть закомментированы #. Сохраняем изменения в файле.
TrustedHosts
Теперь необходимо отредактировать файл /etc/opendkim/TrustedHosts. Здесь ничего сложного мудрить не надо. Просто добавляем в конец файла наш домен
alexgur.ru
Или если доменов несколько, то по одному в на строчку:
alexgur1.ru
alexgur2.ru
Файл TrustedHosts говорит OpenDKIM каким доменам позволено использовать ключи. Заодно OpenDKIM не будет проверять DKIM подпись у этих доменов, ведь мы указали ранее этот файл в качестве исключений в опции ExternalIgnoreList. Вдобавок эти домены будут считаться внутренними доменами сервера, потому что ссылка на файл указана в опции InternalHosts. Поэтому OpenDKIM будет подписывать всю исходящую от них почту. А это именно то, что нам надо.
Убедитесь что ip адрес localhost (127.0.0.1) содержится в файле TrustedHosts. Иначе OpenDKIM вообще не будет подписывать никакую исходящую почту. Если в вашей сети несколько серверов и они отправляют мэйлы через один, то адреса этих серверов должны быть перечислены в TrustedHosts.
Не забудьте сохранить изменения в файле.
Внимание!
Все файлы настроек (KeyTable, SigningTable, TrustedHosts и т.п.) заканчиваются на пустую строку. Обязательно оставляйте пустую строку в конце перечисленных выше файлов, чтобы не было проблем с запуском OpenDKIM. Кстати, правило последней пустой строки встречается много где в Linux. Я не знаю откуда это правило пошло, но лучше всегда оставлять последнюю строчку пустой. Иначе (в некоторых случаях) не будет восприниматься содержание последней строки.
SendMail
Наконец то! Закончили настройку OpenDKIM. Но осталось сказать SendMail, чтобы подписывал почту через OpenDKIM. Для этого заходим в файл /etc/mail/sendmail.mc и добавляем в конец строчку:
INPUT_MAIL_FILTER(`opendkim’, `S=inet:8891@127.0.0.1′)dnl
Сохраняем файл. И компилируем настройки SendMail командой:
make all -C /etc/mail
Последние приготовления сервера
Осталось запустить OpenDKIM и перезапустить SendMail, чтобы настройки вступили в силу:
service opendkim start
service sendmail restart
И попросить OpenDKIM загружаться при старте системы:
chkconfig opendkim on
Настройка DNS
DKIM подпись исходящей почты на стороне сервера настроена. Но теперь надо опубликовать в DNS записи публичный ключ. Для этого нам понадобятся public ключи, которые были созданы ранее. Заходим в файл:
/etc/opendkim/keys/alexgur.ru/default.txt
И видим там что-то вроде этого:
default._domainkey IN TXT ( «v=DKIM1; k=rsa; » «p=MIGfM_(очень много букв)_IDAQAB» ) ; —— DKIM default for alexgur.ru
Заходим в настройки DNS записей нужного домена (который указан в самом конце этой строки) и создаём TXT запись с содержанием:
v=DKIM1; k=rsa; p=MIGfM_(очень много букв)_IDAQAB
Для домена
default._domainkey.alexgur.ru.
Да, раз уж находимся в DNS записях домена, то можно прописать SPF запись. Делается это за пару секунд, но её наличие увеличит шансы доставки исходящей почты. Но об этом в другой статье.
Победа!
Настройка закончена. Проверим правильность, воспользовавшись моим любимым сервисом: mail-tester.com. Отправляем туда тестовый мэйл и увидим зелёную галку напротив DKIM подписи.