DKIM: различия между версиями

Материал из Webko Wiki
Перейти к навигации Перейти к поиску
(Новая страница: «Хочу поделиться своим небольшим опытом прикручивания DKIM (DomainKeys Identified Mail) к своему домену…»)
 
 
(не показаны 4 промежуточные версии этого же участника)
Строка 1: Строка 1:
Хочу поделиться своим небольшим опытом прикручивания DKIM (DomainKeys Identified Mail) к своему домену и почтовому серверу.
+
== Из описания DKIM в Wiki ==
  
Мы имеем:
+
'''DomainKeys Identified Mail''' метод E-mail аутентификации.
  
    Платформа: Windows WebServer 2008;
+
Технология DomainKeys Identified Mail (DKIM) объединяет несколько существующих методов антифишинга и антиспама с целью повышения качества классификации и идентификации легитимной электронной почты. Вместо традиционного IP-адреса, для определения отправителя сообщения DKIM добавляет в него цифровую подпись, связанную с именем домена организации. Подпись автоматически проверяется на стороне получателя, после чего, для определения репутации отправителя, применяются «белые списки» и «чёрные списки».
    Сервер DNS: Bind 9.7;
 
    Почтовый сервер: hMailServer 5.3.3.
 
  
 +
В технологии DomainKeys для аутентификации отправителей используются доменные имена. DomainKeys использует существующую систему доменных имен (DNS) для передачи открытых ключей шифрования.
  
Задача:
+
== Для работы с DKIM нам нужно ==
  
    Разобраться в системе подписи сообщений DKIM, что бы gmail признал её валидной и выдал заветные: dkim=pass.
+
#Поддержка DKIM почтовым сервером для подписывания отправляемой почты;
 +
#Получение пары приватного и публичного ключа;
 +
#Занесение в DNS домена необходимых записей о наличии поддержки DKIM.
  
 +
=== EXIM ===
  
 +
Поддерживает DKIM, настроим его:
 +
vim /etc/mail/exim.conf
  
Начнем с начала. Что такое DKIM вообще и что нам нужно, что бы наша почтовая система отправляла почту с поддержкой DKIM.
+
Добавим следующие строчки ниже "begin transports":
 +
DKIM_DOMAIN = ${lc:${domain:$h_from:}}
 +
DKIM_FILE = /etc/mail/domains/${lc:${domain:$h_from:}}/dkim.pem #- важно!!!! Пишем путь к приватному ключу
 +
DKIM_PRIVATE_KEY = ${if exists{DKIM_FILE}{DKIM_FILE}{0}}
 +
 +
Также заменяем:
  
Из описания DKIM в Wiki:
+
remote_smtp:  
 +
driver = smtp
  
    DomainKeys Identified Mail метод E-mail аутентификации.
+
На:
    Технология DomainKeys Identified Mail (DKIM) объединяет несколько существующих методов антифишинга и антиспама с целью повышения качества классификации и идентификации легитимной электронной почты. Вместо традиционного IP-адреса, для определения отправителя сообщения DKIM добавляет в него цифровую подпись, связанную с именем домена организации. Подпись автоматически проверяется на стороне получателя, после чего, для определения репутации отправителя, применяются «белые списки» и «чёрные списки».
 
    В технологии DomainKeys для аутентификации отправителей используются доменные имена. DomainKeys использует существующую систему доменных имен (DNS) для передачи открытых ключей шифрования.
 
  
 +
remote_smtp:
 +
driver = smtp
 +
dkim_domain = DKIM_DOMAIN
 +
dkim_selector = mail # - выбранный нами селектор.
 +
dkim_private_key = DKIM_PRIVATE_KEY
  
Для работы с DKIM нам нужно:
+
=== Генерация ключей ===
  
    Поддержка DKIM почтовым сервером для подписывания отправляемой почты;
+
openssl genrsa -out /etc/mail/domains/$domain$/dkim.pem 3-1024 &>/dev/null
    Получение пары приватного и публичного ключа;
+
openssl rsa -pubout -in /etc/mail/domains/$domain$/dkim.pem -out/etc/mail/domains/$domain$/dkim.pub &>/dev/null
    Занесение в DNS домена необходимых записей о наличии поддержки DKIM.
+
chown exim:mail /etc/mail/domains/$domain$/dkim.*
  
 +
=== Занесение в DNS домена необходимых записей ===
  
С поддержкой DKIM почтовым серверов всё вполне понятно. hMailServer с версии 5.1 поддерживает подпись исходящей корреспонденции ключом.
+
Добавляем txt записи в домен
  
Теперь необходимо найти, как сформировать пару секретного и публичного ключа. После перебора нескольких вариантов я остановился на web-утилите сервиса port25.com которая, кроме формирования необходимых ключей, так же генерирует и подсказку по DNS записям:
+
mail._domainkey IN TXT "k=rsa; p=MIGfMA0GCSqGS … wIDAQAB"
www.port25.com/support/support_dkwz.php
+
_domainkey IN TXT "t=y; o=~;"
  
Небольшое пояснение по поводу некого поля «domain selector». Данное поле позволяет привязать к одному домену несколько DKIM записей для разных нужд (например для разных почтовых серверов). В моём случае у меня только один почтовый сервер и у меня нет необходимости в селекторе, так что в роли селектора я выбрал просто «mail».
+
''p = cat /etc/mail/domains/$domain$/dkim.pub |grep -v ' KEY---' |tr -d '\n'''
  
