Используем DKIM подпись для исходящей почты

Было заработано несколько систем для защиты почты от спуфинга. По сути любой человек моет отправить письмо от любого домена (в том числе и tech-notes.net) используя подход описанный в этой статье

Самыми эффективными, пока что, являются DKIM.

SPF - это просто DNS запись типа TXT, со списком ip адресов или доменных имен серверов, которым разрешено отправлять почту от имени домена.

DKIM использует более продвинутый механизм, которой предусматривает использование RSA ключей для подписи и верификации почты. Сам принцип похож на GPG, только со следующим отличием:

  • Публичный ключ для домена хранится в DNS
  • Приватный колюч для каждого домена хранится на сервере

Как работает DKIM?
Как известно каждое письмо содержит набор заголовков. Я не буду отдельно останавливаться на этом. Так вот при отправке письма, почтовый демон хэширует эти заголовки и подписывает их с помощью приватного RSA кюча. Почтовый сервер, принимающий почту, проверяет совпадает ли хэш подписи с хешем публичного ключа в DNS зоне. Если совпадает - все ОК, если нет - действует согласно настройкам спамфильтра.

Популярные почтовики такие как Gmail и AOL/Yahoo в последнее время стали не только класть такие письма в папку SPAM, а просто отказываются из доставлять, возвращая отправителю.

Чем опасно игнорирование DKIM/SPF?
Доставка почтовых уведомление очень важна для интернет магазинов. Если письма с подтверждением заказа не будут доставляться клиентам, то люди просто могут отказаться от покупки в Вашем магазине.

Что же делать?
Настройка DKIM включает следующие шаги:

  1. Созднаие пары ключей RSA, которые будут использованы для подписи и валидации отправляемой почты.
  2. Создать DNS запись, содержащую публичный ключ.
  3. Настройка почтового демона на использование приватного ключа для подписи исходящей почты

1. Создаем пару ключей RSA
В среде Linux воспользуемся функционалом openssl

openssl genrsa -out /etc/ssl/private/**example.com**-private.pem 1024 -outform PEM  
openssl rsa -in /etc/ssl/private/**example.com**-private.pem -out /etc/ssl/certs/**example.com**-public.pem -pubout -outform PEM

Если У вас нету под рукой системы Linux - воспользуйтесь любым онлайн генератором. Мне очень помог следующий ресурс:
https://www.port25.com/support/domainkeysdkim-wizard/

В случае с онлайн генераторами, дочитайте статью до конца, что бы иметь общее представление что с чем кушать.

На выходе у вас будет два файла:

  1. /etc/ssl/private/example.com-private.pem - приватный ключ, который будет использоваться для подписи заголовков писем
  2. /etc/ssl/certs/example.com-public.pem - публичный ключ, который будет находится в DNS зоне и будет использоваться для валидации входящих писем почтовыми сервисами

2. Создаем DNS запись с публичным ключом.
Для этого Вам понадобится содержимое файла публичного ключа:

cat /etc/ssl/certs/example.com-public.pem

Выглядит он следующим образом:

--BEGIN PUBLIC KEY--  
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD6MA3nwnUY9xdxftjSezCw0qgF  
8D2dwroEwc5fB/eI3JPdN3c9vAW37e6WpWEao9MEczGzMOj78SLQSKlXyQEtM4N2  
/Fld/fRve+iZJzT481jK9U34vZGYTUxWe2wHlUQHV8Vc1yDASF/1zpZg1ePMOCc7  
N+ocXzhSTQxo0c8jqwIDAQAB  
--END PUBLIC KEY--

Нас интересует все, что находится между тегами:

--BEGIN PUBLIC KEY--  
...
--END PUBLIC KEY--

Именно эта абракадабра будет использоваться в значении поля TXT записи в DNS зоне.

Переходим в панель управления DNS зоной Вашего сайта и создаем запись согласно следующим параметрам:

  1. Домен: key1.domainkey.example.com
    Вместо _key1
    можно использовать что угодно. Варианты: * имя сервера
    • сегодняшнюю дату
    • имя домашнего питомца
  2. Тип: TXT
  3. Значение (Value):"k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD6MA3nwnUY9xdxftjSezCw0qgF8D2dwroEwc5fB/eI3JPdN3c9vAW37e6WpWEao9MEczGzMOj78SLQSKlXyQEtM4N2/Fld/fRve+iZJzT481jK9U34vZGYTUxWe2wHlUQHV8Vc1yDASF/1zpZg1ePMOCc7N+ocXzhSTQxo0c8jqwIDAQAB"

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

После сохранения изменений нужно выждать некоторое время что бы они распространились по миру. Проверить скорость распространения можно с помощью следующего ресурса:
https://www.whatsmydns.net/#TXT/

3. Настройка почтового демона на использование приватного ключа для подписи исходящей почты.
Осталось дело за малым. Я постараюсь расширить эту статью возможными настройкой DKIM для всех популярных почтовых серверов

Exim
Создайте файл `/etc/exim4/conf.d/main/00_local_macros` со следущим содержанием:
    DKIM_CANON = relaxed
    DKIM_SELECTOR = key1
    DKIM_DOMAIN = example.com
    DKIM_FILE = /etc/ssl/private/example.com-private.pem
Обратите внимание на `DKIM_SELECTOR`. Выполните следующие команды, что бы изменения вступили в силу:
    update-exim4.conf
    service exim4 restart
  
Postfix
Установите `opendkim`
    apt-get install opendkim opendkim-tools
  
Отрадектируйте конфигурационный файл `/etc/opendkim.conf` следующими строками:
    Domain example.com
    KeyFile /etc/ssl/private/example.com-private.pem
    Selector key1
    SOCKET inet:[email protected]
  
Если Ваш сервер отпрявляет почту от имени нескольких доменов, то их нужно описать в этом же файле иначе `opendkim` будет их игнорировать. Вообще нету ничего страшного в том, что бы использовать один ключ для все доменв на Вашем сервере. Отредактируйте файл `/etc/default/opendkim`. Нужно изменить сокет по умолчанию. Для этого добавте в конец следующую строку:
    SOCKET=`inet:[email protected]`
  
Редактируем главный конфиг Postfix (`/etc/postfix/main.cf`) следующими строками:
    # DKIM
    milter_default_action = accept
    milter_protocol = 2
    smtpd_milters = inet:localhost:8891
    non_smtpd_milters = inet:localhost:8891
  
Нужно перезапустить демоны `postfix` и `opendkim` что бы все заработало. Хочу обратить внимание на то что `opendkim` откажется запускаться, если ему не понравятся права выставленные для файла `example.com-private.pem`. Выполните следующую команду, что бы уж на верняка:
    chmod 600 /etc/ssl/private/example.com-private.pem
  
Теперь перезапускаем:
    service opendkim restart
    service postfix restart
  
Хорошая статья привдена на [HoToForge](https://www.howtoforge.com/set-up-dkim-domainkeys-identified-mail-working-with-postfix-on-centos-using-opendkim). В ней рассматривается установка OpenDKIM из исходника.
Qmail
Врятли здесь что-то появится, поскольку примерно не представлю когда предвидится настраивать `Qmail`.

В результате заголовки выглядят следующим образом: Screenshot from 2016-03-01 11:48:15

Список литературы:

  1. debian-administration.org/DKIM-signing_outgoing_mail_with_exim4
  2. a href="http://mikepultz.com/2010/02/using-dkim-in-exim/">mikepultz.com/using-dkim-in-exim</a>
  3. easyengine.ios/dkim-postfix-ubuntu