Pull to refresh

Exim + DKIM на примере FreeBSD 8.2

Reading time 4 min
Views 43K

Что такое DKIM и как оно работает


DKIM (расшифровывается как DomainKeys Identified Mail) — метод идентификации письма по доменным ключам.
DKIM настраивается на почтовом сервере для того, чтобы подписывать исходящие письма цифровой подписью. Наличие такой подписи в заголовке отправленного письма сообщает серверу-получателю, что оно действительно было отправлено с указанного домена.
Известно, что в СПАМ-письмах часто в поле From: ставят е-mail, не имеющий совершенно никакого отношения к отправителю. В этом случае DKIM поможет распознать реальное письмо от спама. В отличие от других методов цифровой подписи письма, DKIM совместим с существующими форматами и протоколами и может быть плавно интегрирован в имеющиеся системы доставки и получения почты.

Подпись письма происходит на SMTP-сервере с помощью секретного ключа (Private key), а расшифровка подписи происходит на сервере-получателе или клиентской программе с помощью публичного ключа (Public key). Что интересно, публичный ключ хранится в DNS, что позволяет убить сразу двух зайцев. Во-первых, нет необходимости прикладывать Public key с каждым письмом для его расшифровки. А во-вторых, в таком случае DKIM позволяет сообщать серверам-получателям что делать с письмом, которое не имеет цифровой подписи, но якобы отправлено от вас. Эта технология называется ADSP (Author Domain Signing Practices). ADSP также хранится в DNS SMTP-сервера и доступен всем и отовсюду.

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


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

По результатам исследований в наше время уже возможно расшифровать данные, зашифрованные RSA с длиной ключа 1024 бита. Поэтому оптимальным на сегодня будет ключ RSA длиной 2048 бит.
Для генерации пары ключей можно воспользоваться online-сервисом www.port25.com/support/domainkeysdkim-wizard или же воспользоваться openssl в консоли.

Генерим секретный ключ через openssl

root@server# openssl genrsa -out /usr/local/etc/exim/example.com.key 2048

На выходе имеем ключ вида:
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDT1tSzyG2Zch4LTgGPbn/8H535Vd+friNn/gBsV7rFNVZdxapD
dOUzeATUTbAG/3Ux7vJxYd6i982IajVz0b2dsmkdDzctC4EdJsLcpCpyf3x21nYZ
oJO2GjaFW65MNj7dU7BXDerLTE+zTu/Q4vs4ZqCA39CtbmetjBS9l/NsMQIDAQAB
AoGBAM2ZyVFAatkQSBaivСLwlWknapSPgv4g7h5FSTXeI9i5frx+V1UnRDki+FTx
nbH9CErRZh8jZQj4x1Pp+T0SyRtb62ydJooPYIpNlTt71cgZNwH174uFt4HevKmC
MJIhzaufEZYhamS4NQOR+4FakdZX2T8yzuvwDwkplJP2tO/tAkEA7RDltCTOShdd
sJYs0wjs1mDXUiSz0giFAYvMBvOelpyjJl9Pi1A0CNcD4WdvAl0Xo5aRMVrTXRzf
....
-----END RSA PRIVATE KEY-----

Генерим публичный ключ на основе секретного

root@server# openssl rsa -in /usr/local/etc/exim/example.com.key -pubout

На выходе получим что-то вроде:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA3GNADCBiQKBgQDT1tSzyG1Zch4LTgGPbn/8H535
Vd+friNn/gBsV7rFNVZdxapDd0UzeATUTbAG/3Ux7vJxYd6i982IajVz0b2dsmkd
DzctC4EdJsLcpCpyf3x21nYZoJO2GjaFW65MNj7dU7BXDerLTE+zTu/Q4vs4ZqCA
...
-----END PUBLIC KEY-----

Правим DNS

Добавляем DKIM селектор

Создаем в DNS запись mail1._domainkey.example.com типа TXT со значением:
k=rsa\; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDT1tSzyG1Zch4LTgGPbn/8H535Vd+friNn/gBsV7rFNVZdxapDdOUzeATUTb...

(В данном случае это синтаксис для DNS сервера на BIND, и другие DNS сервера могут не требовать знак “\” для экранирования “;”.)
Вместо mail1 можете использовать другой селектор, например, dkim, server, public итд. Подобных записей Public key для DKIM может быть несколько.
Необходимо дождаться, когда обновится ваша DNS запись на других серверах. Это может занять несколько часов.
Проверять свою DKIM запись можно, например, с помощью сервиса DNSWatch.

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

Создаем в DNS запись _adsp._domainkey.example.com типа TXT со значением dkim=unknown.
Помимо unknown параметр dkim может иметь еще два значения — all и discardable.
  • unknown — домен может подписывать некоторые или все письма.
  • all — все письма с домена подписаны.
  • discardable — все письма с домена подписаны. Кроме того, если письмо приходит без валидной подписи в связи с изменениями в пути, прохождением через путь без доступа к подписывающему ключу или по другим причинам, домен призывает адресата отклонить его.

Правим конфиг Exim

В файл /usr/local/etc/exim/configure добавляем в начало:
## DKIM:
DKIM_DOMAIN                     = ${lc:${domain:$h_from:}}
DKIM_FILE                       = /usr/local/etc/exim/${lc:${domain:$h_from:}}.key
DKIM_PRIVATE_KEY                = ${if exists{DKIM_FILE}{DKIM_FILE}{0}}

Эта конструкция позволит использовать разные Private key для разных доменов.
Подправляем транспорт remote_smtp:
        remote_smtp:
                driver = smtp
                dkim_domain           = DKIM_DOMAIN
                dkim_selector         = mail1
                dkim_private_key      = DKIM_PRIVATE_KEY

Здесь mail1 — наш селектор.

Сохраняем конфиг и перечитываем его:
root@server# service exim reload

Проверка DKIM


Проверить DKIM можно разными способами. Я опишу два из них.
1) Известно, что Gmail проверяет DKIM запись в письмах. Отправляем письмо на свой gmail ящик и смотрим заголовки.
Находим запись вида
Authentication-Results: mx.google.com;
       spf=pass (google.com: domain of info@example.com designates 100.12.94.241 as permitted sender) smtp.mail=info@example.com;
       dkim=pass header.i=@example.com

dkim=pass означает, что DKIM настроен и прошел успешную проверку.
2) Воспользоваться DKIM-чекером от сервиса www.port25.com.
Отправляем тестовое письмо на адрес check-auth2@verifier.port25.com и ждем от него обратно результат проверки.

Ссылки:
DKIM wiki ru.wikipedia.org/wiki/DomainKeys_Identified_Mail
DKIM ADSP www.dkim.org/specs/draft-ietf-dkim-ssp-04.html
DKIM wizard www.port25.com/support/domainkeysdkim-wizard
HOWTO: Exim & DKIM forum.lissyara.su/viewtopic.php?f=20&t=22162
man openssl
DNSWatch www.dnswatch.info
Tags:
Hubs:
+6
Comments 10
Comments Comments 10

Articles