Полученный приватный ключ сохраняем на сервер в папку, к которой имеет доступ почтовый сервер. Публичный ключ в принципе можно не сохранять в виде файла. Он нам пригодиться только для внесения необходимой записи в DNS. В конфигурации домена в hMailServer нам необходимо указать путь к приватному файлу ключа, а так же указать выбранный селектор (напомню, я в виде селектора взял «mail»).
 
 
В файле DNS-зоны нам необходимо указать записи вида:
 
 
    _domainkey.example.com. TXT "t=s; o=~;"
 
    mail._domainkey.example.com. TXT "k=rsa\; t=s\; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQmO9AuWRbWPgl/jzDPQodrLfFLFqYYi6bCBnsTOCOJQrFbGgiR1C01j4zLw8XgG3rQ0WAaeg6Z  /y39Ah7IONfs5gQuK6eGZMmYwIsZyz2dQoUDmDLCb1WygpkrqsCbyPw3SWGihM4iChOwo7Ovo2mTOWOf5ejeZcP2qqNb9nRMQIDAQAB"
 
 
 
Где «mail» перед _domainkey во второй записи — это не что иное, как наш выбранный селектор, а длинный набор символов в той же записи идущий после «p=» — это наш публичный ключ.
 
 
Вроде бы всё. Теперь попробуем отправить письмо с нашего почтового сервера на почту gmail, так как доподлинно известно, что gmail проверяет DKIM. Смотрим в полученное письмо в gmail и видим заветные строки:
 
 
    Authentication-Results: mx.google.com; spf=pass (google.com: domain of [email protected] designates 123.123.123.123 as permitted sender) [email protected]; dkim=pass [email protected]
 
 
 
Поздравляем меня с успешным покорением DKIM ))), чего и вам желаю. Удачи.
 
 
UPD: Для получения пары ключей без использования внешних сервисов можно воспользоваться OpenSSL:
 
 
    openssl.exe genrsa -out tstpriv.pem 1024 — генерим секретный ключ (1024 — длина ключа).
 
    openssl.exe rsa -pubout -in tstpriv.pem -out tstpub.pem — получаем публичный ключ из секретного
 
 
 
Спасибо lorc за дополнение.
 
 
UPD 2: Небольшое дополнение от nshopik:
 
Так же можно у домена прописать ADSP запись (RFC5617) — это позволит принимающему серверу понять, должно ли ваше письмо быть подписано или нет.
 
Запись выгладит таким образом:
 
 
    _adsp._domainkey.example.com. TXT "dkim=all"
 
 
 
Значений dkim= может быть три:
 
 
    all — Все письма должны быть подписаны
 
    discardable — Не подписанные письма не должны приниматься
 
    unknown — Аналогично отсутствию записи
 
 
[[Категория:Mail]]
 
[[Категория:Mail]]

Текущая версия на 02:45, 27 января 2016

Из описания DKIM в Wiki

DomainKeys Identified Mail метод E-mail аутентификации.

Технология DomainKeys Identified Mail (DKIM) объединяет несколько существующих методов антифишинга и антиспама с целью повышения качества классификации и идентификации легитимной электронной почты. Вместо традиционного IP-адреса, для определения отправителя сообщения DKIM добавляет в него цифровую подпись, связанную с именем домена организации. Подпись автоматически проверяется на стороне получателя, после чего, для определения репутации отправителя, применяются «белые списки» и «чёрные списки».

В технологии DomainKeys для аутентификации отправителей используются доменные имена. DomainKeys использует существующую систему доменных имен (DNS) для передачи открытых ключей шифрования.

Для работы с DKIM нам нужно

  1. Поддержка DKIM почтовым сервером для подписывания отправляемой почты;
  2. Получение пары приватного и публичного ключа;
  3. Занесение в DNS домена необходимых записей о наличии поддержки DKIM.

EXIM

Поддерживает DKIM, настроим его:

vim /etc/mail/exim.conf
Добавим следующие строчки ниже "begin transports":
DKIM_DOMAIN = ${lc:${domain:$h_from:}}
DKIM_FILE = /etc/mail/domains/${lc:${domain:$h_from:}}/dkim.pem #- важно!!!! Пишем путь к приватному ключу
DKIM_PRIVATE_KEY = ${if exists{DKIM_FILE}{DKIM_FILE}{0}}

Также заменяем:

remote_smtp: 
driver = smtp 

На:

remote_smtp: 
driver = smtp 
dkim_domain = DKIM_DOMAIN 
dkim_selector = mail # - выбранный нами селектор.
dkim_private_key = DKIM_PRIVATE_KEY

Генерация ключей

openssl genrsa -out /etc/mail/domains/$domain$/dkim.pem 3-1024 &>/dev/null
openssl rsa -pubout -in /etc/mail/domains/$domain$/dkim.pem -out/etc/mail/domains/$domain$/dkim.pub &>/dev/null
chown exim:mail /etc/mail/domains/$domain$/dkim.*

Занесение в DNS домена необходимых записей

Добавляем txt записи в домен

mail._domainkey IN TXT "k=rsa; p=MIGfMA0GCSqGS … wIDAQAB"
_domainkey IN TXT "t=y; o=~;"

p = cat /etc/mail/domains/$domain$/dkim.pub |grep -v ' KEY---' |tr -d '\n'