Postfix настройка SPF

postfix_spfSPF (Sender Policy Framework) — расширение для протокола SMTP, позволяющее проверить, не подделан ли домен отправителя. Ниже будет рассмотрен принцип работы SPF и настройка Postfix для работы с данным расширением.

Принцип работы

На DNS сервере создается SPF(TXT) запись, содержащая список хостов, которым разрешено выполнять пересылку почты от имени данного домена. При получении письма, почтовый сервер выполняет DNS запрос для получение содержимого SPF записи и решает, является ли инициатор письма разрешенным. Информация о проверке SPF записи добавляется в заголовок письма, и может быть использована в дальнейшем анти-спам фильтрами. В зависимости от политики SFP, письмо может быть отвергнуто принимающим сервером в случае неудачной проверки.

Синтаксис SPF записи

Любая SPF запись начинается с указания версии. На момент написания существовала только версия 1.

v=spf1

Далее, через пробел, указываются поддерживаемые механизмы:

  • ALL — совпадает со всеми, используется для указания политики по умолчанию;
  • A —  совпадает с DNS записью типа A;
  • PTR — совпадает с DNS записью типа PTR;
  • MX — совпадает с DNS записью типа MX;
  • IP4 — совпадает с IP адресом 4-ой версии;
  • IP6 — совпадает с IP адресом 6-ой версии;
  • EXISTS — совпадает если домен существует в независимости от адреса;
  • INCLUDE — включает в себя SPF запись указанного домена.

С указанными выше механизмами используются следующие префиксы:

  • «+» — PASS пропустить, можно не указывать, это поведению по умолчанию;
  • «?» — NEUTRAL нейтральный, аналогично отсутствию записи(NONE);
  • «∼» — SOFTFAIL «мягкий запрет» добавляет заголовок о неудачной проверке. Сообщение пропускается;
  • «-» — FAIL запрет, сообщение должно быть отброшено.

Также SPF запись может содержать в себе модификаторы:

  • REDIRECT — перенаправляет поиск на указанный домен;
  • EXP — указывает на домен, который содержит TXT запись с сообщением, выдаваемым клиенту в случае запрета доставки.

Модификаторы не являются обязательными и могут использоваться с одной записью один раз. Более подробное описание синтаксиса и примеры можно найти на странице SPF Record Syntax.

Проверка SPF в Postfix

Для демонстрации практической части, выполним чистую установку SMTP сервера на основе Postfix. В качестве операционной системы будет выступать Ubuntu Server 16.04. После установки Ubuntu, сменим имя сервера на mail

# hostnamectl set-hostname mail

Укажем полное и сокращенное имя сервера в файле hosts

# nano /etc/hosts

127.0.0.1       localhost
127.0.1.1       mail.4skill.ru  mail
. . .

Зададим сетевые настройки

# nano /etc/network/interfaces
. . .
# The primary network interface
auto ens32
iface ens32 inet static
        address 192.168.1.34
        netmask 255.255.255.0
        gateway 192.168.1.1
        dns-nameservers 192.168.1.21 192.168.1.22
        dns-search 4skill.ru

В dns-nameservers указаны адреса локальных DNS серверов, на которых будет продемонстрировано добавление SPF записи. Более подробно о настройке сети написано в статье Ubuntu Server настройка сети.

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

# reboot

Обновим индексы пакетов

# apt update

Обновим систему

# apt upgrade

Более подробно об обновлении Ubuntu написано в статье Обновление Ubuntu Server.

Установим Postfix

# apt install postfix

Тип настройки почтового сервера оставляем без изменений и нажимаем «Ok».
postfix_setup

В поле системное почтовое имя нужно указать название своего почтового домена. В данном случае это 4skill.ru.

postfix_setup_domain
Полная установка Postfix в связке с Dovecot описана в статье Postfix Dovecot LDAP.

По умолчанию Postfix не умеет проверять SPF записи. Для того чтобы исправить эту ситуацию, можно использовать следующие пакеты:

  • postfix-policyd-spf-python — предпочтительный
  • postfix-policyd-spf-perl

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

Установим postfix-policyd-spf-python

# apt install postfix-policyd-spf-python

После установки нужно добавить следующие строки в конец файла master.cf

# nano /etc/postfix/master.cf
. . .
policyd-spf  unix  -       n       n       -       0       spawn
            user=policyd-spf argv=/usr/bin/policyd-spf

В файл main.cf добавим следующие строки

# nano /etc/postfix/main.cf
. . .
smtpd_relay_restrictions =
 permit_mynetworks
 permit_sasl_authenticated
 defer_unauth_destination
 check_policy_service unix:private/policyd-spf
. . .
policyd-spf_time_limit = 3600

