Установка и настройка DKIM для Postfix на Debian Wheezy

Published by 2 Comments

Иногда почтовые серверы бывают помечены как спамеры; кроме взлома сервера для этого есть следующие причины:

  • Сервер является общедоступным сервером ретрансляции почты.
  • IP-адрес отправителя или сервера добавлен в черный список.
  • У сервера нет FQDN и PTR-записи.
  • У отправителя отсутствует или неправильно настроена DNS-запись SPF.
  • Отсутствует или не правильно настроен DKIM (DomainKeys Identified Mail).

Это лишь некоторые из основных параметров, которые проверяются спам-фильтрами (в том числе и SpamAssassin). Правильно настроенный почтовый сервер обязательно должен соответствовать этим требованиям.

Данное руководство поможет установить и настроить OpenDKIM, открытую реализацию системы аутентификации отправителя DKIM.

Примечание: Для выполнения руководства нужно предварительно настроить доступ к серверу через SSH, а также установить и настроить Postfix и Dovecot. Кроме того, нужно настроить имя хоста, FQDN и SPF-запись.

Что такое DKIM?

DKIM – это сетевой стандарт, позволяющий пользователю или организации связывать доменное имя с сообщением электронной почты. Таким образом на пользователя возлагается ответственность за отправку сообщения. В основе DKIM лежит асимметричная криптография. Агент пересылки почты (МТА, Mail Transfer Agent) отправителя подписывает каждое исходящее сообщение при помощи закрытого ключа. Затем получатель извлекает открытый ключ из DNS-записей отправителя и проверяет, было ли тело сообщения или некоторые поля заголовка изменены с момента подписи сообщения.

Установка OpenDKIM

Прежде чем приступить к установке, нужно обновить систему:

sudo apt-get update
sudo apt-get dist-upgrade

Установите OpenDKIM и зависимости программы:

sudo apt-get install opendkim opendkim-tools

Дополнительные пакеты будут добавлены в список в качестве зависимостей. Чтобы продолжить, введите yes и нажмите Enter.

Настройка OpenDKIM

Теперь нужно создать пару файлов для настройки OpenDKIM.

Откройте текстовый редактор (в данном случае Nano).

Примечание: Замените условный домен example.com своим доменным именем во всех командах.

Создайте главный конфигурационный файл.

sudo nano /etc/opendkim.conf

Внесите следующие строки в конец файла. Опционально можно также выбрать пользовательский номер порта для параметра Socket; но сначала нужно убедиться, что этот порт не занят другим приложением.

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: дает все права доступа к группе пользователей, определяемой параметром UserID, и позволяет другим пользователям читать и выполнять файлы (в данном случае это позволит создавать и изменять файл PID).
  • Syslog, SyslogSuccess, *LogWhy: эти параметры включают подробное журналирование.
  • Canonicalization: задаёт методы каноникализации при подписи сообщения; например метод simple не разрешает вносить изменения, а relaxed позволяет вносить небольшие поправки в сообщение (пробелы); значение relaxed/simple: заголовок сообщения использует метод relaxed, а тело – метод simple.
  • ExternalIgnoreList: указывает внешние хосты, которые могут отправлять сообщения с сервера в качестве одного из доменов без учётных данных.
  • InternalHosts: задаёт список внутренних хостов, чьи сообщения не нужно проверять, но нужно подписывать.
  • KeyTable: привязывает имена ключей к ключам подписи.
  • SigningTable: содержит список подписей, применяемых к сообщениям согласно адресу, указанному в поле заголовка From.
  • Mode: объявляет операционные режимы; в этом случае используются режимы signer (s) и verifier (v).
  • PidFile: путь к Pid-файлу, содержащему необходимые идентификаторы.
  • SignatureAlgorithm: устанавливает алгоритм подписи.
  • UserID: пользователь и группа, при помощи которых работает opendkim.
  • Socket: заданный здесь сокет будет прослушиваться и использоваться Posfix для отправки сообщений opendkim; значение 12301@localhost определяет TCP-сокет на localhost, порт 12301.

Эти простые настройки нужны для поддержки подписи сообщений для одного домена и больше. Подробнее о конфигурациях можно прочесть здесь.

Теперь подключите сервер milter (сокращение от mail filter) к Postfix:

sudo nano /etc/default/opendkim

Добавьте следующую строку; если вы используете другой номер порта, укажите его:

SOCKET="inet:12301@localhost"

Настройте Postfix для поддержки сервера milter:

