При организации почтового сервера для небольшой организации очень часто выбор падает на MTA Exim, который отличается надёжностью и простотой конфигурации. В последнее время набирает популярность механизм DKIM (DomainKeys Identified Mail), позволяющий получателю проверить подлинность отправителя и неизменность текста письма, благодаря электронной подписи.
Сам по себе механизм достаточно прост: в письмо добавляется ЭЦП, сделанная с помощью приватного ключа, а публичный ключ публикуется в текстовой записи DNS и с его помощью получатель проверяет ЭЦП письма. Для одного домена может быть несколько пар ключей. Имена ключей называются селекторами. Далее будет показано как можно быстро добавить DKIM к Exim, работающему на сервере под управлением Ubuntu 18.04.
Допустим что сервер называется mailsrv1 и обслуживает домены example.com и proverka.ru, для которых и надо настроить DKIM-подпись. Ключи мы будем хранить в директории /etc/exim4/dkim. Создадим её, сменим владельца и сделаем текущей:
mkdir -p /etc/exim4/dkim && chown Debian-exim /etc/exim4/dkim && cd /etc/exim4/dkim
Чтобы немного упростить себе жизнь в дальнейшем (например если понадобится добавить новые домены) создадим скрипт "gen.sh", следующего содержания:
#!/bin/sh # На всякий случай меняем директорию cd `dirname $0` # Если не передан параметр if [ -z $1 ]; then # Печатаем инструкцию и завершаем работу echo "Usage: ${0} domain.com" exit fi # Получаем имя домена, для которого будем генерировать ключи DOMAIN=$1 # Генерируем приватный ключ openssl genrsa -out ${DOMAIN}.key 1024 -outform PEM # Генерируем публичный ключ openssl rsa -in ${DOMAIN}.key -out ${DOMAIN}.key.pub -pubout -outform PEM # Меняем владельца приватного ключа чтобы exim смог его прочитать chown -v Debian-exim ${DOMAIN}.key
Теперь генерируем ключи для наших доменов:
sh gen.sh example.com sh gen.sh proverka.ru
Сгенерировав ключи остаётся только настроить exim. В Ubuntu конфигурация exim храниться в виде большого количества небольших файлов и управляется с помощью макросов. Кому-то это может показаться неудобным, но с другой стороны можно все макросы для одной задачи определить в одном файле, что весьма удобно. Мы создадим файл "/etc/exim4/conf.d/main/000_localmacros_dkim" следующего содержания:
# Домен. Будем брать его из заголовка From DKIM_DOMAIN = ${lc:${domain:$h_from:}} # Селектор. Удобно если совпадает с именем сервера DKIM_SELECTOR = mailsrv1 # Приватный ключ. Если для домена нет ключа - письмо не будет подписано DKIM_PRIVATE_KEY = ${if exists{/etc/exim4/dkim/${lc:${domain:$h_from:}}.key} {/etc/exim4/dkim/${lc:${domain:$h_from:}}.key} {0}}
После этого необходимо обновить конфигурацию exim и перезапустить сервис:
update-exim4.conf && service exim4 restart
С этого момента все исходящие письма будут подписаны с учётом соответствующего домену ключа. В качестве селектора будет указываться "mailsrv1".
Но чтобы принимающая сторона могла проверить подпись необходимо опубликовать публичные ключи в DNS. Для этого в наших зонах необходимо создать TXT-записи "mailsrv1._domainkey" следующего вида:
mailsrv1._domainkey IN TXT "k=rsa; t=s; p=ВАШ_ПУБЛИЧНЫЙ_КЛЮЧ"
Например если публичный ключ имеет вид:
-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDU7Pm8WwlZ6bVI2+rNnSJdcbd4 0ECtIvkqHyB/IMEUBFhbNFBquBTbAbS3+lQqI7ITpIHPYSnMgc2oIxxQenn/2ytJ nJhKpkO5Qoe1N17Xn91IExnY0B9pt6t8ffXJ+9ipM5AU2CSki++PjE4Mgeb5KHS2 xr7ilzxjH/e+xLg8LwIDAQAB -----END PUBLIC KEY-----
То запись будет иметь вид:
mailsrv1._domainkey IN TXT "k=rsa; t=s; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDU7Pm8WwlZ6bVI20ECtIvkqHyB/IMEUBFhbNFBquBTbAbS3+lQqI7ITpIHPYSnMgc2oIxxQenn/2ytJnJhKpkO5Qoe1N17Xn91IExnY0B9pt6t8ffXJ+9ipM5AU2CSki++PjE4Mgeb5KHS2xr7ilzxjH/e+xLg8LwIDAQAB"
После внесения изменений в DNS всё должно начать работать. Но всё-же стоит добавить в DNS ещё одну запись: описание политики DKIM. Для этого достаточно добавить запись:
_domainkey IN TXT "o-; r=postmaster@example.com"
Здесь параметр "o-" означает что все письма должны быть подписаны (если это не так то укажите "o~"). А параметр "r=" указывает e-mail адрес, на который будут присылаться уведомления о некорректных подписях.
Также ещё можно настроить SPF и DMARC, но об этом как-нибудь в другой раз:)
Как тестировать? Достаточно отправить самому себе письмо и убедиться в наличии заголовка "DKIM-Signature".
Кроме того различные спам-фильтры по результатам проверки подписи добавляют различные отметки. Например spamassassin добавляет заголовок "X-Spam-Status" и в случае успешной проверки DKIM-подписи в нём будет флаг "T_DKIM_INVALID". Яндекс почта добавляет заголовок "Authentication-Results" и в нём флаг "dkim=pass".
На этом всё! Приятной работы!