Здесь важна последовательность. Строка отвечающая за проверку SPF (check_policy_service unix:private/policyd-spf) должна быть последней в списке ограничений smtpd_relay_restrictions.
Параметр policyd-spf_time_limit = 3600 определяет временной предел проверки сообщения.

Настройки проверки SPF записи определяются в файле policyd-spf.conf

# nano /etc/postfix-policyd-spf-python/policyd-spf.conf

#  For a fully commented sample config file see policyd-spf.conf.commented

debugLevel = 1
defaultSeedOnly = 1

HELO_reject = SPF_Not_Pass
Mail_From_reject = Fail

PermError_reject = False
TempError_Defer = False

skip_addresses = 127.0.0.0/8,::ffff:127.0.0.0/104,::1

Whitelist = 192.168.1.111,192.168.1.112
Reject_Not_Pass_Domains = ya.ru,gmail.com

Параметр debugLevel определяет уровень логирования. Может иметь значение от 0 до 5. Параметр defaultSeedOnly нужен для тестирования. Если выставить значение в 0, логирование продолжится, но к почте не будут применяться никакие действия. Параметр HELO_reject определяет политику проверки поля HELO/EHLO. По умолчанию отбрасываются письма, имеющие статус отличный от Pass/None/Tempfail. Параметр Mail_From_reject определяет политику проверки поля MAIL FROM. По умолчанию отбрасываются письма со статусом Fail. Параметры PermError_reject и TempError_Defer определяют, что делать с сообщениями со статусом PermError и TempError. По умолчанию сообщения пропускаются в обоих случаях. В параметре skip_addresses указываются адреса локальных сетевых интерфейсов, для которых нужно пропустить проверку. По умолчанию проверка пропускается на петлевом(loopback) интерфейсе. Параметры Whitelist и Reject_Not_Pass_Domains добавлены вручную и не являются обязательными. В параметре Whitelist указаны IP адреса хостов, от которых почта должна приниматься в любом случае, не зависимо от результатов проверки SPF. В параметре Reject_Not_Pass_Domains указаны домены, почта от которых будет отбрасываться во всех случаях кроме Pass/None. Более подробное описание всех параметров можно найти на странице Ubuntu manuals.

Перезапустим Postfix

# service postfix restart

 
Добавление SPF записи и тестирование

Добавление SPF записи будет осуществляться на локальных DNS серверах под управлением Windows 2012R2. Их адреса были указаны в параметре dns-nameservers. Для демонстрации, заранее была создана зона 4skill.ru, в которую были добавлены записи типа A и MX для сервера mail.

zone_4skill_ru

Попробуем послать письмо от имени домена 4skill.ru, из Windows клиента, используя CMD и telnet

C:\>telnet 192.168.1.34 25
220 mail.4skill.ru ESMTP Postfix (Ubuntu)
EHLO pc.4skill.ru
250-mail.4skill.ru
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
mail from: test@4skill.ru
250 2.1.0 Ok
rcpt to: root@4skill.ru
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
.
250 2.0.0 Ok: queued as 4E14122E4A
quit
221 2.0.0 Bye

Сообщение было успешно принято. Посмотрим на его заголовок

# tail /var/mail/root

From test@4skill.ru  Tue Oct 10 15:03:08 2017
Return-Path: <test@4skill.ru>
X-Original-To: root@4skill.ru
Delivered-To: root@4skill.ru
Received-SPF: None (no SPF record) identity=mailfrom; client-ip=192.168.1.10; helo=pc.4skill.ru; envelope-from=test@4skill.ru; receiver=root@4skill.ru
Received: from pc.4skill.ru (unknown [192.168.1.10])
        by mail.4skill.ru (Postfix) with ESMTP id 4E14122E4A
        for <root@4skill.ru>; Tue, 10 Oct 2017 15:02:57 +0300 (MSK)

Postfix добавил в заголовок сообщения строку с результатом проверки, указывающей на отсутствие SPF записи для домена отправителя.

Добавим SPF запись. Для этого нажмем правой кнопкой мыши по DNS зоне, выберем «Другие новые записи…» в окне «Тип записи ресурса» выберем «Текст (TXT)» и нажмем «Создать запись…»

add_txt_spf

В поле текст укажем значение SPF записи

v=spf1 mx ~all

spf_soft_fail

Из данного примера видно, что отправка почты от имени домена 4skill.ru возможна только для узлов, имеющих MX(mx) запись. Почта от остальных клиентов также будет приниматься, но с пометкой о неудачной проверке(∼all).

Повторим отправку почты из Window клиента и посмотрим на заголовок принятого сообщения

# tail /var/mail/root

