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

Опубликовано:

SPF и DKIM – это механизмы верификации почтового сервера, позволяющие проверить его подлинность. Многие почтовые сервера используют их при получении почты, чтобы быть уверенным в том, что получаемая почта не является спамом. Если вы организуете рассылку со своего почтового сервера, например, периодическую рассылку, либо рассылку писем от вашего интернет-магазина, вам, скорее всего, придется настраивать оба механизма, поскольку это позволит быть уверенным в том, что ваши письма доставляются и автоматически не определяются как спам.

Настройка SPF (Sender Policy Framework).

Настройка SPF является достаточно простой. Для этого достаточно создать записи DNS, определяющие, с каких серверов разрешена отправка почты для данного домена. Использоваться могут два типа записи – TXT и SPF.

domain.ru TXT "v=spf1 a mx ip4:<IP-адрес-почтового-сервера> -all"
domain.ru SPF"v=spf1 a mx ip4:<IP-адрес-почтового-сервера> -all"

В данном примере указывается,  что отправка почты данного домена разрешена только с хоста с адресом <IP-адрес-почтового-сервера>, для которого есть записи типа A и MX, со всех остальных отправка запрещена.

После добавления записей не забудьте изменить serial для зоны DNS и перезагрузить информацию о доменной зоне. Если вы всё сделали правильно, то при отправке письма на другой домен, например, на gmail.com, в заголовках письма вы увидите следующий заголовок:

Настройка SPF записи

SPF-запись — проверка отправителя.

Как всем известно, протокол отправки электронной почты SMTP, подразумевает, что в качестве отправителя можно указать любой почтовый ящик. Таким образом можно послать письмо, подставив в поле «From» вымышленное значение. Процесс такого почтового обмана называется Спуфинг (e-mail spoofing). Чтобы бороться с этим явлением, был разработан и введен в действие стандарт SPF – Sender Policy Framework (структура политики отправителя).

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

Рассмотрим простой пример SPF-записи:

 example.org. IN TXT "v=spf1 +a +mx -all"

Теперь более детально о допустимых опциях. Рассмотрим варианты поведения получателя, в зависимости от используемых опций:

 

  • «v=spf1» — используемая версия SPF.
  • «+» — принимать корреспонденцию (Pass). Этот параметр установлен по умолчанию. Тоесть, если никаких параметров не установлено, то это «Pass»;
  • «-» — Отклонить (Fail);
  • «~» — «мягкое» отклонение (SoftFail). Письмо будет принято, но будет помечено как СПАМ;
  • «?» — нейтральное отношение;
  • «mx» — включает в себя все адреса серверов, указанные в MX-записях домена;
  • «ip4» — опция позволяет указать конкретный IP-адрес или сеть адресов;
  • «a» — указываем поведение в случае получения письма от конкретного домена;
  • «include» — включает в себя хосты, разрешенные SPF-записью указанного домена;
  • «all» — все остальные сервера, не перечисленные в SPF-записи.

 

Итак, попробуем разобраться, что же значит SPF-запись, указанная выше.

 

  • «+a» — разрешает прием писем от узла, IP-адрес которого совпадает с IP-адресом в A-записи для example.org;
  • «+mx» — разрешает прием писем, если отправляющий хост указан в одной из MX-записей для example.org;
  • «-all» — все сообщения, не прошедшие верификацию с использованием перечисленных механизмов, следует отвергать.

 

Для лучшего понимания того, как работает SPF, рассмотрим еще один, более сложный пример:

 example.org. IN TXT "v=spf1 mx ip4:78.110.50.123 +a:mail.ht-systems.ru include:gmail.com ~all"

Теперь более подробно о используемых опциях...

 

  • «mx» — принимать письма от серверов, указанных в MX-записях;
  • «ip4:78.110.50.123» — принимать письма, отправленные с IP-адреса 78.110.50.123;
  • «+a:mail.ht-systems.ru» — то же, что и a:mail.ht-systems.ru. Принимать от mail.ht-systems.ru;
  • «include:gmail.com» — принимать письма с серверов, разрешенных SPF-записями gmail.com;
  • «~all» — принимать письма со всех остальных серверов, но помечать их как СПАМ

 

А теперь рассмотрим еще более «экзотичный» пример. В описании возможных опций указывалось, что возможно указание сетей ip-адресов. Стоит отметить, что это применимо и к записям «a» и «mx». Рассмотрим следующий пример:

 example.org. IN TXT "v=spf1 mx/24 a:hts.ru/24 -all" 

«mx/24» — в список разрешенных отправителей входят все IP-адреса, находящихся в тех же сетях класса С, что и MX-ы домена;
«a:hts.ru/24» — в список разрешенных отправителей входят все IP-адреса, находящихся в тех же сетях класса С, что и А-записи домена hts.ru;
«-all» — всех остальных отправителей — блокируем.

Иногда можно встретить следующие записи (очень редко):

«ptr» — проверяет PTR-запись IP-адреса отправителя. Если она сходится с указаным доменом, то механизм проверки выдает положительный результат. Тоесть, разрешено отправлять всем IP-адресам, PTR-запись которых направлены на указанный домен. Серьезным недостатком даного метода есть то, что генерируется очень большое количество DNS-запросов;
«exists» — выполняется проверка, резолвится ли домен на какой-либо IP-адрес. Тоесть, по существу, выполняется проверка работоспособности доменного имени. Кстати, не имеет значения, на какой IP-адрес резолвится домен, даже если это «серые» сети (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) или loopback (127.0.0.1).

