Настройка записей SPF и DKIM для сервера (opendkim + sendmail)


В связи с тем, что почтовые гиганты постоянно борются со спамом, вводятся всё новые способы проверки почты. К ним относятся два основных способа, это SPF и DKIM подписи домена.
SPF привязан к IP сервера, а DKIM к домену отправителя.

Для настройки SPF в DNS вносится запись типа TXT со следующим содержанием:

@.vashdomen.ru     v=spf1 ip4:ip-vashego-servera a ~all
например
@.google.ru              v=spf1 ip4:8.8.8.8 a ~all

После внесения SPF записи в домен, переходим к настройке DKIM. В Redhat подобных системах необходимо установить sendmail sendmail-cf и opendkim

#yum install -y sendmail sendmail-cf opendkim

Раскомментируем строчку Domain в файле /etc/opendkim.conf и впишем наш домен

Domain moysayt.ru

Раскомментируем строчки

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

Важно поменять режим подтверждения (v) на режим подписывания (s) или подписывания с подтверждением (sv)

Mode sv

Генерируем ключ

#cd /etc/opendkim/keys && openssl genrsa -out default.private 1024 -outform PEM
#openssl rsa -in default.private -out dkim-public.pem -pubout -outform PEM

Чтоб  opendkim запустился меняем владельца и группу файла default.private

#chown opendkim.opendkim default.private

Добавляем для нашего домена TXT запись субдоменом default._domainkey , она должна иметь следующий вид:

(Domain)
default._domainkey.moysayt.ru
(TXT)
v=DKIM1; k=rsa;  p=
MHwwDQYJKoZIhvcNAQEBBQADawAwaAJhAKJ2lzDLZ8XlVambQfMXn3LRGKOD5o6lMIgulclWjZwP56LRqdg5ZX15bhc/GsvW8xW/R5Sh1NnkJNyL/cqY1a+GzzL47t7EXzVc+nRLWT1kwTvFNGIoAUsFUq+J6+OprwIDAQAB;

код красного цвета берём из файла dkim-public.pem, это публичный ключ, в зависимости от генерации он может находиться в файле dkim-public.pem, defaul.txt (описано ниже) или в каком-нибудь другом файле.

——BEGIN PUBLIC KEY——
MHwwDQYJKoZIhvcNAQEBBQADawAwaAJhAKJ2lzDLZ8XlVambQfMXn3LRGKOD5o6l
MIgulclWjZwP56LRqdg5ZX15bhc/GsvW8xW/R5Sh1NnkJNyL/cqY1a+GzzL47t7E
XzVc+nRLWT1kwTvFNGIoAUsFUq+J6+OprwIDAQAB
——END PUBLIC KEY——

Другим вариантом генерации ключа является команда:

#opendkim-genkey -D /etc/opendkim/keys/ -d moysayt.ru -s default

Сгенерируются закрытый (default.private) и открытый (default.txt) ключи.

Если все эти варианты вызывают ошибки в CentOS, то используйте эту команду

#openssl genrsa -out default.private 1024 && openssl rsa -in default.private -pubout > default.txt

Файлы должны быть с правами 400 и владелцем opendkim

#chown opendkim.opendkim * && chmod 400 *

Для тестирования связки открытого и закрытого ключа используем команду

#opendkim-testkey -d moysayt.ru -s default -k default.private

В файле SigningTable раскомментируем и изменяем строчку

*@moysayt.ru default._domainkey.moysayt.ru

В файле KeyTable декомментируем и изменяем строчку

default._domainkey.moysayt.ru moysayt.ru:default:/etc/opendkim/keys/default.private

В файл TrustedHosts добавить

moysayt.ru

Если у нас несколько доменов, то описываем их в файлах 

SigningTable refile:/etc/opendkim/SigningTable
moysayt.ru default._domainkey.moysayt.ru
moysayt2.ru default._domainkey.moysayt2.ru
moysayt3.ru default._domainkey.moysayt3.ru

KeyTable /etc/opendkim/KeyTable
default._domainkey.moysayt.ru moysayt.ru:default:/etc/opendkim/keys/default.private
default._domainkey.moysayt2.ru moysayt2.ru:default:/etc/opendkim/keys/moysayt2/default.private
default._domainkey.moysayt3.ru moysayt3.ru:default:/etc/opendkim/keys/moysayt3/default.private

Меняет строчку в файле /etc/mail/sendmail.mc

dnl define(`SMART_HOST’, `smtp.moydomen.ru)dnl

для подписывания письма службой opendkim, добавляем в конце файла /etc/mail/sendmail.mc, строку:
INPUT_MAIL_FILTER(`opendkim’, `S=inet:8891@localhost’)dnl
Важно, файл должен обязательно заканчиваться пустой строкой. Если последней будет выше указанная строка, то m4 будет ругаться на ошибку.

Конвертируем этот файл в конфиг

#m4 sendmail.mc > sendmail.cf

И перезапускаем opendkim и sendmail

#service opendkim restart && service sendmail restart

Проверяем появились ли TXT записи DNS

#dig default._domainkey.moysayt.ru TXT
#dig moysayt.ru TXT

Если записи не появились, то ждём когда появятся. Как только появятся проверяем работу sendmail из консоли

#echo -e «To: testoviy-mail@yandex.ru\\nFrom: noreply@moysayt.ru\\nSubject: Test\\nTest\\n» | sendmail -bm -t -v

Если письмо дошло и не попало в СПАМ, то смотрим есть ли значок означающий наличие подписи.

Наличие DKIM подписи у письма

Наличие DKIM подписи у письма

Проверяем включена ли автозагрузка sendmail и opendkim

(CentOS 7)
#systemctl is-enabled opendkim && systemctl is-enabled sendmail.service
(CentOS 6)
#chkconfig | grep opendkim && chkconfig | grep sendmail

Если отключены, то включаем

(CentOS 7)
#systemctl enable opendkim

#systemctl enable sendmail.service
(CentOS 6)
#chkconfig opendkim on
#chkconfig sendmail on

При наличии SeLinux необходимо в его настройках дать разрешение apache-u отправлять сообщения через Sendmail, для этого проверяем права

#getsebool -a | grep mail

Получаем ответ

gitosis_can_sendmail —> off
httpd_can_sendmail —> off
logging_syslogd_can_sendmail —> off
logwatch_can_network_connect_mail —> off
mailman_use_fusefs —> off
postfix_local_write_mail_spool —> on

Включаем возможность отправки почты PHP через Sendmail (чтоб SeLinux не блокировал)

#setsebool -P httpd_can_sendmail on

 Подробный мануал по openDKIM можно найти здесь