Tag Archives: DKIM

Инсталлируем и конфижим DKIM с Postfix на Debian/Ubuntu

Перевод с 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;
Создано: П. Себастьян (P. Sebastian)
Перевод: А. Царь (beotiger)