Установка OpenDKIM + Postfix на CentOS 7
opendkim.x86_64 2.11.0-0.1.el7 @epel
postfix.x86_64 2:2.10.1-6.el7 @base
DomainKeys Identified Mail (DKIM) - цифровая подпись письма.
Установка OpenDKIM
yum install opendkim
Генерация ключей
Необходимо создать публичный и закрытый (приватный) RSA ключ
opendkim-genkey --restrict --nosubdomains --selector=mail --domain=example.com --bits=2048 --directory=/etc/opendkim/keys
- selector - это произвольное имя, дается ключу, которым будет подписываться почта. Ключей на одном домене может быть больше одного, поэтому их именуют.
- domain - имя домена @example.com
- bits - стойкость шифрования, по хорошему >=2048
Переименую файлы для удобства
mv /etc/opendkim/keys/mail.private /etc/opendkim/keys/example.com.private mv /etc/opendkim/keys/mail.txt /etc/opendkim/keys/example.com.txt
Установить права
chown root:opendkim /etc/opendkim/keys/* chmod 640 /etc/opendkim/keys/*
За правами так же следит OpenDKIM, если ключ будет доступен другим пользователям, получим:
opendkim[51171]: mail._domainkey.example.com: key data is not secure: /etc/opendkim/keys/example.com.private is in group 123 which has multiple users (e.g., "postfix")
Информация о ключе
openssl rsa -noout -text -in /etc/opendkim/keys/example.com.private
Настройка OpenDKIM
Создать файл KeyTable - список ключей
Формат файла:«KEYNAME DOMAIN:SELECTOR:KEYPATH«
/etc/opendkim/KeyTable
mail._domainkey.example.com example.com:mail:/etc/opendkim/keys/example.com.private
Создать файл SigningTable - укажем кукую почту какими ключами подписывать
Формат файла:»FROM@DOMAIN KEYNAME«
/etc/opendkim/SigningTable
*@example.com mail._domainkey.example.com
Создать файл TrustedHosts - список адресов, с которых разрешается принимать почту на подпись
/etc/opendkim/TrustedHosts
127.0.0.1 ::1 10.0.17.0/24
Указан не только localhost - но и адреса клиентов использующих Postfix в качестве relay'я, иначе OpenDKIM не подпишет
opendkim[2144]: 57C75410F0: [10.0.17.36] [10.0.17.36] not internal opendkim[2144]: 57C75410F0: not authenticated
Настроим для работы через SOCKET
Некоторые отличительные особенности CentOS (сравнивая с Ubuntu):
- По умолчанию Postfix запускается без chroot'a
- Настройка
UserID opendkim:postfix
не применяет группу к правам на opendkim.sock - По умолчанию systemd-tmpfiles установит права 700 для /var/run/opendkim (при установке пакета 775, до перезагрузки)
/etc/opendkim.conf
PidFile /var/run/opendkim/opendkim.pid Mode sv Syslog yes SyslogSuccess yes LogWhy yes UserID opendkim:postfix Socket local:/var/run/opendkim/opendkim.sock UMask 000 SendReports no SoftwareHeader yes Canonicalization relaxed/simple MinimumKeyBits 2048 OversignHeaders From SigningTable refile:/etc/opendkim/SigningTable ExternalIgnoreList refile:/etc/opendkim/TrustedHosts KeyTable refile:/etc/opendkim/KeyTable InternalHosts refile:/etc/opendkim/TrustedHosts
Перезагрузка
systemctl restart opendkim
Проверка
systemctl status opendkim
Настройка Postfix
Добавим конфиг для работы с OpenDKIM
/etc/postfix/main.cf
... ### OpenDKIM milter_default_action = accept milter_protocol = 2 smtpd_milters = unix:/var/run/opendkim/opendkim.sock non_smtpd_milters = $smtpd_milters
- milter_default_action = accept - продолжить отправку письма, если OpenDKIM не ответит/не запущен/ошибка и т.п.
- milter_protocol - указывает версию протокола Milter (libmilter), которую Postfix должен использовать
Перезагрузка
systemctl restart postfix
Настройка DNS
BIND
Осталось настроить текстовую запись для нашего домена SELECTOR._domainkey.DOMAIN
В файле example.com.txt - почти готовая конфигурацию, содержащая публичный ключ
/etc/opendkim/keys/example.com.txt
mail._domainkey IN TXT ( "v=DKIM1; k=rsa; s=mail; p=MIIBIjA ..." "PFiRю ..." "6G7y..." "54E..." )
- v - версия
- k - тип ключа
- s - selector
- p - публичный ключ в base64
Т.к. я делал ключ 2048bit, то текстовое поле с ключом пришлось разбить на большее кол-во частей, что бы не получить ошибку
named[1325]: dns_rdata_fromtext: /etc/bind/example.com:17: syntax error named[1325]: zone example.com/IN: loading from master file /etc/bind/example.com failed: syntax error
Прочее
Если ваш DNS обслуживает хостер или т.п. просто отправьте им файл example.com.txt, там уже они все пропишут.
Проверка
mail._domainkey.example.com - имя домена, содержащее TXT запись DKIM для домена example.com (для selector'a = mail)
dig -t txt mail._domainkey.example.com ;; ANSWER SECTION: mail._domainkey.example.com. 10800 IN TXT "v=DKIM1\; k=rsa\; s=mail\; " "p=...."
http://www.opendkim.org/opendkim-README
http://www.opendkim.org/opendkim.conf.5.html
http://dkim.org/specs/rfc4871-dkimbase.html
Обсуждение
Вот тут не совсем верно:
chmod 600 /etc/opendkim/keys/*
Иначе в логах будет:
opendkim[26046]: can't load key from /etc/opendkim/keys/example.com.private: Permission denied
Права выставил как 640 и все заработало.
Автору - спасибо! Сам некоторые моменты не доделал, а статья помогла.
Неверно указание s=mail
В этом случае в поле вместо Service Type указывается селектор. Service Type должен быть s=email
Как хотите так и называйте. RFC6376