Настройка DKIM в Exim и BIND

Автор: Андрей Торженов

email_dkimЧто такое DKIM

DKIM (DomainKeys Identified Mai) — метод идентификации письма по доменным ключам.

Часто в СПАМ-письмах в поле From подставляют адреса который не имеют ни какого отношения к отправителю. DKIM создан для того, что бы бороться с таким видом СПАМ’а.

Используя DKIM, почтовый сервер-получателя всегда может проверить, действительно ли пришедшее письмо отправлено с того сервера/домена, что указано в заголовках письма, в поле From.

Принцип работы DKIM

Принцип работы DKIM

Принцип работы DKIM

  1. Пользователь с e-mail’ом keeper@2keep.net отправляет письмо пользователю user@example.org.
  2. Почтовый сервер-отправителя (2keep.net) принимает письмо и подписывает его секретным (Private) ключом.
  3. Почтовый сервер-отправителя (2keep.net) отсылает подписанное письмо на почтовый сервер-получателя (example.org).
  4. Почтовый сервер-получателя делает запрос к DNS серверу и получает публичный ключ для домена 2keep.net и ADSP запись.
  5. Получив публичный ключ, сервер-получателя проверяет подпись и если она соответствует, то dkim=pass, а если нет то dkim=fail. Если dkim=fail, то почтовый сервер смотрит, что рекомендует делать adsp запись. Отбрасывать такие письма или пропускать дальше для дополнительной проверки на спам.
  6. Если dkim=pass, письмо доходит до получателя (возможно, предварительно, прошедшее дополнительные спам фильтры).

Что имеем

  • CentOS Linux release 7.1.1503 (Core)
  • Exim version 4.84 #2 built 10-Oct-2014 09:17:22
  • BIND 9.9.4-RedHat-9.9.4-18.el7_1.3

Создание пары Private и Public Key

Нам необходимо создать два ключа, секретный (Private Key) и публичный ключ (Public Key). Публичный ключ мы разместим в файле DNS-зоны домена, а секретный ключ будем использовать с почтовым сервером Exim для подписи писем.

Информация о методе шифрования и длине ключа из википедии:

В DKIM используются уже устоявшиеся криптографические инструменты. На данный момент для цифровой подписи авторы DKIM предлагают два алгоритма: RSA-SHA256 и RSA-SHA1, но в будущем возможно расширение технологии для поддержки других алгоритмов. Длина ключа ограничина значением в 4096 бит, так как больший по длине ключ не поместится в максимальный размер DNS UDP-пакета — 512 байт. Рекомендованная длина ключа составляет от 1024 до 2048 бит. Слишком большая длина создает вычислительную нагрузку на сервер для обработки каждого сообщения, а слишком малая(384 или 512 бит) — взламывается перебором за актуальное время с помощью ПК или с использованием сервиса облачных вычислений.

Ключи будем создавать используя OpenSSL, но можно воспользоваться сервисом  www.port25.com/support/domainkeysdkim-wizard.

Создание Private Key

Длинна приватного ключа 2048 бит.

[root@server ~]# openssl genrsa -out /etc/exim/2keep.net.key 2048

