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

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

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

Все примеры по настройке 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. Настройка OpenDKIM и Postfix

OpenDKIM

Переносим старый конфигурационный файл opendkim и создаем новый.

FreeBSD:

mv /usr/local/etc/mail/opendkim.conf /usr/local/etc/mail/backup.opendkim.conf

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

Linux:

mv /etc/opendkim.conf /etc/backup.opendkim.conf

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.

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

vi /etc/opendkim/TrustedHosts

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

127.0.0.1
localhost

Открываем файл /etc/default/opendkim:

vi /etc/default/opendkim

... его либо не должно быть, либо он должен быть пустой, либо проверяем строку с настройкой SOCKET и приводим ее к виду:

SOCKET=inet:12301@localhost

Запускаем службу 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 enable opendkim

systemctl start opendkim

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

3. Создание сертификата и настройка домена

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

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

mkdir -p /etc/opendkim/dmosk.ru

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

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

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

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

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

chown :opendkim /etc/opendkim/dmosk.ru/*

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

Задаем права для группы владельца:

chmod g+rw /etc/opendkim/dmosk.ru/*

Создадим пользователя opendkim.

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/dmosk.ru/*

Открываем созданный нами ранее TrustedHosts:

vi /etc/opendkim/TrustedHosts

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

...
*.dmosk.ru

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

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

vi /etc/opendkim/KeyTable

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

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

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

vi /etc/opendkim/SigningTable

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

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

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

Смотрим содержимое файла txt, который был сформирован при генерировании сертификата для домена:

cat /etc/opendkim/dmosk.ru/relay.txt

* где dmosk.ru — домен, для которого производилась настройка.

И используя данное содержимое, в панели управления нашим 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. Проверка

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

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

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

а) на Red Hat / CentOS:

yum install mailx

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

echo "Test DKIM" | mail -s "Testing DKIM" -S smtp="localhost:25" -S from="postmaster@dmosk.ru" -S return-path="postmaster@dmosk.ru" master@dmosk.ru

б) на Debian / Ubuntu:

apt-get install mailutils

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

echo "Test DKIM" | mail -s "Testing DKIM" -a "Smtp: localhost:25" -a "From: postmaster@dmosk.ru" -a "Return-path: postmaster@dmosk.ru" master@dmosk.ru

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

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

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

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

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

dkim=pass header.d=dmosk.ru

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

Добавление новых записей dkim

Разберем процесс добавления дополнительных записей dkim. Чтобы работать было удобнее и быстрее, в косоли создадим переменную, значением которой должен быть наш домен:

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.

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

Да            Нет