Настройка SPF и DKIM

Настройка DKIM + Postfix

Все примеры по настройке DKIM в данной инструкции выполнены на базе систем FreeBSD, Ubuntu и CentOS.

1. Установка OpenDKIM

Для начала, устанавливаем пакет OpenDKIM. Он выполняет операции шифрования заголовков для DKIM, а также содержит набор утилит для формирования ключей.

Для его установки вводим следующее.

Для FreeBSD:

или из портов:

cd /usr/ports/mail/opendkim

Для Ubuntu:

apt-get install opendkim opendkim-tools

Для CentOS:

yum install opendkim opendkim-tools

2. Создание сертификата для домена

Для этого можно воспользоваться бесплатным онлайн инструментом на сайте dkimcore.org. Однако, в данном примере, мы воспользуемся opendkim-genkey и сформируем его самостоятельно.

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

И генерируем их следующей командой:

opendkim-genkey -D /etc/opendkim/ —domain dmosk.ru —selector relay

* где dmosk.ru — домен, с которого будет отправляться почта: relay — имя селектора (селектор — это строковый идентификатор, он может быть любым).

В папке /etc/opendkim/ должно появиться два файла с расширениями .private и .txt. Первый — закрытый ключ (храним его у себя на сервере), второй — готовая txt-запись для DNS.

Задаем группу владельца opendkim для созданных ключей:

