настройка DKIM для Postfix

или цифровая подпись исходящих сообщений DKIM

Постановка задачи: Борьба со спамом продолжается. В этот раз, мы настроим сервис OpenDKIM чтобы проверять входящую и/или подписывать всю нашу исходящую почту цифровой подписью DKIM, что отправитель письма соответствует полю From в заголовках письма. Практика показывает, что это приводит к значительному улушению рейтинга нашего почтового сервера, а также этот механизм, де-факто, любит Google... Также включим механизм SPF, чтобы подсказать другим почтовым серверам, кто есть авторизованный отправитель почты на нашем домене...

Более подробно вы можете прочести на википедии wiki: DomainKeys Identified Mail. Установим пакеты opendkim и opendkim-tools:

server:/# apt-get install opendkim opendkim-tools

Создадим отдельную папку для OpenDKIM и перенесем файл конфигурации в эту папку. Для совместимости, оставим ссылку на прежнем месте.

server:/# mkdir /etc/opendkim 
server:/# chown opendkim:opendkim /etc/opendkim
server:/# mv /etc/opendkim.conf /etc/opendkim/opendkim.conf
server:/# ln -s /etc/opendkim/opendkim.conf /etc/opendkim.conf

Отредактируем конфигурацию и добавим необходимые параметры:

server:/# vim /etc/opendkim/opendkim.conf

SyslogSuccess           yes
LogWhy                  yes

Selector                mail
Canonicalization        relaxed/relaxed
Mode                    sv
SubDomains              no
KeyTable                file:/etc/opendkim/KeyTable
SigningTable            file:/etc/opendkim/SigningTable
AutoRestart             yes
DNSTimeout              5

Socket                  inet:8891@localhost
#Socket                 local:/var/run/opendkim/opendkim.sock


ExternalIgnoreList      file:/etc/opendkim/TrustedHosts
InternalHosts           file:/etc/opendkim/TrustedHosts
Statistics              /var/log/dkim-stats

Создаем необходимые файлы и папки (инвентарь) для нашего почтового сервера, персонально... В дальнейшем, каждого нового клиента будем добавлять аналогичным образом.

server:/# mkdir /etc/opendkim/demon.of.by
server:/# chown opendkim:opendkim /etc/opendkim/demon.of.by

Создадим непосредственно ключи для домена demon.of.by а также сменим владельца ключей на пользователя opendkim:

server:/# cd /etc/opendkim/demon.of.by
server:/# opendkim-genkey -s mail -d demon.of.by
server:/# chown opendkim:opendkim *

Обновляем DNS - настраиваем DKIM. Данная часть наверное наиболее трудоёмкая, так как Вы должны понимать как и где изменить DNS-записи для Вашего домена.

server:/# cat /etc/opendkim/demon.of.by/mail.txt

mail._domainkey IN      TXT     ( "v=DKIM1; h=sha256; k=rsa; "
"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5yWaifpAyB4cX5SJMpxJeWQJ2UzmoCkFVg0y4jQTE2g1m75vP6Qkd8+rolJAVhxxklPAgB9rYgKv1gGsVR6cnOvt0/m89S6dh8VcnvoXVBBe8fIIGHEbQ/VvHU60O/i1krT9HR6zZ3EV26m27ZRS/zhkFbTOnnF6Gjj3dFyUEDsC9vBli2lmR6DiGxz9LsfxrszcqruJCV/+iF"
"TpyIR1LY68MpkXZM/4SBJID+++8gvsNhUk1RFDU8sJgQ0Zei0mUbyyYwc3JASRVvEvl366C3VB1So5IWMsdroFrcq0ugThNKKgByyuG/21epp0fB+GMA5ksepme5Z0W99llpIv8QIDAQAB" )  ; ----- DKIM key mail for demon.of.by

Отсюда берем содержимое в кавычках, объединяем его в одну строчку и помещаем в DNS запись TXT нашего домена:

mail._domainkey.demon.of.by. IN TXT "v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5yWaifpAyB4cX5SJMpxJeWQJ2UzmoCkFVg0y4jQTE2g1m75vP6Qkd8+rolJAVhxxklPAgB9rYgKv1gGsVR6cnOvt0/m89S6dh8VcnvoXVBBe8fIIGHEbQ/VvHU60O/i1krT9HR6zZ3EV26m27ZRS/zhkFbTOnnF6Gjj3dFyUEDsC9vBli2lmR6DiGxz9LsfxrszcqruJCV/+iFTpyIR1LY68MpkXZM/4SBJID+++8gvsNhUk1RFDU8sJgQ0Zei0mUbyyYwc3JASRVvEvl366C3VB1So5IWMsdroFrcq0ugThNKKgByyuG/21epp0fB+GMA5ksepme5Z0W99llpIv8QIDAQAB"

Дополнительно прописываем запись для серверов, у которых не настроен DKIM (для всех клиентов данная директива – одинаковая)

_adsp._domainkey.demon.of.by. IN TXT "dkim=unknown"

Примечание: В данном примере Вы должны заменить домен demon.of.by на Ваш собственный, например example.com

Конфигурируем службу OpenDKIM для обслуживания домена demon.of.by. Добавляем новый ключ в файл с ключами:

server:/# vim /etc/opendkim/KeyTable