В результате будет:

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAs2WdcyOKgKVU2C/7CV774mu/b+XVaVixtuASB0wAOjaPnEcF
zwI84hu6wmy8cpPJlVImnf1gD/y/pA08+viVPPP/6bHfEiJjxOSjDnhF2V1+GlOr
l6IYxNxOxXPLw88QpDPak+ZO0yLU58UxJP1KcPdCuftEMFHWd5vuiHquBNYtkW6M
xaGcoX4hK8eE9CdrKDH7EtuLkkJ4uj0Mw4R7kd6FexfyppDXFGGu8oDN+7IUfCqn
KDkUxqb5Dh4rDD24Tn6KdDY5eFgjw7OIUr8HJbr9KNSE6lF3M5JLx9VX/ny3ec9O
DLm0FGpDQbXcRM+CTmX6H2jGkwJ4VcpqDwVZRwIDAQABAoIBABb2qenkIcWH5E1s
DuFLNEjua+nh7Kh4fv8evZALjXfmJgnmGXs/GRYEYKqkipbMDiC8DE9q8JH7U3in
bSffDBNqVFbQuvIyTr0UWz7t7Fr/mbW7Ahr919fTL44c3XdqGQI71P3bnDlwmvo0
Bq9qcM33CKaP4FGjGCXlYuo7ce0SWpL5JKiZ/9EgSPt7jHGia7Y3UL0nkcqwN4GX
pSZakbzAfGvCSolThzkx4rkwZbdIM0De6bgRo0kz1/F7YJgzyQK8PnzdaYBgX0Bs
dyn3jokVBarajSqm2W1o1QcMQ5hfhIVmDvcsrE+bcmJqg98miayWwURMKuZ95kSr
QxnaIzECgYEA2H2zMXICIirtkZ4P0W3lJ9l+T0eF5B9LmV3p+1hivx8/A4ECA/n7
bWKp3Y5N9g7r1r4Y+fLOUMGh32csu1h0Vxu6fYSKvI7Yhxc9iGWJkfjEPKCur39g
8Vj1oIpt2XTyspGCGaaS7sEIumv/AglKZzCbcvBjC6pnhtREc1wKDIkCgYEA1CLo
Mjqr0xvWSW8/CurIfi8lthgqM2NmneD5PIHf+JXU93y0HnlgJTlzV5lic5j6xg5S
SrP8trBdOfVzjgxVOoyJXHU9/Bwg7oYzytC3GwLtFgq4P+HkGbJiP2ZBqkcpvnK8
VVlv7whhMvdwC9TZ4pi6RHF5KqtN7Y1RHeDe408CgYEAszTKYsHHNlVmtsWqvmhD
6wrE3geMs9ucDuaIy4DMrPzGgrYF3xjNoiysBDTKIEcVvns53Z26X2sJ/g5AHw0H
sRvI8iIHXjK41orMat3yVR0iBDXWpHvC2cYT/cLZT8rZJCwDEAytUGoGOZswSpU6
O9UmuKx4sK1saVXJG90yjFECgYEAxHuUbzmSflUxNBEa5iSyENXgavmU1MYDfMWs
c5Oje95jQ9s4BWXMXI4KvB8wZftSgnEvXUu6DQfrQUyLfA0GP9V9QKrC/6iaA/M/
M2H/xr/+EkVZhKnYGMj1YN14gpupGWGx+Kd/Gnm7dXZjTEIYkV1+YPhtDs1dv2H9
uNvX9dcCgYAUdKsWTc3mrt6RUk9fB6CuTU2KWtd3jaubCXONQIsXQqvcgALm1ckl
yKHHbUdR7ej0aNCilt2yjBSVnGLSiXtocwXftcFPc/48uYxzRK2UJXM7D7QxoKxk
06VzNJY69Y14jybcgH3d1oYtUAF4BPQQHsle1BcbLWENudHU2Z6S+w==
-----END RSA PRIVATE KEY-----

Создание Public Key на основе Private key

[root@server ~]# openssl rsa -in /etc/exim/2keep.net.key -pubout

В результате на экране отобразится:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs2WdcyOKgKVU2C/7CV77
4mu/b+XVaVixtuASB0wAOjaPnEcFzwI84hu6wmy8cpPJlVImnf1gD/y/pA08+viV
PPP/6bHfEiJjxOSjDnhF2V1+GlOrl6IYxNxOxXPLw88QpDPak+ZO0yLU58UxJP1K
cPdCuftEMFHWd5vuiHquBNYtkW6MxaGcoX4hK8eE9CdrKDH7EtuLkkJ4uj0Mw4R7
kd6FexfyppDXFGGu8oDN+7IUfCqnKDkUxqb5Dh4rDD24Tn6KdDY5eFgjw7OIUr8H
Jbr9KNSE6lF3M5JLx9VX/ny3ec9ODLm0FGpDQbXcRM+CTmX6H2jGkwJ4VcpqDwVZ
RwIDAQAB
-----END PUBLIC KEY-----

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

Настройка DKIM в DNS (BIND)

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

В файле DNS-зоны создаем запись mail._domainkey.2keep.net. (тут и в дальнейшем, меняем 2keep.net на ваш домен) типа TXT со значением: k=rsa\; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB…

Вместо mail можно использовать другой селектор, например dkim или другой. В дальнейшем, этот селектор нам понадобится во время настройки Exim.

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB… это фрагмент публичного ключа, но тут есть тонкость. BIND не понимает строки длинней 255 символов и поэтому, если вы пропишите публичный ключ в виде одной длинной строки, BIND при перезагрузке выдаст ошибку:

