В конце 2011 года разработчики проекта dkim-milter прекратили его поддержку и разработку. К счастью, на замену проекта dkim-milter пришел OpenDKIM, с помощью которого добавить DKIM-подпись в письма так же просто.
tl;dr: в наше время без DKIM-подписей ну никак нельзя
DKIM-подпись — это цифровая подпись, которая добавляется к заголовкам письма сервером отправителя, по которой сервер получателя может удостовериться, что отправитель письма соответствует полю From в заголовках письма. Если сервер получателя проверяет эту подпись, то по результатам проверки сервер может принять решение о том, как поступать с письмом: принять, отправлять в папку «Спам», отправить на дополнительную проверку или вовсе отказаться от приёма. Подписи DKIM проверяют и используют сами все ведущие почтовые службы, включая Яндекс и Mail.ru. Последняя открыто требует чтобы письма были подписаны с помощью DKIM.
Инструкция по настройке связки Postfix и OpenDKIM
Для этого нам потребуется сам Postfix и пакеты OpenDKIM. Установим все необходимые компоненты с помощью вашего пакетного менеджера:
aptitude install opendkim opendkim-tools
Теперь нам нужно получить ключи, которые мы будем использовать для подписи писем.
Ключи для подписи
Получим ключ для домена сервера и для селектора, равного имени сервера без домена, чтобы ничего не придумывать:
mkdir /etc/opendkim/
opendkim-genkey -D /etc/opendkim/ -d $(hostname -d) -s $(hostname)
Если дело происходит на сервере
mail.example.com
, то последняя команда создаст файлы /etc/opendkim/mail.private
и /etc/opendkim/mail.txt
, с секретным и публичными ключами соответственно. Публичный ключ нужно добавить в соответствующую TXT запись вашего домена.Файлам ключей обязательно нужно дать доступ на чтение для группы, в которой работает OpenDKIM, а сам
postfix
добавить в ту же группу, чтобы тот мог подписывать письма подключаясь к демону OpenDKIM через его сокет:chgrp opendkim /etc/opendkim/*
chmod g+r /etc/opendkim/*
gpasswd -a postfix opendkim
Где искать ключи?
В конфиг
/etc/opendkim.conf
допишем наши настройки:tee -a /etc/opendkim.conf <<EOF
Canonicalization relaxed/relaxed
SyslogSuccess yes
KeyTable file:/etc/opendkim/keytable
SigningTable file:/etc/opendkim/signingtable
X-Header yes
# на время отладки включим расширенное логгирование:
LogWhy yes
# если вы подписываете и на других серверах:
#ExternalIgnoreList file:/etc/opendkim/trusted
# список внутренних хостов, почта которых требует подписи:
#InternalHosts file:/etc/opendkim/internal
EOF
Подробное описание всех директив ищите в документации.
Какими ключами подписывать?
Список имеющихся ключей укажем в файле
/etc/opendkim/keytable
в формате "название домен:селектор:/путь/до/ключа
". Если вы создавали ключи командой выше, то прописать ключ согласно FQDN сервера в этом файле можно так:echo $(hostname -f | sed s/\\./._domainkey./) $(hostname -d):$(hostname):$(ls /etc/opendkim/*.private) | tee -a /etc/opendkim/keytable
Для
mail.example.com
в файле будет такая строчка:mail._domainkey.example.com example.com:mail:/etc/opendkim/mail.private
Ключей в этом файле может быть сколько угодно, для какого угодно числа доменов. Также ключи могут храниться в БД — подробней в документации.
Чью почту подписывать?
Теперь объясним OpenDKIM почту каких доменов какими ключами подписывать в файле
/etc/opendkim/signingtable
в формате "домен название-ключа
":echo $(hostname -d) $(hostname -f | sed s/\\./._domainkey./) | tee -a /etc/opendkim/signingtable
Для хоста
mail.example.com
в файле будет example.com mail._domainkey.example.com
. Если хочется подписывать вообще всю исходящую почту то можно указать *
вместо домена.В других файлах, указанных в директивах
ExternalIgnoreList
и InternalHosts
, содержится просто список хостов и/или IP-адресов каждый на новой строке, подписи писем для которых будут либо проигнорированы, либо добавлены. Если за почту у вас отвечает единственный сервер, то с ними ничего не нужно делать.Настроим Postfix
Наконец, попросим Postfix отправлять все письма на подпись:
postconf -e milter_default_action=accept
postconf -e milter_protocol=2
postconf -e smtpd_milters=unix:/var/run/opendkim/opendkim.sock
postconf -e non_smtpd_milters=unix:/var/run/opendkim/opendkim.sock
Если Postfix в chroot...
Если Postfix вы используете без chroot, то для настройки больше ничего не нужно делать. Иначе, что скорее всего, нужно объяснить OpenDKIM где ему следует создавать сокет и дать для всего подходящие права:
echo 'SOCKET="local:/var/spool/postfix/var/run/opendkim/opendkim.sock"' | tee -a /etc/default/opendkim
mkdir -p /var/spool/postfix/var/run/opendkim
chown opendkim:opendkim /var/spool/postfix/var/run/opendkim
Готово!
Перезапускаем Postfix и OpenDKIM штатными средствами, отправляем тестовое письмо куда-нибудь на Яндекс, и наслаждаемся успешным результатом проверки подписи:
Не забываем добавить TXT запись и проверить, что она на месте:
dig txt mail._domainkey.example.com
Ещё один способ проверить корректность подписи: отправить письмо на
check-auth@verifier.port25.com
.Запретим письма без подписи
Если проверка прошла успешно, то стоит формально запретить другим серверам принимать письма с вашим доменом, но без подписи, добавив ADSP запись:
_adsp._domainkey IN TXT "dkim=all"
Конец
Дочитали до конца, но хотите большего? Гораздо более короткая инструкция по настройке OpenDKIM при условии одного домена и корректно настроенного hostname.