# To use this file, uncomment the #KeyTable option in /etc/opendkim.conf,
# then uncomment the following line and replace example.com with your domain
# name, then restart OpenDKIM. Additional keys may be added on separate lines.

mail._domainkey.demon.of.by demon.of.by:mail:/etc/opendkim/demon.of.by/mail.private

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

server:/# vim /etc/opendkim/SigningTable

demon.of.by mail._domainkey.demon.of.by

Указываем службе наши доверенные хосты

server:/# vim /etc/opendkim/TrustedHosts

# To use this file, uncomment the #ExternalIgnoreList and/or the #InternalHosts
# option in /etc/opendkim.conf then restart OpenDKIM. Additional hosts
# may be added on separate lines (IP addresses, hostnames, or CIDR ranges).
# The localhost IP (127.0.0.1) should be the first entry in this file.
127.0.0.1
demon.of.by

Не забудем указать на каком порту должен слушать наш OpenDKIM в конфигурационном файле или в /etc/default/opendkim:

server:/# vim /etc/default/opendkim

SOCKET="inet:8891@localhost" # By default - listen on loopback on port 8891

В нашем случае это порт 8891.

Дабы не валилось "/var/log/dkim-stats: fopen(): Permission denied" - создадим заблаговременно фаил статистики и выставим ему правильные права

server:/# touch /var/log/dkim-stats && chown opendkim:opendkim /var/log/dkim-stats

Перезапускаем OpenDKIM

server:/# /etc/init.d/opendkim restart

Mar  3 15:01:26 ip-10-71-153-106 opendkim[8303]: OpenDKIM Filter v2.6.8 starting (args: -x /etc/opendkim.conf -u opendkim -P /var/run/opendkim/opendkim.pid -p inet:8891@localhost)

Финальный аккорд, добавляем OpenDKIM в Postfix. Для этого отредактируем /etc/postfix/main.cf и добавим следующий строки:

server:/# vim /etc/postfix/main.cf

# DKIM
milter_default_action = accept
milter_protocol = 2
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891

Примечание: Если Вы используете несколько обработчиков (например Postfix/DomainKeys), Вы можете добавить несколько одновременно, как показано ниже:

milter_default_action = accept
milter_protocol = 2
smtpd_milters = inet:localhost:8891,inet:localhost:8892
non_smtpd_milters = inet:localhost:8891,inet:localhost:8892

Перезапускаем Postfix

server:/# /etc/init.d/postfix restart

Отсылаем письма-пустышки на адреса:

  • check-auth@verifier.port25.com
  • autorespond+dkim@dk.elandsys.com

Внимательно анализируем ответы.

Комментарии 9

  1. Алексей — Jan 21, 2016 at 10:41 PM

    Огромнейшее спасибо за столь подробные инструкции! DKIM=pass

  2. Владимир — Dec 08, 2015 at 05:56 PM

    Почему в заголовках исходящих писем дважды просматривается Dkim-Signature?

  3. Дмитрий Владимирович — Mar 16, 2015 at 03:29 PM

    Виталий, к сожалению я не знаю имя вашего почтовика. Не могу проверить DNS. (скиньте его имя на почту).

    Если все ок с DKIM, то в первую очередь я бы порекомендовал проверить наличие PTR-записи - на команду nsloolup xx.yy.zz.xx должно отдаваться каноническое имя вашего почтового сервера.
    Если все ок - то тогда нужно писать запрос в саппорт.

  4. Виталий — Mar 15, 2015 at 06:40 PM

    Добрый день!
    тестирую езде, и везде все отлично.
    тут https://www.mail-tester.com из 10/10
    spf=pass
    dkim=pass
    но в GMAIL упорно идет в СПАМ ((
    Помогите, вдруг, что увидите, пожалуйста.


  5. user — Nov 14, 2014 at 08:37 PM

    Спасибо за ответ, Дмитрий Владимирович. :)

  6. Дмитрий Владимирович — Nov 14, 2014 at 11:36 AM

    DomainKey это устаревший стандарт, который фактически так и не был принят официально и его поглотил стандарт DKIM в итоге. Делать его поддержку необязательно, так как он тут сохранен только для тех систем, которые еще не переведены на DKIM и используют старый формат DomainKey.
    Просто игнорируйте.

  7. user — Nov 13, 2014 at 08:11 PM


    ==========================================================
    Summary of Results
    ==========================================================
    SPF check: pass
    DomainKeys check: neutral
    DKIM check: pass
    Sender-ID check: pass
    SpamAssassin check: ham

    DomainKeys check: neutral - так и должно быть?

  8. Дмитрий Владимирович — Nov 03, 2014 at 03:10 PM

    Rafael, не обязательно но рекомендовано. В принципе это и есть значение по умолчанию.

    ADSP (Author Domain Signing Practices) -- указывает как относиться к наличию подписей у почты другим почтовикам, в частности когда указано "dkim=unknown" -- значит "подпись не обязательна". Если поставите "dkim=all" -- значит вся исходящая почта обязана быть подписана DKIM.

    Вот и все дела.

  9. Rafael — Oct 20, 2014 at 03:51 PM

    Скажите, а обязательно ли прописывать это:
    _adsp._domainkey.demon.of.by. IN TXT "dkim=unknown"
    и что это дает? Спасибо!

  • 1

Комментарии отключены, сожалеем