DKIM (BIND, Postfix/Exim)

Первый вариант.

Создаем каталог для размещения ключей:

mkdir /etc/opendkim

Генерируем их:

opendkim-genkey -D /etc/opendkim/ --domain tst-amo.net.ua --selector relay

relay – название селектора (может быть любым напр. – mail)

Создалось два файла – *.private – закрытый ключ (храним у себя), *.txt – запись для DNS.

Создаем группу opendkim:

pw useradd opendkim -m -s /usr/sbin/nologin -w no

и меняем владельца:

chown :opendkim /etc/opendkim/*
chmod g+r /etc/opendkim/*

Второй вариант.

mkdir /usr/local/etc/exim/dkim

Делаем секретный ключ через openssl

root@server# openssl genrsa -out /usr/local/etc/exim/example.com.key 2048

На выходе имеем ключ вида:

-----BEGIN RSA PRIVATE KEY----- 
MIICXQIBAAKBgQDT1tSzyG2Zch4LTgGPbn/8H535Vd+friNn/gBsV7rFNVZdxapD 
dOUzeATUTbAG/3Ux7vJxYd6i982IajVz0b2dsmkdDzctC4EdJsLcpCpyf3x21nYZ 
oJO2GjaFW65MNj7dU7BXDerLTE+zTu/Q4vs4ZqCA39CtbmetjBS9l/NsMQIDAQAB 
AoGBAM2ZyVFAatkQSBaivСLwlWknapSPgv4g7h5FSTXeI9i5frx+V1UnRDki+FTx 
nbH9CErRZh8jZQj4x1Pp+T0SyRtb62ydJooPYIpNlTt71cgZNwH174uFt4HevKmC 
MJIhzaufEZYhamS4NQOR+4FakdZX2T8yzuvwDwkplJP2tO/tAkEA7RDltCTOShdd 
sJYs0wjs1mDXUiSz0giFAYvMBvOelpyjJl9Pi1A0CNcD4WdvAl0Xo5aRMVrTXRzf 
-----END RSA PRIVATE KEY-----

Генерим публичный ключ на основе секретного

root@server# openssl rsa -in /usr/local/etc/exim/example.com.key -pubout

На выходе получим что-то вроде:

-----BEGIN PUBLIC KEY----- 
MIGfMA0GCSqGSIb3DQEBAQUAA3GNADCBiQKBgQDT1tSzyG1Zch4LTgGPbn/8H535 
Vd+friNn/gBsV7rFNVZdxapDd0UzeATUTbAG/3Ux7vJxYd6i982IajVz0b2dsmkd 
DzctC4EdJsLcpCpyf3x21nYZoJO2GjaFW65MNj7dU7BXDerLTE+zTu/Q4vs4ZqCA 
-----END PUBLIC KEY-----

Создаем в DNS запись relay._domainkey.example.com типа TXT со значением:

mail._domainkey.example.com. IN TXT ( "k=rsa\; "
                                    "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs2WdcyOKgKVU2C/7CV77"
                                    "4mu/b+XVaVixtuASB0wAOjaPnEcFzwI84hu6wmy8cpPJlVImnf1gD/y/pA08+viV"
                                    "PPP/6bHfEiJjxOSjDnhF2V1+GlOrl6IYxNxOxXPLw88QpDPak+ZO0yLU58UxJP1K"
                                    "cPdCuftEMFHWd5vuiHquBNYtkW6MxaGcoX4hK8eE9CdrKDH7EtuLkkJ4uj0Mw4R7"
                                    "kd6FexfyppDXFGGu8oDN+7IUfCqnKDkUxqb5Dh4rDD24Tn6KdDY5eFgjw7OIUr8H"
                                    "Jbr9KNSE6lF3M5JLx9VX/ny3ec9ODLm0FGpDQbXcRM+CTmX6H2jGkwJ4VcpqDwVZ"
                                    "RwIDAQAB" )

(В данном случае это синтаксис для DNS сервера на BIND, и другие DNS сервера могут не требовать знак “\” для экранирования “;”.)

Вместо relay можете использовать другой селектор, например, dkimserverpublic и тд. Подобных записей Public key для DKIM может быть несколько.

Необходимо дождаться, когда обновится ваша DNS запись на других серверах. Это может занять несколько часов.

Проверять свою DKIM запись можно, например, с помощью сервиса DNSWatch

Добавляем ADSP запись

Создаем в DNS запись _adsp._domainkey.example.com типа TXT со значением dkim=all.

_adsp._domainkey.example.com. IN TXT "dkim=all"

Помимо all параметр dkim может иметь еще два значения — unknown и discardable.

  • unknown — домен может подписывать некоторые или все письма.
  • all — все письма с домена подписаны.
  • discardable — все письма с домена подписаны. Кроме того, если письмо приходит без валидной подписи в связи с изменениями в пути, прохождением через путь без доступа к подписывающему ключу или по другим причинам, домен призывает адресата отклонить его.

Рестарт BIND.

Правим конфиг Exim

В файл /usr/local/etc/exim/configure добавляем в начало:

## DKIM:
DKIM_DOMAIN = ${lc:${domain:$h_from:}} DKIM_FILE = /usr/local/etc/exim/${lc:${domain:$h_from:}}.key DKIM_PRIVATE_KEY = ${if exists{DKIM_FILE}{DKIM_FILE}{0}}

Эта конструкция позволит использовать разные Private key для разных доменов.

Подправляем транспорт remote_smtp:

remote_smtp:
         driver           = smtp
         dkim_canon       = relaxed
         #dkim_strict     = yes
         dkim_domain      = DKIM_DOMAIN
         dkim_selector    = relay
         dkim_private_key = DKIM_PRIVATE_KEY

Здесь relay — наш селектор, .

Сохраняем конфиг и перечитываем его:

root@server# service exim reload

Проверять DNS будем с помощью утилиты dig, а также можно воспользоваться сервисом http://www.dnswatch.info

Проверка с помощью dig:

dig relay._domainkey.example.com TXT
.....
;; ANSWER SECTION:
relay._domainkey.example.com. 3600 IN      TXT     "k=rsa\; " "p=MIIBIjA.......................
.....

С помощью сайта – в окошке выбираем тип записи TXT и вставляем

relay._domainkey.example.com

Postfix

Редактируем:

/etc/opendkim.conf

И приводим его, например,  к следующему виду:

AutoRestart             Yes
AutoRestartRate         10/1h
Umask                   002
Syslog                  yes
SyslogSuccess           Yes
LogWhy                  Yes

Canonicalization        relaxed/simple

ExternalIgnoreList      refile:/etc/opendkim/TrustedHosts
InternalHosts           refile:/etc/opendkim/TrustedHosts
KeyTable                refile:/etc/opendkim/KeyTable
SigningTable            refile:/etc/opendkim/SigningTable

Mode                    sv
PidFile                 /var/run/opendkim/opendkim.pid
SignatureAlgorithm      rsa-sha256

UserID                  opendkim:opendkim

Socket                  inet:12301@localhost

* все параметры можно оставить, как в данном примере, за исключением Socket — можно указать любой другой порт, вместо 12301.

Теперь создаем и заполняем файлы:

ee/etc/opendkim/TrustedHosts
127.0.0.1 
localhost 
*.tst-amo.net.ua
ee /etc/opendkim/KeyTable
relay._domainkey.tst-amo.net.ua tst-amo.net.ua:relay:/etc/opendkim/relay.private
ee /etc/opendkim/SigningTable
*@tst-amo.net.ua relay._domainkey.tst-amo.net.ua

Добавляем в автозагрузку и запускаем:

echo 'milteropendkim_enable="YES"' >> /etc/rc.conf
echo 'milteropendkim_uid="opendkim"' >> /etc/rc.conf

service milter-opendkim start

Вставляем в /usr/local/etc/postfix/main.cf

# DKIM
 milter_protocol = 6
 milter_default_action = accept
 smtpd_milters = inet:localhost:12301
 non_smtpd_milters = inet:localhost:12301

Перезапускаем и проверяем.