sudo nano /etc/postfix/main.cf

Убедитесь, что эти две строки находятся в конфигурационном файле Postfix и раскомментированы:

milter_protocol = 2
milter_default_action = accept

На данном этапе рекомендуется использовать фильтр для Postfix (SpamAssasin, Clamav и т.д.). Если следующие параметры находятся в файле, просто добавьте в них сервер opendkim milter (серверы 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

Создайте структуру каталогов, содержащую заведомо безопасные хосты, ключи, подписи и криптографические ключи.

sudo mkdir /etc/opendkim
sudo mkdir /etc/opendkim/keys

Задайте заведомо безопасные хосты:

sudo nano /etc/opendkim/TrustedHosts

В этом файле нужно определить ExternalIgnoreList и InternalHosts; сообщения, отправленные с этих хостов, доменов и IP-адресов, будут восприняты как безопасные и подписаны.

Главный конфигурационный файл объявляет TrustedHosts как файл регулярных выражений (refile), потому можно использовать специальные символы; например * .example.com означает, что сообщения от домена, а также сообщения, поступающие от поддоменов example.com, будут восприняты как безопасные.

Отредактируйте и добавьте следующие строки в новый файл. В нём можно задать несколько доменов. Не изменяйте первые три строки.

127.0.0.1
localhost
192.168.0.1/24
*.example.com
#*.example.net
#*.example.org

Создайте таблицу ключей:

sudo nano /etc/opendkim/KeyTable

Таблица ключей содержит пары «селектор/домен» и пути к закрытым ключам. Любая буквенно-цифровая строка может быть использована в качестве селектора; в данном случае используется селектор 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

Создайте таблицу подписей:

sudo nano /etc/opendkim/SigningTable

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

*@example.com mail._domainkey.example.com
#*@example.net mail._domainkey.example.net
#*@example.org mail._domainkey.example.org

Создание закрытых и открытых ключей

Откройте каталог keys:

cd /etc/opendkim/keys

Создайте отдельную папку для хранения ключей домена.

sudo mkdir example.com
cd example.com

Сгенерируйте ключи:

sudo opendkim-genkey -s mail -d example.com

Флаг -s задаёт селектор, -d указывает домен; данная команда создаст два файла: mail.private для закрытого ключа и mail.txt для открытого.

Сделайте opendkim владельцем закрытого ключа:

sudo chown opendkim:opendkim mail.private

Добавление открытого ключа в DNS-запись домена

Откройте mail.txt:

sudo nano -$ mail.txt

Открытый ключ определяется параметром p.

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

mail._domainkey IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5N3lnvvrYgPCRSoqn+awTpE+iGYcKBPpo8HHbcFfCIIV10Hwo4PhCoGZSaKVHOjDm4yefKXhQjM7iKzEPuBatE7O47hAx1CJpNuIdLxhILSbEmbMxJrJAG0HZVn8z6EAoOHZNaPHmK2h4UUrjOG8zA5BHfzJf7tGwI+K619fFUwIDAQAB" ; ----- DKIM key mail for example.com

Скопируйте этот ключ и добавьте запись TXT в DNS-записи домена.

Name: mail._domainkey.example.com.
Text: "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5N3lnvvrYgPCRSoqn+awTpE+iGYcKBPpo8HHbcFfCIIV10Hwo4PhCoGZSaKVHOjDm4yefKXhQjM7iKzEPuBatE7O47hAx1CJpNuIdLxhILSbEmbMxJrJAG0HZVn8z6EAoOHZNaPHmK2h4UUrjOG8zA5BHfzJf7tGwI+K619fFUwIDAQAB"

Примечание: Помните, что обновление записей DNS может занять несколько часов.

Перезапустите Postfix и OpenDKIM:

sudo service postfix restart
sudo service opendkim restart

Теперь настройка стандарта DKIM завершена.

Тестирование настроек

Чтобы проверить, всё ли работает должным образом, отправьте пустое сообщение на check-auth@verifier.port25.com. Если настройки выполнены верно, вы получите ответ:

==========================================================
Summary of Results
==========================================================
SPF check:          pass
DomainKeys check:   neutral
DKIM check:         pass
Sender-ID check:    pass
SpamAssassin check: ham

Кроме того, можно отправить сообщение на адрес Gmail, к которому у вас есть доступ, и просмотреть заголовки полученного сообщения; в поле заголовка Authentication-Results должен находиться dkim=pass.

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;

Tags: , , , , ,

Комментарии (2)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *


*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>