Пример использования:

 example.org. IN TXT "v=spf1 ptr:example.org exist:example.org -all"

Также не будет излишним ознакомиться со следующими опциями: redirect и exp.

«redirect» — указывает получателю, что нужно проверять SPF-запись указаного домена, вместо текущего домена. Пример:

 example.org. IN TXT "v=spf1 redirect:example.com ~all"

В даном примере будет проводится проверка SPF-записи домена example.com, а не example.org.

«exp» — использование даной опции позволяет задать сообщение о ошибке, которое будет передано отправителю при возникновении таковой. Размещается в конце SPF-записи, даже после опции all. Рассмотрим более детально механизм работы опции exp.

Допустим, что у домена example.org следущая SPF-запись:

 example.org. IN TXT "v=spf1 +a +mx -all exp=spf.example.org"

Теперь содаем TXT-запись для домена spf.example.org:

 spf.example.org. IN TXT "You host not allowed e-mail to me"

В результате этих шаманских действий SPF-запись будет контролировать, чтобы почта доставлялась только от валидных хостов, а всем остальным будет отправляться сообщение о ошибке, прописанное в TXT-записи домена spf.example.org.

Так же стоит обратить внимание, что любое решение о блокировке или маркировке письма как спам, решает программа которая обрабатывает получение почты на сервере, иногда даже почтовые программы это тоже делают.

Received-SPF:

Настройка DKIM (DomainKeys Identified Mail).

Настройка DKIM несколько сложнее, чем настройка SPF. Для работы этого механизма необходимо следующее:

– Почтовый сервер должен уметь подписывать письма
– Должны быть созданы приватный и публичный ключи
– Должны присутствовать записи в DNS, указывающие на наличие поддержки DKIM

Генерация ключей.

Ключи можно сгенерировать при помощи OpenSSL. Генерация приватного ключа:

# openssl genrsa -out dkimprivate.key 1024 
Generating  RSA private key, 1024 bit  long modulus
.++++++
.....................++++++
e is 65537 (0x10001) 

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

chmod 400 /etc/ssl/ private/dkimprivate.key

Генерация публичного ключа:

openssl rsa -pubout -in dkimprivate.key -out dkimpublic.key
writing  RSA key

Ключи готовы. Их можно разместить в директории, где хранятся другие ключи. Для Debian'а это директория /etc/ssl/private. Сгенерировать их можно также при помощи программы opendkim-genkey, входящую в пакет opendkim-tools. Теперь надо добавить записи в DNS. Записей будет две.

_domainkey.domain.ru.        TXT o=~;"
mail._domainkey.domain.ru. TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCoCH8kcKOUHIx1Gbv461a9iZYaqS3LfjGLHR1aJEQkAChMEB5xc74UeEcTWo0rx5sBAgbhUj/5nefL4K4cxFLnFIKkPZZp/e2euTsKd0c3kE3Go5vu9jERzXnsb0jAQO0K85Jfw/gQahTC4qDOce5B5REsXtMtUR8r9J+dnACpzQIDAQAB"
_adsp._domainkey.domain.ru.   TXT "dkim=all"

То, что идет после «p=» – это ключ, содержащийся в файле dkimpublic.key, он записывается в одну строчку. А запись «_adsp._domainkey.domain.ru» определяет, должны ли подписываться письма. Возможные варианты:
«dkim=all» – все письма должны подписываться
«dkim=discardable» – неподписанные письма не должны приниматься
«dkim=unknown» – то же самое, что и отсутствие такой записи.
После создания записей изменяем serial и перезагружаем настройки bind'а, если у вас установлен он. И теперь осталось последнее – настроить почтовый сервер. В качестве почтового сервера возьмем Postfix.

Настройка поддержки DKIM почтовым сервером Postfix.

Последняя и, пожалуй, самая важная часть – включение подписи писем почтовым сервером. Самое первое, что нужно сделать на этом этапе, – это установить opendkim:

apt-get  install opendkim

Теперь необходимо настроить этот сервис. Первым делом поменяем файл /etc/default/opendkim. Впишем туда следующую строчку:

SOCKET="inet:10024@localhost"

Теперь наш сервер будет запускаться на порту 10024 на loopback-интерфейсе. Следующий файл, который необходимо изменить, – это /etc/opendkim.conf.

Раскомментируем строчку со словом Domain, вписываем название нашего домена:

Domaindomain.ru

Теперь указываем файл с приватным ключом:

KeyFile/etc/sll/private/dkimprivate.key

После этого указываем селектор, который мы использовали для сгенерированного ранее публичного ключа, указывая его в записи DNS. В нашем случае это «mail»:

Selectormail

Дописываем строчку:

Backgroundyes

Теперь можно рестартовать opendkim:

service opendkim restart

И последний шаг – настройка непосредственно Postfix'а. Изменяем файл /etc/postfix/main.cf. Добавим туда следующие строчки:

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

Теперь перезапускаем postfix и отправляем письмо. После получения смотрим заголовки письма. В них должен присутствовать следующий заголовок:

Authentication-Results: mx.google.com;
spf=pass(google.com:>domain of user@domain.ru designates 62.113.208.35 as permitted sender) smtp.mail=user@domain.ru;
dkim= pass header.i=@domain.ru

Если вы видите строчки «spf=pass» и «dkim=pass», значит вы все сделали правильно и ваш почтовый сервер теперь будет значительно лучше восприниматься другими почтовыми серверами, с чем я вас и поздравляю

Понравилась статья, расскажи о ней друзьям, нажми кнопку!