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

Обновлено Обновлено: Опубликовано Опубликовано:

Используемые термины: DKIM, DNS, SPFDMARCFreeBSD, UbuntuCentOS.

Все примеры по настройке DKIM в данной инструкции выполнены на базе систем FreeBSD, Ubuntu / Debian / Astra Linux и Rocky Linux / CentOS / Red Hat.

1. Установка OpenDKIM

Для начала, устанавливаем пакет OpenDKIM. Он выполняет операции шифрования заголовков для DKIM, а также содержит набор утилит для формирования ключей.

Для его установки вводим следующее.

а) Для Ubuntu / Debian / Astra Linux:

apt install opendkim opendkim-tools

б) Для Rocky Linux / CentOS:

yum install opendkim

в) Для 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

Готово.

Что дальше

Чтобы отправка сообщений стала еще надежнее, сделайте следующее:

  1. Убедитесь, что для домена отправки существует правильная запись SPF. Данная запись прописывается как TXT-запись в системе DNS и говорит, с каких почтовых серверов может быть отправлена почта для домена.
  2. Настройте 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.

# CentOS # FreeBSD # Linux # Ubuntu # UNIX # Безопасность # Почта # Серверы
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет