postfix-policyd-spf-python – защита от подделки – проверки SPF не выполнены, но никаких действий не предпринято – почему?

Вопрос или проблема

Я установил postfix-policyd-spf-python и настроил интеграцию с postfix в соответствии с документацией.

Вот мой файл конфигурации policyd-spf.conf:

debugLevel = 1 
TestOnly = 0

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

Входящие письма с иностранных почтовых серверов проверяются и помечаются правильно. Но когда я проверяю защиту от спуфинга, почему-то письма проходят:

$ telnet mail.example.com 25

Подключено к mail.example.com.
Символ выхода '^]'.
220 mail.example.com ESMTP Postfix
helo asd.somedomain.com
250 mail.example.com
mail from: [email protected]
250 2.1.0 Ок
rcpt to: [email protected]
250 2.1.5 Ок
data
354 Завершите передачу данных с <CR><LF>.<CR><LF>
from: "ME" <[email protected]>
to: "test" <[email protected]>
subject: test

asdasd klajsdlaksjd 

спасибо!
.

250 2.0.0 Ок: помещено в очередь как 8C9EC1260E1

На мой взгляд, это письмо не должно быть доставлено.

Вот вывод отладки из postfix-policyd-spf-python:

policyd-spf[34414]: Найден конец записи
policyd-spf[34414]: Конфигурация: {'debugLevel': 5, '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', 'TestOnly': 0, 'SPF_Enhanced_Status_Codes': 'Yes', 'Header_Type': 'SPF', 'Hide_Receiver': 'Yes', 'Authserv_Id': 'mail.example.com', 'Lookup_Time': 20, 'Whitelist_Lookup_Time': 10, 'Void_Limit': 2, 'Reason_Message': 'Сообщение {rejectdefer} из-за: {spf}. Пожалуйста, смотрите {url}', 'No_Mail': False, 'Mock': False}
policyd-spf[34414]: Кэшированная информация для этого экземпляра: []

policyd-spf[34414]: skip_addresses включен.

policyd-spf[34414]: _get_resultcodes: область: helo, Reject_Not_Pass_Domains: None, helo_policy: SPF_Not_Pass, mfrom_policy: Fail
policyd-spf[34414]: Неиспользуемые результаты helo: ['Pass', 'None', 'Temperror', 'Permerror']
policyd-spf[34414]: Истинные результаты политики helo: действия: {'defer': [], 'reject': ['Fail', 'Softfail', 'Neutral'], 'prepend': ['Pass', 'None', 'Temperror', 'Permerror']} местные {'local_helo': False, 'local_mfrom': False}
policyd-spf[34414]: spfcheck: результат pyspf: "['None', '', 'helo']"
policyd-spf[34414]: None; идентификатор=no SPF запись; client-ip=xx.xx.xx.xx; helo=asd.somedomain.com; [email protected]; receiver=<UNKNOWN> 


policyd-spf[34414]: _get_resultcodes: область: mfrom, Reject_Not_Pass_Domains: None, helo_policy: SPF_Not_Pass, mfrom_policy: Fail
policyd-spf[34414]: Неиспользуемые результаты mfrom: ['Pass', 'None', 'Neutral', 'Softfail', 'Temperror', 'Permerror']
policyd-spf[34414]: Истинные результаты политики mfrom: действия: {'defer': [], 'reject': ['Fail'], 'prepend': ['Pass', 'None', 'Neutral', 'Softfail', 'Temperror', 'Permerror']} местные {'local_helo': False, 'local_mfrom': False}
policyd-spf[34414]: spfcheck: результат pyspf: "['Fail', 'SPF fail - not authorized', 'mailfrom']"

policyd-spf[34414]: Неудача; идентификатор=mailfrom; client-ip=xx.xx.xx.xx; helo=asd.somedomain.com; [email protected]; receiver=<UNKNOWN> 


policyd-spf[34414]: Действие: None: Текст: None Отказ действия: 550 5.7.23

Как мы видим из логов, проверка SPF возвращает:

spfcheck: результат pyspf: "['Fail', 'SPF fail - not authorized', 'mailfrom']"

Однако последняя строка гласит:

Действие: None: Текст: None Отказ действия: 550 5.7.23

Почему так? Почему Действие: None? На мой взгляд, письмо должно быть отклонено, а не принято сервером. Что я делаю не так?

Установка

TestOnly = 1

решает проблему!

Ваша проблема при тестировании может быть связана с проверкой из локальной сети, что разрешено из-за skip_addressses:

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

Согласно документации policyd-spf документации, логическое TestOnly имеет инвертированную семантику:

Сервер политики может работать в режиме только для тестирования. Это позволяет вам видеть
потенциальное воздействие проверки SPF в ваших почтовых логах, не отклоняя почту.
Заголовки добавляются в сообщения, но доставка сообщений не затрагивается. Этот
режим не включен по умолчанию. Чтобы включить его, установите TestOnly = 0.

(policd-spf.conf(5))

#  Если установлено в 0, ни одно сообщение не отклоняется SPF. Это позволяет вам видеть 
#  потенциальное воздействие проверки SPF в ваших почтовых логах, не отклоняя почту.
TestOnly = 1

(policyd-spf.conf.commented)


Конечно, такая формулировка семантики является крайне неинтуитивной, неразумной и ловушкой для пользователей.

Коммит, который внедрил эту опцию, не включает много оправданий:

Изменено имя опции defaultSeedOnly на TestOnly. Предыдущее

имя по-прежнему принимается, но ошибка записывается. Старое имя является наследием
от функции серого списков в tumgreyspf (из которого этот проект был основан
в 2007 году). Новое имя лучше отражает то, что делает опция.

Можно утверждать, что новое имя является улучшением по сравнению с абсолютно непонятным defaultSeedOnly, но новое имя просто также не отражает совершенно, что делает опция …

Конечно, называть вещи сложно, но это злонамеренно.

Ответ или решение

Вопрос, связанный с настройками postfix-policyd-spf-python, часто вызывает недоумение, особенно когда система не выполняет ожидаемое действие по блокировке спуфинга, несмотря на то что SPF-проверки выдают результат "FAIL". Рассмотрим ваши настройки и поведение системы более подробно.

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

Ваши основные настройки в файле policyd-spf.conf выглядят следующим образом:

debugLevel = 1 
TestOnly = 0

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
  1. HELO и MAIL FROM Reject Политики:

    • Вы указали указания для HELO и MAIL FROM – в случае, если они не проходят SPF-проверку, письма должны быть отклонены.
    • Однако, важно, что PermError_reject и TempError_Defer настроены на False, что может повлиять на поведение при возникновении временных или постоянных ошибок SPF.
  2. Пропускаемые адреса:

    • Ваша настройка skip_addresses позволяет системе игнорировать адреса из диапазона 127.0.0.0/8 (localhost), что объясняет, почему вы можете тестировать отправку писем с локального хоста без блокировки.

Логи и поведение

Анализируя вашу отладочную информацию, можно заметить следующее:

  • Логи SPF-проверки показывают, что по идентификаторам HELO и MAIL FROM проверка завершилась неудачно, что указывает на mailfrom с состоянием "Fail".
  • Тем не менее, вывод завершает строку Action: None, что свидетельствует о том, что для этого результата SPF ни одна из указанных политик не привела к выполнению действия отклонения.

Причины неисполнения действий

  1. Режим TestOnly:

    • Один из основных факторов, способствующий тому, что письма обрабатываются, несмотря на неудачные проверки, – это установка параметра TestOnly = 0. Согласно документации, эта опция активирована по умолчанию для тестирования и не должна блокировать сообщения. Установка данного параметра на значение 1 позволяет увидеть, как система будет реагировать в реальных условиях и наблюдать за действиями, не отклоняя сообщения.
  2. Параметры возврата:

    • Как вы уже заметили, результаты проверки SPF показывают "None; identity=no SPF record", что также может указывать на отсутствие SPF-записей для домена отправителя.

Рекомендации

Чтобы устранить проблему с неисполнением действий:

  • Убедитесь, что параметр TestOnly установлен на 0, когда вы хотите применять политики отклонения.
  • Пересмотрите настройки адресов, которые должны быть исключены, чтобы исключить возможность тестирования с локального хоста, если это не требуется.
  • Проверьте SPF-записи для всех доменов, с которых происходят отправки, для обеспечения их корректности.

Таким образом, ваше понимание конфигурации и логистики postfix-policyd-spf-python поможет вам настроить систему для корректного обнаружения и блокировки подделки сообщений.

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

Капча загружается...