Как настроить DKIM подпись для Postfix


Рассмотрим как настроить DKIM подпись для почтового сервера на основе Postfix. DKIM является подпись, которой подписываются все письма, отправляемые с сервера с определенного домена. Наличие DKIM снижает возможность подделки отправителя, а соответственно и вероятность попадания писем в спам на стороне получателя.



Включение DKIM представляет собой генерирование публичной и приватной записей, размещение публичной в DNS, приватной на сервере и настройку соответствующим образом почтового сервера.



Устанавливаем пакеты (используем Debian)

apt-get install opendkim opendkim-tools postfix-policyd-spf-python postfix-pcre



Добавляем пользователя postfix в группу opendkim

adduser postfix opendkim



Открываем основной конфигурационный файл пакета и приводим его к представленному ниже виду:



mcedit /etc/opendkim.conf

# This is a basic configuration that can easily be adapted to suit a standard
# installation. For more advanced options, see opendkim.conf(5) and/or
# /usr/share/doc/opendkim/examples/opendkim.conf.sample.

# Log to syslog
Syslog          yes
# Required to use local socket with MTAs that access the socket as a non-
# privileged user (e.g. Postfix)
UMask           002
# OpenDKIM user
# Remember to add user postfix to group opendkim
UserID          opendkim

# Map domains in From addresses to keys used to sign messages
KeyTable        /etc/opendkim/key.table
SigningTable        refile:/etc/opendkim/signing.table

# Hosts to ignore when verifying signatures
ExternalIgnoreList  /etc/opendkim/trusted.hosts
InternalHosts       /etc/opendkim/trusted.hosts

# Commonly-used options; the commented-out versions show the defaults.
Canonicalization    relaxed/simple
Mode            sv
SubDomains      no
#ADSPAction     continue
AutoRestart     yes
AutoRestartRate     10/1M
Background      yes
DNSTimeout      5
SignatureAlgorithm  rsa-sha256

# Always oversign From (sign using actual From and a null From to prevent
# malicious signatures header fields (From and/or others) between the signer
# and the verifier.  From is oversigned by default in the Debian package
# because it is often the identity key used by reputation systems and thus
# somewhat security sensitive.
OversignHeaders     From


Устанавливаем на файл права

chmod 644 /etc/openfkim.conf



Создаем необходимые каталоги

mkdir/etc/opendkim

mkdir /etc/opendkim/keys



Рекурсивно меняем владельца и указываем нужные права доступа

chown -R opendkim: /etc/opendkim

chmod 600 /etc/opendkim/keys



Далее необходимо создать файлы которые будут проверяться opendkim


mcedit /etc/opendkim/signing.table

*@example.com example

example.com — используемое доменное имя

example — короткая версия доменного имени без указания зоны



Создаем еще один файл и помещаем в него приведенную ниже строку

mcedit /etc/opendkim/key.table

example example.com:YYYYMM:/etc/opendkim/keys/example.private



example и example.com заменяются по тому же принципу, что и в предыдущем случае. YYYYMM замещается текущим годом и месяцем, например 201707 — это селектор который используется при запросе к DNS. Третья секция — путь к ключу для домена на сервере (ключ может размещаться в другом месте файловой системы)



Создаем /etc/opendkim/trusted.hosts в котором перечисляем список хостов
27.0.0.1
::1
localhost
myhostname
myhostname.example.com
example.com


В качестве myhostname указываем имя сервера — можно узнать выполнив в консоли одноименную команду.



Проверяем права и при необходимости корректируем (пользователь opendkim должен владеть всеми файлами, а каталоги с ключами должны быть доступны только владельцу):


chown -R opendkim: /etc/opendkim

chmod -R go-rwx /etc/opendkim/keys



Генерируем ключ

opendkim-genkey -b 2048 -h rsa-sha256 -r -s YYYYMM -d example.com -v


В результате получаются 2 файла: YYYYMM.private с приватным ключем (переименовываем в example.private и помещаем в /etc/opendkim/keys/) и YYYYMM.txt (переименовываем в example.txt и помещаем запись в DNS — тип записи TXT)



Ключ генерируется свой для каждого домена если подписывать письма нужно несколькими ключами


chown -R opendkim: /etc/opendkim

chmod -R 600 /etc/opendkim/keys



Перезапускаем Opendkim и убеждаемся в том, что ошибок нет

/etc/init.d/opendkim restart



Добавляем публичный ключ DKIM в DNS, по нему будет проверяться подпись


