Перевод с https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-dkim-with-postfix-on-debian-wheezy
Введение
Для многих серверных админов попадние в спам-лист не является такой уж редкой возможностью, тогда как конечно никакой спам они не рассылают и не рассылали. Возможные способы попадния в спам-листы сервера (при условии что Ваш сервер чист, не заражен троянами, рассылающего спам без Вашего ведома) могут быть одними из:
- Сервер явлется открытым почтовым релеем (open mail relay), позволяющим любому пересылть через него тонны писем
- IP адрес сервера находится в черном списке (blacklisted)
- Сервер не имеет Fully Qualified Domain Name (FQDN) и соотв. записи PTR
- the Sender Policy Framework (SPF) DNS record отсуттствует или неверно сконфижен
- the DomainKeys Identified Mail (DKIM) отсутствует ил опять же неверно настроен
Это основные требования, проверяемые многими спам-фильтрами (включая SpamAssasin).
Это руководство (tutorial) описывает инсталляцию и конфигурирование OpenDKIM: открытую имплементацию DKIM.
Важно: замените `example.com` на имя своего домена во всех примерах ниже. Команды выполняются от имени суперпользователя (su). При необохдимости используйте sudo, если предпочитаете не быть суперзверем на своём сервере. Также на системах Ubuntu вместо apt-get можно использовать apt с подобным синтаксисом. (Это была вставка от меня, Андрея Царя, простите за вольности).
Postfix и Dovecot должны быть уже установлены и сконфижены как следует (руководства (tutorial)), имя хоста и the FQDN заданы (tutorial, tutorial) и запись SPF на своём месте (tutorial).
О DKIM
DKIM – это интернет-стандарт, который позволяет частному лицу либо организации связать имя домена с email-сообщением.. То есть в какой-то мере это метод, подтверждающий достоверность и легальность отправляемого письма. В своей сути, DKIM основан на асимметричной криптографии. Mail Transfer Agent (MTA) отправителя подписывает каждое исходящее сообщение приватным ключом. Принимающая сторона получает публичный ключ из поля DNS и удостоверяется в том, что тело сообщения и некоторые заголовки не были изменены после подписывания письма.
Инсталлируем OpenDKIM
Перед началом инсталляции рекомендуется полный апгрейд системы:
apt-get update
apt-get upgrade
Инсталлируем OpenDKIM и его зависимости:
apt-get install opendkim opendkim-tools
Конфижим OpenDKIM
Теперь надо создать несколько файлов для конфигурироания OpenDKIM.
Итак, начнём с основного файла конфигурации:
vim /etc/opendkim.conf
Добавьте строки в конец conf-файла (каждый параметр будет объяснен позже). Также вы можете выбрать другой номер порта для опции Socket
. Убедитесь, что порт не используется другим приложением. Также замечу, что ключевое слово milter обозначает mail filter, т.е. почтовый фильтр.
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
- AutoRestart: перезапуск фильтра при ошибке
- AutoRestartRate: макс.рестарт рэйт, если будет превышен, фильтр остановится;
10/1h
– 10 рестартов в час позволено - UMask: полный доступ группе с ID =
UserID
и позволяет другим читать и запускать файлы, в данном случае позволна модификация файла Pid. - Syslog, SyslogSuccess, *LogWhy: включают детальный логинг для syslog
- Canonicalization: определяют методы канонизации, используемые при подписи писем
simple
метод практически не позволяет модификации, тогда какrelaxed
допускает минимальные изменения, такие как замена whitespace;relaxed/simple
– заголовок письма будет обрабатываться алгоритмомrelaxed
, а тело письма –simple
алгоритмом - ExternalIgnoreList: определяет внешние хосты, которые могут слать почту ч/з сервер как один из подписанный оменов без проверки
- InternalHosts: определяет список внутренних хостов, чью почту не проверяем, но подписываем
- KeyTable: карта имен ключей для ключей подписи
- SigningTable: списки применяемых к письмам подписей основанных на адресе, найденном в поле
From:
заголовка - Mode: описывает режимы; в нашем случае milter действует как подписчик (signer) (
s
) и контроллер (verifier) (v
) - PidFile: путь к Pid-файлу который содержит ид процесса
- SignatureAlgorithm: выбирает алгоритм подписывания писем
- UserID: opendkim процесс выполнятеся от имени данного юзера и группы
- Socket: milter будет слушать на сокете, определённом здесь, Posfix будет слать письма на проверку и подпись к opendkim ч/з этот сокет;
12301@localhost
определяет TCP сокет, слушающий наlocalhost
, порт12301
. Если порт 12301 занят, можно использовать любой другой свободный порт
Эта простая конфигурация позволяет подписывать сообщения для одного или более доменов, для ознакомления с другими опциями посмотрите здесь.
Соединяем milter с Postfix:
vim /etc/default/opendkim
Добавляем следующую строку, номер порта используем из опции Socket выше:
SOCKET="inet:12301@localhost"
Просим Postfix использовать наш milter:
vim /etc/postfix/main.cf
Убедимся что следующие две строчки присутствуют в файле и не закомментированы:
milter_protocol = 2
milter_default_action = accept
Вполне возможно что фильтры (SpamAssasin, Clamav etc.) уже используются Postfix; если да, до добаляем наш milter через запятую, вот так (не забываем про номер порта как в opendkim.conf
):
smtpd_milters = unix:/spamass/spamass.sock, inet:localhost:12301
non_smtpd_milters = unix:/spamass/spamass.sock, inet:localhost:12301
Если же данных параметров нет, просто добавляем следующие две строчки в файл:
smtpd_milters = inet:localhost:12301
non_smtpd_milters = inet:localhost:12301
Создаём структуру каталогов, содержащих доверенные хосты, таблицы ключей и криптования
mkdir -p /etc/opendkim/keys
Определяем доверенные хосты:
vim /etc/opendkim/TrustedHosts
Будем использовать этот файл для определения ExternalIgnoreList
и InternalHosts
, сообщения с этих хостов, доменов и IP-адресов являются доверенными и будут подписаны.
Т.к. наша основная конфигурация объявила TrustedHosts
как файл регулярных выражений (refile
), мы можем использовать wildcard’ы, т.е. *.example.com
означает, что сообщения с поддоменов example.com войдут также в число доверенных, как и сообщения с самого домена example.com.
Добавьте следующие строки в новый файл. Множество доменов может быть добавлено здесь:
127.0.0.1
localhost
192.168.0.1/24
*.example.com
#*.example.net
#*.example.org
Создаём таблицу ключей:
vim /etc/opendkim/KeyTable
Таблица ключей содержит каждую пару селектор/домен и путь к их приватным ключам. Любая строка из латинских буквa и цифр может быть селектором, в нашем примере мы используем mail
.
mail._domainkey.example.com example.com:mail:/etc/opendkim/keys/example.com/mail.private
#mail._domainkey.example.net example.net:mail:/etc/opendkim/keys/example.net/mail.private
#mail._domainkey.example.org example.org:mail:/etc/opendkim/keys/example.org/mail.private
Создём таблицу подписи:
vim /etc/opendkim/SigningTable
Этот файл используется для объявления адресов домен/email и их селекторов.
*@example.com mail._domainkey.example.com
#*@example.net mail._domainkey.example.net
#*@example.org mail._domainkey.example.org
Генерируем public и private ключи
Перейдём в каталог с ключами:
cd /etc/opendkim/keys
Создаём отдельную папку для каждого домена, где будут храниться ключи:
mkdir example.com
cd example.com
Генерируем ключи:
opendkim-genkey -s mail -d example.com
-s
определяет селектор, а -d
определяет домен, эта команда создаст два файла:mail.private
это наш private ключ, а mail.txt
содержит public ключ.
Поменяем владельца private ключа на opendkim
:
chown opendkim:opendkim mail.private
Добавим public ключ к DNS записям домена
Откроем mail.txt
:
vim mail.txt
public ключ определён под параметром p
. Пример:
mail._domainkey IN TXT ( "v=DKIM1; k=rsa; " "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5N3lnvvrYgPCRSoqn+awTpE+iGYcKBPpo8HHbcFfCIIV10Hwo4PhCoGZSaKVHOjDm4yefKXhQjM7iKzEPuBatE7O47hAx1CJpNuIdLxhILSbEmbMxJrJAG0HZVn8z6EAoOHZNaPHmK2h4UUrjOG8zA5BHfzJf7tGwI+K619fFUwIDAQAB" ) ; ----- DKIM key mail for example.com
Скопируйте этот ключ и добавьте запись TXT для своего домена в DNS:
Имя: mail._domainkey.example.com.
Text: "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5N3lnvvrYgPCRSoqn+awTpE+iGYcKBPpo8HHbcFfCIIV10Hwo4PhCoGZSaKVHOjDm4yefKXhQjM7iKzEPuBatE7O47hAx1CJpNuIdLxhILSbEmbMxJrJAG0HZVn8z6EAoOHZNaPHmK2h4UUrjOG8zA5BHfzJf7tGwI+K619fFUwIDAQAB"
Измения в DNS могут занять какое-то время до вступления в силу.
Перезапуск Postfix и OpenDKIM:
service postfix restart
service opendkim restart
Мои поздравления! Мы успешно настроили DKIM для нашего почтового сервера!
Конфигурация может быть протестирована отправкой пустого email’а на check-auth@verifier.port25.com
. Если всё работает как должно, мы должны будем получить письмо, где среди прочего должна присутствовать строка DKIM check: pass
под заголовком Summary of Results
.
==========================================================
Summary of Results
==========================================================
SPF check: pass
DomainKeys check: neutral
DKIM check: pass
Sender-ID check: pass
SpamAssassin check: ham
Также можно послать письмо на наш адрес в Gmail и посмотреть исходники полученного письма, там должна присутствовать строка dkim=pass
под заголовком Authentication-Results
.
Authentication-Results: mx.google.com;
spf=pass (google.com: domain of contact@example.com designates --- as permitted sender) smtp.mail=contact@example.com;
dkim=pass header.i=@example.com;