chown :opendkim /etc/opendkim/*

Если система выдаст ошибку, что группы opendkim не существует (chown: opendkim: illegal group name), необходимо сначала создать учетную запись.

FreeBSD:

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

Linux (Ubuntu, CentOS):

useradd opendkim -m -s /sbin/nologin

После разрешаем чтение группе владельцу:

chmod g+r /etc/opendkim/*

3. Настройка DNS

Смотрим содержимое файла txt:

cat /etc/opendkim/relay.txt

И используя данное содержимое, в панели управления нашим DNS создаем TXT-запись следующего формата:

relay._domainkey IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqG…rhyaj8OcbwIDAQAB"

* где relay — название нашего селектора MIGfMA0GCSqG…rhyaj8OcbwIDAQAB — сокращенная запись открытого ключа (она длиннее).

Дополнительные необязательные записи

_domainkey IN TXT "o=~; r=postmaster@dmosk.ru"

* где o=~ означает, что не все сообщения подписываются для домена (o=- — говорит, что все письма используют DKIM).

_adsp._domainkey IN TXT "dkim=all"

* all запрещает принимать письма от домена без цифровой подписи. Другие варианты: discardable — блокировать сообщения на стороне получателя, unknown — по умолчанию (такую запись создавать не обязательно).

4. Настройка OpenDKIM и Postfix

OpenDKIM

Открываем конфигурационный файл opendkim.

FreeBSD:

ee /usr/local/etc/mail/opendkim.conf

Linux:

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

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.

Создаем файл доверенных узлов. В него войдут имена хостов, доменов и IP-адресов, которые будут приняты, как доверенные и подписаны.

vi /etc/opendkim/TrustedHosts

И вносим следующее:

127.0.0.1
localhost
*.dmosk.ru

* где dmosk.ru — почтовый домен.

Создаем таблицу KeyTable.

В ней хранится список соответствий между селекторами, доменами и файлами с закрытыми ключами. Формат записей:
<селектор>._domainkey.<домен> <домен>:<селектор>:<путь к закрытому ключу>

vi /etc/opendkim/KeyTable

И в соответствии с форматом приводим его к нужному виду:

relay._domainkey.dmosk.ru dmosk.ru:relay:/etc/opendkim/relay.private

И напоследок, создаем SigningTable. В данной таблице хранятся соответствия между определенными email-адресами и записями в KeyTable.

vi /etc/opendkim/SigningTable

И приводим к такому виду:

*@dmosk.ru relay._domainkey.dmosk.ru

Запускаем службу opendkim.

FreeBSD:

Сначала добавляем демона в rc.conf:

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

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

* первая команда разрешает запуск демона, вторая — принудительно заставляет его запускаться от пользователя opendkim.

И запускаем его:

service milter-opendkim start

Linux:

systemctl start opendkim

или:

Postfix

Открываем конфигурационный файл.

FreeBSD:

ee /usr/local/etc/postfix/main.cf

Linux:

Добавляем или редактируем:

milter_protocol = 2
milter_default_action = accept
smtpd_milters = inet:localhost:12301
non_smtpd_milters = inet:localhost:12301

* если smtpd_milters и non_smtpd_milters присутствуют в конфигурационном файле, то приведенные в данном примере значения нужно дописать к имеющимся.
** 12301 — порт работы opendkim, который был задан в opendkim.conf.

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

или:

systemctl restart postfix

5. Проверка

Отправляем письмо

Отправляем электронное сообщение на различные почтовые системы — mail.ru, gmail.com, yandex.ru.

Способов отправки несколько, например, можно выполнить следующую команду:

echo "Test DKIM" | mail -s "Testing DKIM" -S smtp="localhost:25" -S from="postmaster@dmosk.ru" -S return-path="postmaster@dmosk.ru" master@dmosk.ru

* где admin@dmosk.ru — почтовый ящик, от которого отправляется письмо (напомню, в данном примере подпись создается для домена dmosk.ru), test@mail.ru — Ваш адрес почты, на который придет письмо.

Второй способ — настроить почтовый клиент, который будет отправлять почту через настроенный нами сервер.

Проверяем заголовки

Открываем наше письмо и смотрим заголовки (в mail.ru: ЕщеСлужебные заголовки).

Среди них мы должны увидеть следующую строчку:

dkim=pass header.d=dmosk.ru

Проверка домена на базе DKIM настроена успешно.

6. Что дальше

Чтобы отправка сообщений стала еще надежнее, сделайте следующее:

  1. Убедитесь, что для домена отправки существует правильная запись SPF. Данная запись прописывается как TXT-запись в системе DNS и говорит, с каких почтовых серверов может быть отправлена почта для домена.
  2. Настройте DMARK. Это политики, которые говорят почтовому серверу, что нужно делать с письмами. Требует настроенных SPF и DKIM.

7. Решение проблем

Большинство трудностей решается чтением логов. Для opendkim они будут попадать в общий log-файл почты. Включить его непрерывный просмотр можно следующей командой:

Также, очень часто, проблемы возникают из-за неправильной настройки прав на ключи. Нужно иметь ввиду, что некоторые системы, из соображений безопасности, выдают ошибку, если на файлы выданы слишком широкие права на чтение. То есть, если разрешить читать файлы всем (chmod 644), система будет возвращать ошибку.

Если в логах видим «error loading key», скорее всего, проблема с правами. Внимательно выполните повторно рекомендации 2-о пункта данной инструкции.

Еще одно часто появляющееся сообщение — «opendkim no signing table match for». Оно говорит, что для домена, от которого отправляется почта, нет соответствий в файле SigningTable. Либо была допущена опечатка, либо, на самом деле, для домена отправки не нужно использовать DKIM.

# Серверы# Почта# Интернет# Безопасность# UNIX# Ubuntu# Linux# FreeBSD# CentOS

Была ли полезна вам эта инструкция?

Да            Нет

Как сделать, чтобы письма не попадали в спам? Цифровая подпись DKIM и SPF.

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

Или же они попадают в папку со спамом. В данной статье мы рассмотрим применение DKIM цифровой подписи, а также SPF записи, которые широко используются для подтверждения легитимности Вашего письма.

Легитимность письма (от лат. legitimus — законный, правомерный) — степень оценки письма со стороны почтового сервера получателя. Почтовый сервер получателя может идентифицировать письмо как легитимное или нелегитимное (подозрительное). Легитимные письма без проблем попадают в почтовый ящик получателя. Нелегитимные письма, в свою очередь, не доходят до получателя вообще или же попадают в, так называемую, Спам (Junk) папку получателя.
Даже не смотря на то, что Ваше письмо субъективно выглядит легитимно, у почтового сервера получателя, в соответствии с его политикой фильтрации почты, есть на этот счет свое мнение.

Что такое DKIM

DKIM (сокращенно от DomainKeys Identified Mail) — один из методов E-mail аутентификации. Данную технологию применяют для антифишинга и антиспама с целью повышения качества классификации и идентификации легитимной электронной почты.
Традиционно для идентификации отправителя сообщения используется его IP адрес. В случае использования DKIM, добавляется цифровая подпись к письму, связанная с именем домена отправителя. После отправки такого письма, цифровая подпись проверяется на стороне получателя, после чего, для определения репутации отправителя, применяются «белые списки» и «чёрные списки».
Технология DomainKeys для аутентификации отправителей использует доменные имена. DomainKeys использует существующую систему доменных имен (DNS) для передачи открытых ключей шифрования.

Использование DKIM для почтового домена

Для того, чтобы включить использование цифровой подписи DKIM, зайдите в панель ISP Manager, в разделе "E-mail" — "Почтовые домены", выберите необходимый домен, кликнув дважды по нему. В открывшемся окне, поставьте галочку возле "Включить DKIM".

Вот и все! Теперь отправляемые Вами письма будут подписаны с помощью технологии DKIM.

Что такое SPF?

Sender Policy Framework (структура политики отправителя) — расширение для протокола отправки электронной почты через SMTP, которое позволяет серверу получателю проверить, не подделан ли домен отправителя.

SPF позволяет владельцу домена указать в TXT-записи, соответствующей имени домена, специальным образом сформированную строку, указывающую список серверов, имеющих право отправлять email-сообщения с обратными адресами в этом домене.

SPF включено по умолчанию для всех почтовых доменов нашего хостинга. Пример того, как выглядит SPF запись на нашем хостинге:

Подытожив вышесказанное, хочется напомнить существующее на нашем хостинге правило: частота отправки писем не должна превышать границу 10 писем в минуту.

Как самостоятельно сгенерировать цифровую подпись DKIM?

Существует множество сервисов для генерации DKIM подписи. Рассмотрим, один из таких сервисов http://www.port25.com/support/domainkeysdkim-wizard/. Наша задача состоит в следующем:

— Получение пары приватного и публичного ключа;
— Занесение в DNS информацию домена необходимых записей о наличии поддержки DKIM.

Введите доменное имя, а также имя "селектора" для своего почтового сервера. "Селектор" может иметь любое название, к примеру, mail или key1. Если у Вас несколько серверов для отправки почты, в таком случае, для Вашего домена может существовать несколько "селекторов".

Первую задачу мы успешно выполнили: получили публичный и приватный ключ:

Далее, используя подсказки сервиса, необходимо внести TXT записи в DNS Вашего доменного имени. На нашем примере, необходимо добавить TXT записи: mail._domainkey.example-site.com и _domainkey.example.com.

Обе записи будут иметь следующий вид:

_domainkey.example-site.com. TXT "t=s; o=~;"

mail._domainkey.example.com. TXT "k=rsa\; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQ"

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

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

Теперь, чтобы проверить, правильно ли всё настроено, отправьте письмо на почту Gmail. В хедерах присланного письма должны быть следующие строки:

Authentication-Results: mx.google.com; spf=pass (google.com: domain of example@example-site.com designates 123.123.123.123 as permitted sender) smtp.mail=example@example-site.com; dkim=pass header.i=@example-site.com

Собственно и всё. Помимо предложенных методов, не забывайте и про здравый смысл. При таком дуете, у Вас будет больше шансов пройти проверку на легитимность 😉

Пару лет назад, я написала статью«Как сделать, чтобы письма не попадали в спам ящик».

Вчера мы с коллегами настроили ещё один метод подтверждения писем, под названием DKIM. Его можно использовать вместе с SPF.

Authentication-Results: mxfront7.mail.yandex.net; spf=pass(mxfront7.mail.yandex.net: domain of usabili.ru designates 209.85.212.180 as permitted sender) smtp.mail=askme@usabili.ru; dkim=pass header.i=@usabili.ru

Разница в том, что SPF — подтверждает IP адрес отправителя. DKIM же ip-адрес не учитывает, но подтверждает факт того, что конкретно отправитель имеет секретный ключ, который можно проверить публичным ключом, указанным в днс-записи.

Яндекс, судя по всему, считает DKIM более приоритетным средством борьбы со спамом. См. статью «Цифровая подпись — Яндекс.Помощь: Почта». По этой причине, только письма проверенные через DKIM получают красивенькую медальку рядом с адресом отправителя.

Проверка DKIM для получателя гораздо проще, чем SPF. Так как для проверки DKIM требуется запросить всего одну днс запись, например для моего домена default._domainkey.usabili.ru, и получить оттуда публичный ключ домена, которым можно проверить хеш заголовков, т.е. цифровую подпись(что докажет что я владелец секретного ключа).

В случае же с SPF, процедура проверки сложнее, т.к. надо взять днс запись, из неё взять список разрешённых ip, и ссылки на другие spf записи, которые тоже надо рекурсивно обработать и т.п. Затем сверить ip отправителя с данным списком. В случае, когда письмо проходит через несколько серверов, желательно подписать их все.

А вот отправителю, наоборот, настроить у себя поддержку SPF на порядок проще, чем настроить DKIM. Как я уже писала, для настройки SPF достаточно создать запись:

usabili.ru. IN TXT "v=spf1 a include:_spf.google.com ~all"

Эта строчка разрешает слать почту только с ip указанного в A-записи домена, и с серверов гугл.

Как настроить DKIM в службах для домена от Google

Всё подробно написано вот в этом мануале:
http://support.google.com/a/bin/answer.py?hl=ru&answer=174124
если вкратце, то

  1. Зайти на нужную страницу в панели владельца домена гугл
  2. Выбрать домен и получить код для вставки в днс
  3. Вставить нужный код в TXT запись поддомена.

    Например, у меня google2._domainkey.usabili.ru

  4. Активировать
  5. Profit. Ваши письма, посланные из Gmail, теперь подписываются ключом домена.

Как настроить подпись писем с сервера, при отправке через PHP

Если вы отправляете письма в PHP через SMTP сервера гугла, то всё уже сделано. Гугл использует подпись при отправке через SMTP.

Если же вы отправляете почту функцией , то в системе необходимо установить пакет .

Или

Затем сгенерировать ключ через dkim-genkey. Лентяи вроде нас, могут использовать его для всех доменов на сервере. Сгенерированный в файле .txt публичный ключ нужно добавить в днс записи доменов.

Далее читаем статьи

 Личные комментарии по настройке sendmail.

  • Для sendmail нужно редактировать файл /etc/mail/sendmail.mc, не submit.mc.
  • Для компиляции конфига удобно вместо m4 использовать прилагающийся make(он сам запустит m4).

Как проверить записи DKIM

Для этого можно воспользоваться онлайн сервисом http://dkimcore.org/c/keycheck, либо послать письмо на указанный тут адрес http://appmaildev.com/en/dkim/.

Пользователи линукса могут набрать команду # dig google2._domainkey.usabili.ru TXT

Либо послать письмо на ящик в гугле или яндексе.

В гмайл, если нажать на стрелочку, будет видно что-то типа

от:  BoughCMS Notifynoreply@usabili.ru
кому:  ***
дата:  28 июня 2012 г., 15:08
тема:  Usabili.ru: Письмо с сайта
отправлено через:  ***.ru
подписан:  usabili.ru

Заключение

Хочу обратить внимание на ещё несколько пунктов.

Если вы используете возможность гмайла "Отправлять письма как:", т.е. не отправлять их напрямую со своего ящика. То гмайл будет подписывать DKIM оригинальным ящиком отправителя, а не вашим доменом.

Если вы абсолютно уверены, что успешно настроили DKIM, то можете запретить другим серверам принимать письма с вашим доменом, но без подписи, добавив ADSP запись:

Update

Я совсем забыла рассказать про то как присваивать доменные подписи конкретным email адресам. Дело в том что вы можете отправить почту с домена X, через почтовый сервер домена Y, а подписать его ключом домена Z. И это даже будет работать =). Настройка ключей происходит в файле . Здесь стоит обратить внимание на часть строк, задающую , она может содержать звёздочку, как часть или весь домен. В случае указания просто звёздочки, данным ключом и доменом будут подписываться все письма.

# sender-pattern:signing-domain:keypath # *:example.com:selector *@usabili.ru:usabili.ru:/etc/mail/dkim-milter/keys/default # тут всякие остальные домены, а ниже домен для подписи по-умолчанию. *:verytec.ru:/etc/mail/dkim-milter/keys/default

Внимательный читатель заметил, что путь к секретному ключу один на все домены. Это ничуть не мешает работе подписей.

Всего вам доброго =)

.

Enter a domain name like dnswatch.info

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 the individual user.

Selectors are needed to support some important use cases. For example:
Domains that want to delegate signing capability for a specific address for a given duration to a partner, such as an advertising provider or other outsourced function.
Domains that want to allow frequent travelers to send messages locally without the need to connect with a particular MSA.
"Affinity" domains (e.g., college alumni associations) that provide forwarding of incoming mail, but that do not operate a mail submission agent for outgoing mail.

Periods are allowed in selectors and are component separators. When keys are retrieved from the DNS, periods in selectors define DNS label boundaries in a manner similar to the conventional use in domain names. Selector components might be used to combine dates with locations, for example, «march2005.reykjavik». In a DNS implementation, this can be used to allow delegation of a portion of the selector namespace.

This value MUST match the Local-part of the "i=" tag of the DKIM-Signature header field (or its default value of the empty string if "i=" is not specified), with a single, optional "*" character matching a sequence of zero or more arbitrary characters ("wildcarding"). An email with a signing address that does not match the value of this tag constitutes a failed verification. The intent of this tag is to constrain which signing address can legitimately use this selector, for example, when delegating a key to a third party that should only be used for special purposes.

Wildcarding allows matching for addresses such as "user+*" or "*-offer". An empty granularity value never matches any addresses.

Notes that might be of interest to a human, e.g. a URL like http://www.dnswatch.info. No interpretation is made by any program. This tag should be used sparingly due to space limitations in DNS. This is intended for use by administrators, not end users.

Base64 encoded public-key data.
Public keys can be generated with openssl for instance:

To create a private key:

To create a public key using the private key:

Verifiers MUST NOT treat messages from signers in testing mode differently from unsigned email, even should the signature fail to verify. Verifiers MAY wish to track testing mode results to assist the signer.

If subdomains are not allowed, the following applies:
Any DKIM-Signature header fields using the "i=" tag MUST have the same domain value on the right-hand side of the "@" in the "i=" tag and the value of the "d=" tag. That is, the "i=" domain MUST NOT be a subdomain of "d=". Prohibiting subdomaining is RECOMMENDED unless subdomaining is required.

Добавить комментарий

Закрыть меню