Как настроить DKIM, DKIM ключи для Postfix

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

 

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

Статья в немалой степени является переводом с авторскими дополнениями

 

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

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

 

 

Добавляем кубличный ключ в 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 — обычно кавычки не требуются.

 

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

201707._domainkey IN TXT v=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:12345@192.0.2.1" # 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=server-gu.ru;
s=201707; t=1499711674;
bh=N7ZdhdALx/4YZRLPhhJ+6x7c4DNpo8MD4N3sjFXCGDc=;
h=To:Subject:Date:From:From;
b=aTchm7PJN3la1DnmYRzs+AHIneRuVT0rYeilvp2Ls8IFgY+moLsBVIP8y9Owhy4mP
t8ViRZ2y/1F/CEU8cnRV5AdAcS/6eIGWeFrstBXFEr5/JviRty41sQ7VMVZkyAHuZC
+Nl406i0VHab7D8ZRGtdtRVAoZkg6vcII2QJq79NIqMt4M0bzwezxYUrxwlFUkKBxX
FMqW1uWI1bKLIb15X8V/8Ys50RkHOs54nnf26yamT2laEcXM9rsw0IbaXQpe0oCpnS
w/u9QAe8/OjzuFVMlOLN+mNTDtwLXmAcyIvxCJT23dE+l/XprjuGPn2JJWvOi53qaO
g1KcO5YibzZQA==