[[ Установка OpenDKIM + Postfix на CentOS 7 ]]

CentOSPostfix

Установка 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
mail._domainkey.example.com - имя ключа для OpenDKIM, может быть произвольным

Создать файл 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..." )
The DKIM-Signature Header Field rfc4871

  • 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=...."











Обсуждение

Олег Рева, 2019/08/14 11:28

Вот тут не совсем верно:

chmod 600 /etc/opendkim/keys/*

Иначе в логах будет:

opendkim[26046]: can't load key from /etc/opendkim/keys/example.com.private: Permission denied

Права выставил как 640 и все заработало.

Автору - спасибо! Сам некоторые моменты не доделал, а статья помогла.

Прохожий, 2022/07/27 15:36

Неверно указание s=mail

В этом случае в поле вместо Service Type указывается селектор. Service Type должен быть s=email

Aleksey, 2022/07/28 13:11, 2022/07/28 13:14

Как хотите так и называйте. RFC6376

To support multiple concurrent public keys per signing domain, the
key namespace is subdivided using "selectors".  For example,
selectors might indicate the names of office locations (e.g.,
"sanfrancisco", "coolumbeach", and "reykjavik"), the signing date
(e.g., "january2005", "february2005", etc.), or even an individual
user.
Ваш комментарий. Вики-синтаксис разрешён:
177 +7​ =
 
howto/centos/centos_7_opendkim_install.txt · Последнее изменение: 2022/08/31 14:53 — 127.0.0.1
Gentoo Linux Gentoo Linux Driven by DokuWiki