From test@4skill.ru  Tue Oct 10 15:31:17 2017
Return-Path: <test@4skill.ru>
X-Original-To: root@4skill.ru
Delivered-To: root@4skill.ru
Received-SPF: Softfail (domain owner discourages use of this host) identity=mailfrom; client-ip=192.168.1.10; helo=pc.4skill.ru; envelope-from=test@4skill.ru; receiver=root@4skill.ru
Received: from pc.4skill.ru (unknown [192.168.1.10])
        by mail.4skill.ru (Postfix) with ESMTP id 3E2BA22E4A
        for <root@4skill.ru>; Tue, 10 Oct 2017 15:31:01 +0300 (MSK)

Из заголовка видно, что SPF запись для домена отправителя присутствует, но письмо не прошло проверку, о чем свидетельствует статус Softfail.

Изменим значение SPF записи для всех с Softfail (∼all) на Fail (-all). В итоге должно получится так

v=spf1 mx -all

Повторим отправку почты из Window клиента

C:\>telnet 192.168.1.34 25
220 mail.4skill.ru ESMTP Postfix (Ubuntu)
EHLO pc.4skill.ru
250-mail.4skill.ru
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
mail from: test@4skill.ru
250 2.1.0 Ok
rcpt to: root@4skill.ru
550 5.7.1 <root@4skill.ru>: Recipient address rejected: Message rejected due to: SPF fail - not authorized. Please see http://www.openspf.net/Why?s=mfrom;id=test@4skill.ru;ip=192.168.1.10;r=root@4skill.ru

На этот раз Postfix отказался принимать сообщение. Так как значение префикса Fail.

Windows клиент, инициирующий telnet соединение, имеет IP адрес 192.168.1.10. Добавим этот IP в SPF запись, в качестве разрешенного сервера пересылки

v=spf1 mx ip4:192.168.1.10 -all

Повторим отправку почты из Window клиента и посмотрим на заголовок принятого сообщения

# tail /var/mail/root

From test@4skill.ru  Tue Oct 10 16:07:51 2017
Return-Path: <test@4skill.ru>
X-Original-To: root@4skill.ru
Delivered-To: root@4skill.ru
Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=192.168.1.10; helo=pc.4skill.ru; envelope-from=test@4skill.ru; receiver=root@4skill.ru
Received: from pc.4skill.ru (unknown [192.168.1.10])
        by mail.4skill.ru (Postfix) with ESMTP id 3E2BA22E4A
        for <root@4skill.ru>; Tue, 10 Oct 2017 15:31:01 +0300 (MSK)
Received: from pc.4skill.ru (unknown [192.168.1.10])
        by mail.4skill.ru (Postfix) with ESMTP id E7BE922E4A
        for <root@4skill.ru>; Tue, 10 Oct 2017 16:07:29 +0300 (MSK)

Из заголовка видно, что сообщение успешно прошло SPF проверку, о чем сигнализирует статус Pass.

Посмотрим как результат SPF проверки отражается в почтовом логе

# grep policyd-spf /var/log/mail.log | tail -n2

Oct 13 09:55:30 mail policyd-spf[63381]: None; identity=helo; client-ip=192.168.1.10; helo=pc.4skill.ru; envelope-from=test@4skill.ru; receiver=root@4skill.ru
Oct 13 09:55:30 mail policyd-spf[63381]: Pass; identity=mailfrom; client-ip=192.168.1.10; helo=pc.4skill.ru; envelope-from=test@4skill.ru; receiver=root@4skill.ru

Первая строка отражает статус SPF проверки в поле HELO/EHLO и имеет статус None, что говорит об отсутствии SPF записи для проверяемого узла. Добавление SPF записи для имени узла не имеет практического смысла, но в целях демонстрации она будет добавлена. Перейдем в оснастку DNS сервера и добавим новую запись типа «Текст (TXT)» для узла pc

v=spf1 a ~all

 
pc_add_spf

Отправка от имени pc.4skill.ru разрешена только для pc.4skill.ru (a), остальные получат Softfail (∼all). Также нужно убедится, что для узла pc.4skill.ru существует DNS запись типа A

pc_add_a_record

Повторим отправку почты из Window клиента и посмотрим на результат проверки в почтовом логе

# grep policyd-spf /var/log/mail.log | tail -n2

Oct 13 10:28:48 mail policyd-spf[63461]: Pass; identity=helo; client-ip=192.168.1.10; helo=pc.4skill.ru; envelope-from=test@4skill.ru; receiver=root@4skill.ru
Oct 13 10:28:48 mail policyd-spf[63461]: Pass; identity=mailfrom; client-ip=192.168.1.10; helo=pc.4skill.ru; envelope-from=test@4skill.ru; receiver=root@4skill.ru

Проверка SPF записи в поле HELO/EHLO успешно пройдена, о чем говорит статус Pass.

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *