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

Все примеры по настройке DKIM в данной инструкции выполнены на базе систем FreeBSD, Ubuntu и CentOS.

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

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

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

Для FreeBSD:

pkg install opendkim

или из портов:

cd /usr/ports/mail/opendkim

make config-recursive

make install clean

Для Ubuntu:

apt-get install opendkim opendkim-tools

Для CentOS:

yum install opendkim opendkim-tools

2. Создание сертификата для домена

Для этого можно воспользоваться бесплатным онлайн инструментом на сайте dkimcore.org. Однако, в данном примере, мы воспользуемся opendkim-genkey и сформируем его самостоятельно.

И так, создаем каталог для размещения ключей:

mkdir /etc/opendkim

И генерируем их следующей командой:

opendkim-genkey -D /etc/opendkim/ --domain dmosk.ru --selector relay

* где dmosk.ru — домен, с которого будет отправляться почта: relay — имя селектора (селектор — это строковый идентификатор, он может быть любым).

В папке /etc/opendkim/ должно появиться два файла с расширениями .private и .txt. Первый — закрытый ключ (храним его у себя на сервере), второй — готовая txt-запись для DNS.

Задаем группу владельца opendkim для созданных ключей:

chown :opendkim /etc/opendkim/*

Если система выдаст ошибку, что группы opendkim не существует (chown: opendkim: illegal group name), необходимо сначала создать учетную запись.

FreeBSD:

pw useradd opendkim -m -s /usr/sbin/nologin -w no

Linux (Ubuntu, CentOS):

useradd opendkim -m -s /sbin/nologin

После разрешаем чтение группе владельцу:

chmod g+r /etc/opendkim/*

3. Настройка DNS

Смотрим содержимое файла txt:

cat /etc/opendkim/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 — по умолчанию (такую запись создавать не обязательно).

4. Настройка OpenDKIM и Postfix

OpenDKIM

Открываем конфигурационный файл opendkim.

FreeBSD:

ee /usr/local/etc/mail/opendkim.conf

Linux:

vi /etc/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.

Создаем файл доверенных узлов. В него войдут имена хостов, доменов и IP-адресов, которые будут приняты, как доверенные и подписаны.

vi /etc/opendkim/TrustedHosts

И вносим следующее:

127.0.0.1
localhost
*.dmosk.ru

* где dmosk.ru — почтовый домен.

Создаем таблицу KeyTable. В ней хранится список соответствий между селекторами, доменами и файлами с закрытыми ключами. Формат записей:
<селектор>._domainkey.<домен> <домен>:<селектор>:<путь к закрытому ключу>

vi /etc/opendkim/KeyTable

И в соответствии с форматом приводим его к нужному виду:

relay._domainkey.dmosk.ru dmosk.ru:relay:/etc/opendkim/relay.private

И напоследок, создаем SigningTable. В данной таблице хранятся соответствия между определенными email-адресами и записями в KeyTable.

vi /etc/opendkim/SigningTable

И приводим к такому виду:

*@dmosk.ru relay._domainkey.dmosk.ru

Запускаем службу opendkim.

FreeBSD:

Сначала добавляем демона в rc.conf:

echo 'milteropendkim_enable="YES"' >> /etc/rc.conf

echo 'milteropendkim_uid="opendkim"' >> /etc/rc.conf

* первая команда разрешает запуск демона, вторая — принудительно заставляет его запускаться от пользователя opendkim.

И запускаем его:

service milter-opendkim start

Linux:

systemctl start opendkim

или:

service opendkim start

Postfix

Открываем конфигурационный файл.

FreeBSD:

ee /usr/local/etc/postfix/main.cf

Linux:

vi /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:

service postfix restart

или:

systemctl restart postfix

5. Проверка

Отправляем письмо

Отправляем электронное сообщение на различные почтовые системы — mail.ru, gmail.com, yandex.ru.

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

echo "Test DKIM" | mail -s 'Testing DKIM' -r admin@dmosk.ru test@mail.ru

* где admin@dmosk.ru — почтовый ящик, от которого отправляется письмо (напомню, в данном примере подпись создается для домена dmosk.ru), test@mail.ru — Ваш адрес почты, на который придет письмо.

Второй способ — настроить почтовый клиент, который будет отправлять почту через настроенный нами сервер.

Проверяем заголовки

Открываем наше письмо и смотрим заголовки (в mail.ru: Еще - Служебные заголовки).

Среди них мы должны увидеть следующую строчку:

dkim=pass header.d=dmosk.ru

Проверка домена на базе DKIM настроена успешно.

6. Что дальше

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

  1. Убедитесь, что для домена отправки существует правильная запись SPF. Данная запись прописывается как TXT-запись в системе DNS и говорит, с каких почтовых серверов может быть отправлена почта для домена.
  2. Настройте DMARK. Это политики, которые говорят почтовому серверу, что нужно делать с письмами. Требует настроенных SPF и DKIM.

7. Решение проблем

Большинство трудностей решается чтением логов. Для opendkim они будут попадать в общий log-файл почты. Включить его непрерывный просмотр можно следующей командой:

tail -f /var/log/maillog

Также, очень часто, проблемы возникают из-за неправильной настройки прав на ключи. Нужно иметь ввиду, что некоторые системы, из соображений безопасности, выдают ошибку, если на файлы выданы слишком широкие права на чтение. То есть, если разрешить читать файлы всем (chmod 644), система будет возвращать ошибку. Если в логах видим «error loading key», скорее всего, проблема с правами. Внимательно выполните повторно рекомендации 2-о пункта данной инструкции.

Еще одно часто появляющееся сообщение — «opendkim no signing table match for». Оно говорит, что для домена, от которого отправляется почта, нет соответствий в файле SigningTable. Либо была допущена опечатка, либо, на самом деле, для домена отправки не нужно использовать DKIM.

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

Да            Нет