Pull to refresh

OpenDKIM + Postfix = просто

Spamming and anti-spamming Configuring Linux *System administration *


В конце 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.
Tags:
Hubs:
Total votes 46: ↑40 and ↓6 +34
Views 113K
Comments Comments 28