zone 2keep.net/IN: loading from master file masters/2keep.net failed: syntax error
zone 2keep.net/IN: not loaded due to errors.
other/2keep.net/IN: syntax error

Прописывать ключ нужно следующим образом:

mail._domainkey.2keep.net. IN TXT ( "k=rsa\; "
                                    "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs2WdcyOKgKVU2C/7CV77"
                                    "4mu/b+XVaVixtuASB0wAOjaPnEcFzwI84hu6wmy8cpPJlVImnf1gD/y/pA08+viV"
                                    "PPP/6bHfEiJjxOSjDnhF2V1+GlOrl6IYxNxOxXPLw88QpDPak+ZO0yLU58UxJP1K"
                                    "cPdCuftEMFHWd5vuiHquBNYtkW6MxaGcoX4hK8eE9CdrKDH7EtuLkkJ4uj0Mw4R7"
                                    "kd6FexfyppDXFGGu8oDN+7IUfCqnKDkUxqb5Dh4rDD24Tn6KdDY5eFgjw7OIUr8H"
                                    "Jbr9KNSE6lF3M5JLx9VX/ny3ec9ODLm0FGpDQbXcRM+CTmX6H2jGkwJ4VcpqDwVZ"
                                    "RwIDAQAB" )
Обратите внимание, мы разбиваем ключ на группы.
Если у вас несколько доменов с которых вы отправляете почту, то создайте и для них пару ключей и сделайте аналогичные настройки.

Добавляем ADSP запись

