Используем DKIM подпись для исходящей почты
Было заработано несколько систем для защиты почты от спуфинга. По сути любой человек моет отправить письмо от любого домена (в том числе и tech-notes.net) используя подход описанный в этой статье
Самыми эффективными, пока что, являются DKIM.
SPF - это просто DNS запись типа TXT, со списком ip адресов или доменных имен серверов, которым разрешено отправлять почту от имени домена.
DKIM использует более продвинутый механизм, которой предусматривает использование RSA ключей для подписи и верификации почты. Сам принцип похож на GPG, только со следующим отличием:
- Публичный ключ для домена хранится в DNS
- Приватный колюч для каждого домена хранится на сервере
Как работает DKIM?
Как известно каждое письмо содержит набор заголовков. Я не буду отдельно останавливаться на этом. Так вот при отправке письма, почтовый демон хэширует эти заголовки и подписывает их с помощью приватного RSA кюча. Почтовый сервер, принимающий почту, проверяет совпадает ли хэш подписи с хешем публичного ключа в DNS зоне. Если совпадает - все ОК, если нет - действует согласно настройкам спамфильтра.
Популярные почтовики такие как Gmail и AOL/Yahoo в последнее время стали не только класть такие письма в папку SPAM
, а просто отказываются из доставлять, возвращая отправителю.
Чем опасно игнорирование DKIM/SPF?
Доставка почтовых уведомление очень важна для интернет магазинов. Если письма с подтверждением заказа не будут доставляться клиентам, то люди просто могут отказаться от покупки в Вашем магазине.
Что же делать?
Настройка DKIM включает следующие шаги:
- Созднаие пары ключей RSA, которые будут использованы для подписи и валидации отправляемой почты.
- Создать DNS запись, содержащую публичный ключ.
- Настройка почтового демона на использование приватного ключа для подписи исходящей почты
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/
В случае с онлайн генераторами, дочитайте статью до конца, что бы иметь общее представление что с чем кушать.
На выходе у вас будет два файла:
- /etc/ssl/private/example.com-private.pem - приватный ключ, который будет использоваться для подписи заголовков писем
- /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 зоной Вашего сайта и создаем запись согласно следующим параметрам:
- Домен: key1.domainkey.example.com
Вместо _key1 можно использовать что угодно. Варианты: * имя сервера- сегодняшнюю дату
- имя домашнего питомца
- Тип: TXT
- Значение (Value):
"k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD6MA3nwnUY9xdxftjSezCw0qgF8D2dwroEwc5fB/eI3JPdN3c9vAW37e6WpWEao9MEczGzMOj78SLQSKlXyQEtM4N2/Fld/fRve+iZJzT481jK9U34vZGYTUxWe2wHlUQHV8Vc1yDASF/1zpZg1ePMOCc7N+ocXzhSTQxo0c8jqwIDAQAB"
Вот эта длинная абракадабра и есть публичный ключ, который сгенерировали пару минут назад.
После сохранения изменений нужно выждать некоторое время что бы они распространились по миру. Проверить скорость распространения можно с помощью следующего ресурса:
https://www.whatsmydns.net/#TXT/
3. Настройка почтового демона на использование приватного ключа для подписи исходящей почты.
Осталось дело за малым. Я постараюсь расширить эту статью возможными настройкой DKIM для всех популярных почтовых серверов
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
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 из исходника.
В результате заголовки выглядят следующим образом:
Список литературы:
- debian-administration.org/DKIM-signing_outgoing_mail_with_exim4
- a href="http://mikepultz.com/2010/02/using-dkim-in-exim/">mikepultz.com/using-dkim-in-exim</a>
- easyengine.ios/dkim-postfix-ubuntu