DKIM в Exim это просто!

()

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

Сам по себе механизм достаточно прост: в письмо добавляется ЭЦП, сделанная с помощью приватного ключа, а публичный ключ публикуется в текстовой записи DNS и с его помощью получатель проверяет ЭЦП письма. Для одного домена может быть несколько пар ключей. Имена ключей называются селекторами. Далее будет показано как можно быстро добавить DKIM к Exim, работающему на сервере под управлением Ubuntu 18.04.

Verified by DKIM

Допустим что сервер называется 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".

На этом всё! Приятной работы!

Ключевые слова: exim, exim4, dkim, openssl.

Подписаться на обновления: RSS-лента Telegram канал Twitter

Комментарии:

Новый комментарий

Жирный текстКурсивный текстПодчёркнутый текстЗачёркнутый текстПрограммный кодСсылкаИзображение




© 2006-2018 Вадим Калинников aka MooSE