Как работает DKIM?
DKIM это цифровая подпись каждого E-mail сообщения. Основная идея заключается в применении ассинхронного шифрования. Т.е. генерация открытого и закрытого ключей. DKIM (DomainKeys Identified Mail) это метод аутентификации писем, основанный на проверке подлинности цифровой подписи. Закрытый ключ хранится на почтовом сервере и с его помощью подписываются исходящие сообщения, а открытый помещается в DNS запись. Когда электронное письмо отправляется авторизованным пользователем почтового сервера, сервер использует сохраненный закрытый ключ для создания цифровой подписи сообщения, которая вставляется в сообщение в качестве заголовка, и электронное письмо отправляется как обычно.
Почтовый сервис адресата может проверять, является ли отправитель тем, которым себя выдает или нет. Сервер-получатель находит заголовок DKIM-Signature, где указаны:
d=— домен отправителя,s=— селектор ключа,b=— сама цифровая подпись письма,bh=— хэш тела письма,- и список подписанных заголовков (
h=)
Далее, делает запрос открытого ключа из DNS Используя параметры d и s. Затем вычисляет хэши подписанных заголовков и тела письма. Расшифровывает подпись b= открытым ключом, полученным из DNS и сравнивает расшифрованное значение с вычисленным хэшем.
Таким образом DKIM защищает получателя письма от различных фишинговых писем.
Установка opendkim
Итак, приступим к установке. Установку и настройку почтового сервера рассматривали тут, думаю, что всё уже установлено и работает. Прикрутить DKIM к почтовому серверу можно установив специальный пакет opendkim
Установка на Ubuntu-server 20.04 (и более поздние версии) крайне проста, пакеты есть в репозитории
# apt install opendkim opendkim-tools
Генерируем пару ключей
После установки надо создать каталоги и дать права на доступ:
mkdir -p /etc/opendkim/keys/
chown -R opendkim:opendkim /etc/opendkim
chmod go-rw /etc/opendkim/keys
Если у вас на сервере несколько доменов, то надо генерировать ключи по следующей схеме:
cd /etc/opendkim/keys/
opendkim-genkey -r -s your_key_name -d domain.tld
- -r ограничивает использование ключа только для подписи электронной почты. По умолчанию ключ разрешается использовать для любой службы.
- -s задаёт имя для генерируемых файлов. По умолчанию (если не указывать) будет два файла: default.private и default.txt
- -d это имя домена
Данная команда создаст два файла: your_key_name.private и your_key_name.txt Закрытый ключ для почтового сервера и ДНС-запись соответственно.
Настройка OpenDKIM
Надо отредактировать два файла конфигурации:
# /etc/default/opendkim
SOCKET=inet:8891@localhost
Остальное оставьте как есть (другие сокеты закомментируйте). И ещё
# /etc/opendkim.conf
Mode sv
Socket inet:8891@localhost
KeyTable refile:/etc/opendkim/keytable
SigningTable refile:/etc/opendkim/signingtable
ExternalIgnoreList refile:/etc/opendkim/trustedhosts
InternalHosts refile:/etc/opendkim/trustedhosts
Далее создадим /etc/opendkim/keytable файл следующего содержания:
your_key_name._domainkey.domain.tld domain.tld:your_key_name:/etc/opendkim/keys/your_key_name.private
И ещё файл /etc/opendkim/signingtable следующего содержания:
*@domain.tld your_key_name._domainkey.domain.tld
И, наконец, создадим файл /etc/opendkim/trustedhosts с записями доменов:
mail.domain.tld
domain.tld
127.0.0.1
::1
localhost
172.17.0.0/16
172.18.0.0/16
10.0.0.0/8
192.168.0.0/16
В список выше может быть шире в зависимости от вашего сервера и что там на нем есть.
Конфигурация Postfix
Далее, отредактируйте конфигурационный файл POSTFIXа /etc/postfix/main.cf добавьте следующие строки:
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept
Далее, запустите (перезапустите) opendkim:
systemctl restart opendkim.service
TXT запись в DNS сервер
После конфигурации приватного ключа opendkim-genkey также сформирует файл для DNS записи /etc/opendkim/keys/example.com/default.txt :
default._domainkey IN TXT ( "v=DKIM1; k=rsa; s=email; " "p=MIG...................AB" ) ; ----- DKIM key default for example.com
Тестирование DKIM
Проверить работу можно такой командой
mail -vs "Test DKIM" my_test_email@gmail.com < /dev/null
В принятом письме найдите строчку «DKIM-Signature» должна выглядеть примерно так:
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=example.com; s=default.private; t=1502378963; bh=f............8=; h=Date:From:Message-Id:To:Subject; b=M6.........................qWY=
Возможные проблемы
Если в заголовках письма ключа нет, то:
- Проверьте файл /etc/opendkim/trustedhosts, попали ли все ваши домены и подсети в него. Не забудьте сверить само имя этого файла.
- Запустился ли opendkim.service (systemctl status opendkim.service)
- Прослушивает ли opendkim порт 8891 или тот что вы указали (команды netstat, ss)