ADSP (Author Domain Signing Practices, http://tools.ietf.org/search/rfc5617 ) — практики использования DKIM в домене.

ADSP это опциональное расширение DKIM, которое позволяет сообщать почтовым серверам-получателям, что делать с письмом пришедшим с якобы нашего домена, но не имеющее подписи.

Запись ADSP имеет три значения:

  • unknown — сервер может подписывать некоторые или все письма;
  • all — сервер подписывает все письма;
  • discardable — сервер подписывает все письма, но если письмо приходит не подписанное или с неверной подписью, то домен предлагает отклонить данное письмо.

Я использую тип all, т.к. только с моего почтового сервера будут отправляться письма и соответственно все они будут подписаны. Тип discardable, слишком радикален. Есть вероятность, что во время следования письма, его заголовки и подпись могут слегка изменится и письмо не дойдет, т.к. будет отброшено сервером получателем.

Запись ADSP в DNS-зоне:

_adsp._domainkey.2keep.net. IN TXT "dkim=all"

Перезапускам BIND

[root@server ~]# systemctl restart named

Проверяем DNS-зону

Проверять DNS будем с помощью утилиты dig, а также можно воспользоваться сервисом http://www.dnswatch.info

Проверка с помощью dig:

[root@server ~]# dig mail._domainkey.2keep.net TXT

; <<>> DiG 9.9.4-RedHat-9.9.4-18.el7_1.3 <<>> mail._domainkey.2keep.net TXT
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 39845
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 4

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;mail._domainkey.2keep.net.     IN      TXT

;; ANSWER SECTION:
mail._domainkey.2keep.net. 3600 IN      TXT     "k=rsa\; " "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsYMIEZUND6KxV9UvC/R1" "6rXR32B+rfK8jnQuAeAU/AtJmmt2nKBdZohXLJkfpJAA3GqJkO52bRGoBob4w5M4" "a3303Di9ZKcae5luSwPWt8H0oF4B8hYj2cYQy72iIpFec7hXilHuZhUmg7m5KV2M" "vqBZUReV97IfAuptI+u9+7fRdgJq1JCqb3xCwQAb34P9AwmT8QUo8a/uIOXCO+6m" "rF3OLyidlSomI6S2lfyhW0zCWU++ry2uskulnD9CXS1E4YT0F3BNAiEVGpA4xP+v" "yncBfY60SLGUBSy5yehtOEXORLPQht28EnzqrVvVVoQtI1KNzoErGeIXjzeoIJ0k" "wQIDAQAB"



[root@server ~]# dig _adsp._domainkey.2keep.net TXT

; <<>> DiG 9.9.4-RedHat-9.9.4-18.el7_1.3 <<>> _adsp._domainkey.2keep.net TXT
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24371
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 3

;; QUESTION SECTION:
;_adsp._domainkey.2keep.net.    IN      TXT

;; ANSWER SECTION:
_adsp._domainkey.2keep.net. 3600 IN     TXT     "dkim=all"


Проверка с помощью DNSWatch:

DNSWatch

DNSWatch

Видим, что созданные записи появились в DNS-зоне.

Настройка почтового SMTP-сервера Exim

В конфигурационном файле Exim (/etc/exim/exim.conf) находим транспорт remote_smtp и правим его:

remote_smtp:
  driver = smtp
  dkim_domain = DKIM_DOMAIN
  dkim_selector = mail
  dkim_private_key = DKIM_PRIVATE_KEY

dkim_selector — указываем тот селектор, что мы выше прописывали в DNS-зоне. В данном случае это mail.

В начало конфигурационного файла Exim (/etc/exim/exim.conf) добавляем нижеследующие параметры:

## DKIM:
DKIM_DOMAIN                     = ${lc:${domain:$h_from:}}
DKIM_FILE                       = /etc/exim/${lc:${domain:$h_from:}}.key
DKIM_PRIVATE_KEY                = ${if exists{DKIM_FILE}{DKIM_FILE}{0}}

Данная конструкция позволит использовать разные Private Key для разных доменов (домен берется из поля From).

В данном случае секретные (Private) ключи лежат в подкаталоге /etc/exim:

[root@server /]# ls -al /etc/exim/
total 120
drwxr-xr-x   2 root root  4096 Aug 18 13:55 .
drwxr-xr-x. 88 root root  4096 Aug  6 14:48 ..
-r--------   1 exim root  1674 Aug  9 21:13 2keep.net.key
-r--------   1 exim root  1674 Aug  9 21:32 azlk-club.ru.key

Мой почтовый сервер используется для двух сайтов 2keep.net и azlk-club.ru. Если письмо отправляется с сайта 2keep.net и в поле From: noreplay@2keep.net то и подписывается письмо секретным ключом 2keep.net.key, а если письмо отправляется с сайта azlk-club.ru и в поле From: noreplay@azlk-club.ru, то подписывается azlk-club.ru.key.

Конечно в DNS-зоне azlk-club.ru у меня тоже прописан публичный ключ и ADSP.

Перезапускаем Exim

[root@server ~]# systemctl restart exim

 Проверка DKIM

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

Результаты на Gmail

Результаты теста DKIM в Gmail

Результаты теста DKIM в Gmail

Посмотрим заголовки:

Received-SPF: pass (google.com: domain of root@2keep.net designates 94.45.172.192 as permitted sender) client-ip=94.45.172.192;
Authentication-Results: mx.google.com;
       spf=pass (google.com: domain of root@2keep.net designates 94.45.172.192 as permitted sender) smtp.mailfrom=root@2keep.net;
       dkim=pass header.i=@2keep.net
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=2keep.net; s=mail;
    h=From:Message-Id:Content-Transfer-Encoding:Content-Type:MIME-Version:Subject:To:Date; bh=+qlNhYuQiot52MMJ53YSV0rt4q35P6JeHyKLUgbd7Ek=;
    b=dzqxpbD5Imupkd2r4knNIQmTAWNiQrz3+MjUHlg0ifvxyTMARmh8opg3ehrlxMSZccegoio6Yt21qte+0U2YsRfnSX40cu/agqCNIDedsTHvXgNy/pZO747JD0W4LtTGqpBJTxvm0NBOpyuiV3yafMzJaQjHaNKxMtEkH++qnO4ttGL8XTMyv+imtui6yXE7Vgy84Wb1m6DoB++G/zTJsNnr6HfI7j/XneaiIbzkbxJb3WI7YubO202IBbD+R6M+2BrDZZTRq7xi5VaqVFgU7p8cJBkko6rNAoj/OkF7KrIdMAe16cN/tamEEKUKSCOeE9ZI7bqgXZwAD9QwZgYWGw==;

Мы видим: dkim=pass

Результаты Yandex

Результаты теста DKIM в Yandex

Результаты теста DKIM в Yandex

DKIM настроен и работает.

Ещё рекомендую настроить в DNS-зоне для вашего домена SPF запись. Настраивается она легко и в Интернете множество инструкция на данную тему.

Ссылки:

The following two tabs change content below.
В профессиональной сфере занимаюсь всем, что связанно с IT. Основная специализация - VoIP и сети передачи данных. Стараюсь не заниматься Windows серверами (но иногда приходится) и 1С.

Настройка DKIM в Exim и BIND: 6 комментариев

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