Прежде всего откроем полученный ранее файл example.txt


cat example.txt

201510._domainkey IN TXT ( "**v=DKIM1; h=rsa-sha256; k=rsa; s=email; "
"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu5oIUrFDWZ......**" ) ; ----- DKIM key 201510 for example.com



Ключ возьмем отсюда — скопировать нужно все начиная с кавычки перед v=DKIM1 (не включая квычку) до закрывающей кавычки.

Также заменяем в записи  h=rsa-sha256 на h=sha256 и убираем кавычки и пробелы в середине записи — ключ должен идти беспрерывно.

Кавычки в начале и конце записи в некоторых случая потребуется сохранить , но обычно кавычки не требуются. Всё требуется от редактора DNS провайдера DNS.



Должно получиться примерно так:

201707._domainkeyIN TXTv=DKIM1; h=sha256; k=rsa; s=email; p=MIIBIjANBgkqhkiG9w0BAQEF5sxepsy…..


Здесь YYYYMM_domainkey — имя записи для домена



Проверяем- нулевой вывод будет означать, что все получилось

opendkim-testkey -d example.com -s YYYYMM

Стоит учитывать, что данные обновляются не сразу (это может занимать до 72 часов и зависит от TTL у провайдера)



Подключаем настроенный Opendkim к Postfix


Создаем рабочую директорию и задаем права  для того чтобы мог создаться сокет

mkdir /var/spool/postfix/opendkim

chown opendkim:postfix /var/spool/postfix/opendkim



Далее указываем сокет непосредственно в конфигурационном файле Postfix


mcedit /etc/default/opendkim

# Command-line options specified here will override the contents of
 # /etc/opendkim.conf. See opendkim(8) for a complete list of options.
 #DAEMON_OPTS=""
 #
 # Uncomment to specify an alternate socket
 # Note that setting this will override any Socket value in opendkim.conf
 SOCKET="local:/var/spool/postfix/opendkim/opendkim.sock"
 #SOCKET="inet:54321" # listen on all interfaces on port 54321
#SOCKET="inet:12345@localhost" # listen on loopback on port 12345
#SOCKET="inet:[email protected]" # listen on 192.0.2.1 on port 12345


Значение имеет только незакомментированная строка SOCKET="local:/var/spool/postfix/opendkim/opendkim.sock" — сокета по данному пути пока нет — он создастся после перезапуска сервисов



Редактируем /etc/postfix/main.cf и добавляем поддержку демона Opendkim


Приведенные строки обычно добавляют после директивы smtpd_recipient_restrictions


# Milter configuration
# OpenDKIM
milter_default_action = accept
 # Postfix ≥ 2.6 milter_protocol = 6, Postfix ≤ 2.5 milter_protocol = 2
milter_protocol = 6
 smtpd_milters = local:/opendkim/opendkim.sock
 non_smtpd_milters = local:/opendkim/opendkim.sock


Если на сервере используется антиспам система — участок конфигурационного файла может выглядеть иначе:

mailbox_command =
 smtpd_recipient_restrictions = permit_mynetworks,reject_unauth_destination,check_policy_service unix:private/policyd-spf
 smtpd_mailters = local:/opendkim/opendkim.sock
 #smtpd_mailters = local:/opendkim/opendkim.sock, unix:/clamav/clamav-mailter.ctl, unix:/spamass/spamass.sock
 non_smtpd_milters = local:/opendkim/opendkim.sock
 #check_policy_service inet:127.0.0.1:10023


Теперь перезапускаем сервисы и проверяем результат

/etc/init.d/opendkim restart

/etc/init.d/postfix restart



Проверяем отправляя письмо на ящик на стороннем сервере и просматривая служебные заголовки — в них должно содержаться указание на то, что письмо подписывается


DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=example.com;
s=201707; t=1499711674;
bh=N7ZdhdALx/4YZRLPhhJ+6x7c4DNpo8MD4N3sjFXCGDc=;
h=To:Subject:Date:From:From;
b=aTchm7PJN3la1DnmYRzs+AHIneRuVT0rYeilvp2Ls8IFgY+moLsBVIP8y9Owhy4mP

g1KcO5YibzZQA==



Вопрос о том как настроить DKIM подпись на сервере выполнен.

Читайте также про SPF запись DNS. Проверить DKIM и SPF можно используя сервис.


настроить DKIM подпись


Он предлагает адрес для отправки письма, после отправки проверяет заголовки и выводит результат.

Сказать спасибо