Настройка DKIM + Postfix


Используемые термины: DKIM, DNS, SPF, DMARC, FreeBSD, Ubuntu, CentOS.
Все примеры по настройке DKIM в данной инструкции выполнены на базе систем FreeBSD, Ubuntu / Debian / Astra Linux и Rocky Linux / CentOS / Red Hat.
Устанавливаем opendkim
Настраиваем OpenDKIM и Postfix
Создаем сертификат для первого домена и настраиваем его
Настраиваем DNS
Проверяем настройку
Настройка дополнительных записей для новых доменов
Что еще можно настроить для почты
Диагностика ошибок
1. Установка OpenDKIM
Для начала, устанавливаем пакет OpenDKIM. Он выполняет операции шифрования заголовков для DKIM, а также содержит набор утилит для формирования ключей.
Для его установки вводим следующее.
а) Для Ubuntu / Debian / Astra Linux:
apt install opendkim opendkim-tools
б) Для Rocky Linux / CentOS:
yum install opendkim opendkim-tools
в) Для FreeBSD:
pkg install opendkim
или из портов:
cd /usr/ports/mail/opendkim
make config-recursive
make install clean
2. Настройка OpenDKIM и Postfix
OpenDKIM
Переносим старый конфигурационный файл opendkim и создаем новый.
а) Linux:
mv /etc/opendkim.conf /etc/backup.opendkim.conf
vi /etc/opendkim.conf
б) FreeBSD:
mv /usr/local/etc/mail/opendkim.conf /usr/local/etc/mail/backup.opendkim.conf
ee /usr/local/etc/mail/opendkim.conf
Создаем новую конфигурацию.
Добавим следующие строки:
AutoRestart Yes
AutoRestartRate 10/1h
Umask 002
Syslog yes
SyslogSuccess Yes
LogWhy Yes
Canonicalization relaxed/simple
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts
KeyTable refile:/etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
Mode sv
PidFile /var/run/opendkim/opendkim.pid
SignatureAlgorithm rsa-sha256
UserID opendkim:opendkim
Socket inet:12301@localhost
* все параметры можно оставить, как в данном примере, за исключением Socket — можно указать любой другой порт, вместо 12301.
Создаем каталог /etc/opendkim (например, в Debian он не создается автоматически):
mkdir /etc/opendkim
* если увидим сообщение mkdir: cannot create directory ‘/etc/opendkim’: File exists, то значит, каталог и так создан.
Создаем файл доверенных узлов. В него пока войдут имя локального хоста (localhost) и его IP-адрес, которые будут приняты, как доверенные и подписаны:
vi /etc/opendkim/TrustedHosts
И вносим следующее:
127.0.0.1
localhost
* в данный файл мы заносим все IP-адреса и сети почтовых серверов, которые могут использовать наш сервер как почтовый релей. Таким образом, если в вашей системе используется подобная конфигурация, в файл TrustedHosts мы должны добавить адреса данных почтовых серверов.
Создаем остальные конфигурационные файлы (если их нет):
touch /etc/opendkim/{KeyTable,SigningTable}
Открываем файл /etc/default/opendkim:
vi /etc/default/opendkim
... его либо не должно быть, либо он должен быть пустой, либо проверяем строку с настройкой SOCKET и приводим ее к виду:
SOCKET=inet:12301@localhost
Запускаем службу opendkim.
а) На Linux:
systemctl enable opendkim
systemctl restart opendkim
б) На FreeBSD:
Сначала добавляем демона в rc.conf:
echo 'milteropendkim_enable="YES"' >> /etc/rc.conf
echo 'milteropendkim_uid="opendkim"' >> /etc/rc.conf
* первая команда разрешает запуск демона, вторая — принудительно заставляет его запускаться от пользователя opendkim.
И запускаем его:
service milter-opendkim start
Postfix
Открываем конфигурационный файл.
а) Linux:
vi /etc/postfix/main.cf
б) FreeBSD:
ee /usr/local/etc/postfix/main.cf
Добавляем или редактируем:
milter_protocol = 2
milter_default_action = accept
smtpd_milters = inet:localhost:12301
non_smtpd_milters = inet:localhost:12301
* если smtpd_milters и non_smtpd_milters присутствуют в конфигурационном файле, то приведенные в данном примере значения нужно дописать к имеющимся.
** 12301 — порт работы opendkim, который был задан в opendkim.conf.
Перезапускаем Postfix:
systemctl restart postfix
или:
service postfix restart
3. Создание сертификата и настройка домена
Для создания сертификата можно воспользоваться бесплатным онлайн инструментом на сайте dkimcore.org. Однако, в данном примере, мы воспользуемся opendkim-genkey и сформируем его самостоятельно. Мы будем работать с доменом dmosk.ru (Вам необходимо его заменить своим). Для удобства ввода команд, создадим переменную, в которую запишем имя нашего домена:
DKIM_DOMAIN=dmosk.ru
И так, создаем каталог для размещения ключей домена:
mkdir -p /etc/opendkim/${DKIM_DOMAIN}
И генерируем их следующей командой:
opendkim-genkey -D /etc/opendkim/${DKIM_DOMAIN}/ --domain ${DKIM_DOMAIN} --selector relay
* где ${DKIM_DOMAIN} — переменная, содержащая домен (в нашем примере, dmosk.ru), с которого будет отправляться почта: relay — имя селектора (селектор — это строковый идентификатор, он может быть любым).
В папке /etc/opendkim/dmosk.ru должно появиться два файла с расширениями .private и .txt. Первый — закрытый ключ (храним его у себя на сервере), второй — готовая txt-запись для DNS.
Создадим пользователя opendkim.
Linux (Ubuntu, CentOS):
useradd opendkim -m -s /sbin/nologin
* мы можем получить ошибку useradd: user 'opendkim' already exists — это значит, что пользователь уже создан. Просто продолжаем настройку.
FreeBSD:
pw useradd opendkim -m -s /usr/sbin/nologin -w no
После создания пользователя, задаем группу владельца opendkim для созданных ключей.
Это выполняется командой:
chown :opendkim /etc/opendkim/${DKIM_DOMAIN}/*
Если система выдаст ошибку, что группы opendkim не существует (chown: opendkim: illegal group name), необходимо сначала создать учетную запись.
Задаем права для группы владельца:
chmod g+rw /etc/opendkim/${DKIM_DOMAIN}/*
Открываем созданный нами ранее TrustedHosts:
В ранее созданный файл TrustedHosts добавляем домен:
echo "*.${DKIM_DOMAIN}" >> /etc/opendkim/TrustedHosts
Создаем таблицу KeyTable. В ней хранится список соответствий между селекторами, доменами и файлами с закрытыми ключами. Формат записей:
<селектор>._domainkey.<домен> <домен>:<селектор>:<путь к закрытому ключу>
echo "relay._domainkey.${DKIM_DOMAIN} ${DKIM_DOMAIN}:relay:/etc/opendkim/${DKIM_DOMAIN}/relay.private" >> /etc/opendkim/KeyTable
И напоследок, создаем SigningTable. В данной таблице хранятся соответствия между определенными email-адресами и записями в KeyTable.
echo "*${DKIM_DOMAIN} relay._domainkey.${DKIM_DOMAIN}" >> /etc/opendkim/SigningTable
Перезапускаем opendkim:
systemctl restart opendkim
4. Настройка DNS
Смотрим содержимое файла txt, который был сформирован при генерировании сертификата для домена:
cat /etc/opendkim/${DKIM_DOMAIN}/relay.txt
И используя данное содержимое, в панели управления нашим DNS создаем TXT-запись следующего формата:
relay._domainkey IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqG...rhyaj8OcbwIDAQAB"
* где relay — название нашего селектора MIGfMA0GCSqG...rhyaj8OcbwIDAQAB — сокращенная запись открытого ключа (она длиннее).
Дополнительные необязательные записи
_domainkey IN TXT "o=~; r=postmaster@dmosk.ru"
* где o=~ означает, что не все сообщения подписываются для домена (o=- — говорит, что все письма используют DKIM).
_adsp._domainkey IN TXT "dkim=all"
* all запрещает принимать письма от домена без цифровой подписи. Другие варианты: discardable — блокировать сообщения на стороне получателя, unknown — по умолчанию (такую запись создавать не обязательно).
5. Проверка
Стоит учитывать, что записи в DNS могут обновляться на протяжении длительного времени, например, от 15 минут до 24 часов. Если проверка дала отрицательный результат, пробуем повторить тест через час.
Отправляем письмо
Отправляем электронное сообщение на различные почтовые системы — mail.ru, gmail.com, yandex.ru.
Для удобства, создадим переменную:
DKIM_DOMAIN=domain.zone
* где вместо domain.zone ставим наш домен.
Способов отправки несколько, например, можно выполнить следующие команды.
а) на Red Hat / CentOS:
yum install mailx
* данная команда установит утилиту для отправки почты из командной строки, если ее нет.
echo "Test DKIM" | mail -s "Testing DKIM" -S smtp="localhost:25" -S from="postmaster@${DKIM_DOMAIN}" -S return-path="postmaster@${DKIM_DOMAIN}" master@dmosk.ru
б) на Debian / Ubuntu:
apt install mailutils
* данная команда установит утилиту для отправки почты из командной строки, если ее нет.
echo "Test DKIM" | mail -s "Testing DKIM" -a "Smtp: localhost:25" -a "From: postmaster@${DKIM_DOMAIN}" -a "Return-path: postmaster@${DKIM_DOMAIN}" master@dmosk.ru
* где postmaster@${DKIM_DOMAIN} — почтовый ящик, от которого отправляется письмо, master@dmosk.ru — должен быть Ваш адрес почты, на который придет письмо.
Второй способ — настроить почтовый клиент, который будет отправлять почту через настроенный нами сервер.
Проверяем заголовки
Открываем наше письмо и смотрим заголовки (в mail.ru: Еще - Служебные заголовки).
Среди них мы должны увидеть следующую строчку:
dkim=pass header.d=dmosk.ru
Проверка домена на базе DKIM настроена успешно.
Добавление новых записей dkim
Разберем процесс быстрого добавления дополнительных записей dkim на примере Linux (во FreeBSD будут другие пути до файлов).
Чтобы работать было удобнее и быстрее, в консоли создадим переменную, значением которой должен быть наш домен:
DKIM_DOMAIN=domain.zone
* где вместо domain.zone ставим наш домен.
Создаем каталог для размещения ключей домена:
mkdir -p /etc/opendkim/$DKIM_DOMAIN
Генерируем ключ:
opendkim-genkey -D /etc/opendkim/$DKIM_DOMAIN/ --domain $DKIM_DOMAIN --selector relay
Задаем нужные права:
chown :opendkim /etc/opendkim/$DKIM_DOMAIN/*
chmod g+rw /etc/opendkim/$DKIM_DOMAIN/*
Смотрим содержимое файла txt:
cat /etc/opendkim/$DKIM_DOMAIN/relay.txt
... и используя данное содержимое, в панели управления нашим DNS создаем TXT-запись.
Добавляем соответствующие настройки в файлы TrustedHosts, KeyTable, SigningTable:
echo "*.$DKIM_DOMAIN" >> /etc/opendkim/TrustedHosts
echo "relay._domainkey.$DKIM_DOMAIN $DKIM_DOMAIN:relay:/etc/opendkim/$DKIM_DOMAIN/relay.private" >> /etc/opendkim/KeyTable
echo "*@$DKIM_DOMAIN relay._domainkey.$DKIM_DOMAIN" >> /etc/opendkim/SigningTable
Перезапускаем службу.
а) если Linux:
systemctl reload opendkim
б) если FreeBSD:
service milter-opendkim restart
Готово.
Что дальше
Чтобы отправка сообщений стала еще надежнее, сделайте следующее:
- Убедитесь, что для домена отправки существует правильная запись SPF. Данная запись прописывается как TXT-запись в системе DNS и говорит, с каких почтовых серверов может быть отправлена почта для домена.
- Настройте DMARC. Это политики, которые говорят почтовому серверу, что нужно делать с письмами. Требует настроенных SPF и DKIM.
Решение проблем
Большинство трудностей решается чтением логов. Для opendkim они будут попадать в общий log-файл почты. Включить его непрерывный просмотр можно следующей командой.
а) для Red Hat / CentOS / FreeBSD:
tail -f /var/log/maillog
б) для Debian / Ubuntu:
tail -f /var/log/mail.log
Также, очень часто, проблемы возникают из-за неправильной настройки прав на ключи. Нужно иметь ввиду, что некоторые системы, из соображений безопасности, выдают ошибку, если на файлы выданы слишком широкие права на чтение. То есть, если разрешить читать файлы всем (chmod 644), система будет возвращать ошибку. Если в логах видим «error loading key», скорее всего, проблема с правами. Внимательно выполните повторно рекомендации 2-о пункта данной инструкции.
Еще одно часто появляющееся сообщение — «opendkim no signing table match for». Оно говорит, что для домена, от которого отправляется почта, нет соответствий в файле SigningTable. Либо была допущена опечатка, либо, на самом деле, для домена отправки не нужно использовать DKIM.