Что такое DKIM
DKIM (DomainKeys Identified Mai) — метод идентификации письма по доменным ключам.
Часто в СПАМ-письмах в поле From подставляют адреса который не имеют ни какого отношения к отправителю. DKIM создан для того, что бы бороться с таким видом СПАМ’а.
Используя DKIM, почтовый сервер-получателя всегда может проверить, действительно ли пришедшее письмо отправлено с того сервера/домена, что указано в заголовках письма, в поле From.
Принцип работы DKIM
- Пользователь с e-mail’ом keeper@2keep.net отправляет письмо пользователю user@example.org.
- Почтовый сервер-отправителя (2keep.net) принимает письмо и подписывает его секретным (Private) ключом.
- Почтовый сервер-отправителя (2keep.net) отсылает подписанное письмо на почтовый сервер-получателя (example.org).
- Почтовый сервер-получателя делает запрос к DNS серверу и получает публичный ключ для домена 2keep.net и ADSP запись.
- Получив публичный ключ, сервер-получателя проверяет подпись и если она соответствует, то dkim=pass, а если нет то dkim=fail. Если dkim=fail, то почтовый сервер смотрит, что рекомендует делать adsp запись. Отбрасывать такие письма или пропускать дальше для дополнительной проверки на спам.
- Если 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:
Видим, что созданные записи появились в 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
Посмотрим заголовки:
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 настроен и работает.
Ещё рекомендую настроить в DNS-зоне для вашего домена SPF запись. Настраивается она легко и в Интернете множество инструкция на данную тему.
Ссылки:
- RFC 5617: DomainKeys Identified Mail (DKIM) Author Domain Signing Practices (ADSP)
- RFC 6376: DomainKeys Identified Mail (DKIM) Signatures
- DKIM wiki: https://ru.wikipedia.org/wiki/DomainKeys_Identified_Mail
- DKIM Wizard: www.port25.com/support/domainkeysdkim-wizard
- DNS Lookup tool: http://www.dnswatch.info
- Хабрахабр: Exim + DKIM на примере FreeBSD 8.2
- Securelist: Технология DKIM на страже вашей почты
Похожие записи...
Latest posts by Андрей Торженов (see all)
- Куда переходить с Helpdesk OTRS? Альтернативы OTRS - 27/02/2022
- Windows 11. Не работает обновление, не входит в OneDrive, OneNote и другие Microsoft сервисы - 29/01/2022
- Попытка взлома Mikrotik? - 24/12/2021
- После обновления до Proxmox 7.1 не запускаются виртуальные машины - 28/11/2021
- libflashplayer.so пропатченный от Time bomb - 11/02/2021
Да почта без DKIM и эцп щас в большинстве случаев идет в спам
Согласен, Иван. Настраивается он легко, так что пора всем его настраивать.
Спасибо за подробную информацию, Андрей! Возникла такая необходимость после смены VPS
спасибо, использовал Вашу статью при настройке почтовика.
Пожалуйста! Рад что пригодилось и спасибо за комментарий!
ADSP уже с 2013 года вроде не должен применяться, нет? https://datatracker.ietf.org/doc/status-change-adsp-rfc5617-to-historic/