You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
11 KiB
131 lines
11 KiB
9 years ago
|
---
|
||
|
title: postfix и спамеры
|
||
|
tags: mail, postfix
|
||
|
---
|
||
|
|
||
|
В этой заметке собраны практические наработки по противодействию спаму для систем, использующих postfix в качестве MTA.
|
||
|
|
||
|
Штатные средства
|
||
|
-----------------
|
||
|
|
||
|
Первое и главное, на что нужно смотреть в конфиге по-умолчанию - это для кого и от кого принимается почта. Основные опции, которые **нужно** посмотреть:
|
||
|
|
||
|
- ``mydestination`` -- домен или конкретное имя этого хоста. Ничего лишнего. Если вы используете виртуальные домены - оставьте только localhost.
|
||
|
- ``mynetworks[_style]`` -- ни в коем случае не 0.0.0.0/0, юзеры из этих сетей получают больше прав "по умолчанию", в частности доступ к использованию пересылки почты на внешние адреса.
|
||
|
- ``relay_domains`` -- пересылать почту для этих доменов, по умолчанию - то же самое что и mydestination
|
||
|
- ``virtual_mailbox_domains`` -- то же самое что и mydestination, но для виртуальных доменов. см. ``VIRTUAL_README`` в документации, чтобы понять чем они отличаются от "обычных".
|
||
|
|
||
|
Полный список опций с их описанием можно посмотреть в `postconf(5)`.
|
||
|
|
||
|
Далее, начинаем рубить спамеров ещё "на подлёте":
|
||
|
|
||
|
HELO/EHLO
|
||
|
----------
|
||
|
|
||
|
smtpd_helo_required = yes
|
||
|
smtpd_helo_restrictions = permit_mynetworks,
|
||
|
permit_sasl_authenticated,
|
||
|
reject_non_fqdn_helo_hostname,
|
||
|
reject_unknown_helo_hostname,
|
||
|
permit
|
||
|
|
||
|
Ограничения:
|
||
|
|
||
|
* ``reject_non_fqdn_helo_hostname`` -- требовать, чтобы в HELO/EHLO было что-то похожее на hostname
|
||
|
* ``reject_unknown_helo_hostname`` -- ...и этот хостнейм должен ресолвится по dns'у в ipv4/v6 адрес
|
||
|
|
||
|
Первое помогает от совсем тупых ботов, второе - частично от vps'ок с ломанным wordpress'ом.
|
||
|
|
||
|
Адрес клиента, IPv4/IPv6
|
||
|
-------------------------
|
||
|
|
||
|
smtpd_client_restrictions = permit_mynetworks,
|
||
|
permit_sasl_authenticated,
|
||
|
reject_unauth_pipelining,
|
||
|
check_client_access hash:/etc/postfix/relay_access,
|
||
|
reject_unknown_client_hostname,
|
||
|
check_reverse_client_hostname_access pcre:/etc/postfix/reverse_hostname_access.pcre,
|
||
|
reject_multi_recipient_bounce,
|
||
|
permit
|
||
|
|
||
|
Ограничения:
|
||
|
|
||
|
* ``reject_unauth_pipelining`` -- сбрасывать сессию, если клиент пытается отправлять команды не дождавшись ответа на предыдущую команду
|
||
|
* ``reject_unknown_client_hostname`` -- сбрасывать сессию, если не совпадают записи IP -> DNS/PTR или DNS/A -> IP для того хостнейма, что указан в EHLO
|
||
|
см также. ``reject_unknown_reverse_client_hostname``, более слабую альтернативу этой проверки.
|
||
|
* ``reject_multi_recipient_bounce`` -- сбрасывать сессию, если не указан отправитель и указано несколько получателей.
|
||
|
* ``check_reverse_client_hostname_access`` -- позволяет дать отлуп заведомо левым хостам на основе ненастроенной PTR записи
|
||
|
|
||
|
Помогает от биомассы с завирусованным виндузом, дырявых CMS на VPS'ках и просто кулхацкеров на диалапе. Примерное содержимое файлика:
|
||
|
|
||
|
/.*(dynamic|broadband|\.dyn\.|\.ddns|\.vps\.).*/i 421 Dynamic hostname. Fix it and try again.
|
||
|
/.*(\.adsl|\.cdma\.|\.pptp|\.pppoe|\.cable).*/ 421 Dynamic hostname. Fix it and try again.
|
||
|
/.*(\d+[-.]){4}.*/ 421 Dynamic hostname. Fix it and try again.
|
||
|
|
||
|
Исключения:
|
||
|
|
||
|
* ``check_client_access`` -- позволяет вводить исключения для произвольных хостов.
|
||
|
|
||
|
Адрес отправителя
|
||
|
------------------
|
||
|
|
||
|
smtpd_sender_restrictions = reject_non_fqdn_sender,
|
||
|
permit_auth_destination,
|
||
|
reject_unknown_sender_domain,
|
||
|
permit
|
||
|
|
||
|
Ограничения:
|
||
|
|
||
|
* ``reject_non_fqdn_sender`` -- в `MAIL FROM:` должно быть что-то похожее на email
|
||
|
* ``reject_unknown_sender_domain`` -- проверить через dns, что домен отправителя действительно существует
|
||
|
|
||
|
Также, можете задействовать это:
|
||
|
|
||
|
* ``reject_unverified_sender`` -- сбросить сессию, если обратное письмо отправителю заведомо не будет доставлено
|
||
|
|
||
|
Это достаточно хардкорная опция, и должна применяться ограниченно. Суть такова: наш сервер соединяется с доменом отправителя и пытается отправить ему письмо, сбрасывая отправку в последний момент. Можно легко нарваться на тот же кривонастроенный fail2ban, и почта к этому домену перестанет ходить вовсе. Кроме того, эта опция вносит ощутимую задержку в доставку письма - до 20 секунд.
|
||
|
|
||
|
Адрес получателя
|
||
|
-----------------
|
||
|
|
||
|
smtpd_recipient_restrictions = reject_non_fqdn_recipient,
|
||
|
permit_sasl_authenticated,
|
||
|
check_client_access hash:/etc/postfix/relay_access,
|
||
|
reject_unauth_destination,
|
||
|
permit_mynetworks,
|
||
|
check_policy_service unix:private/policy,
|
||
|
permit_auth_destination,
|
||
|
sleep 5,
|
||
|
reject
|
||
|
|
||
|
* ``reject_non_fqdn_recipient`` -- в `RCPT TO:` должно быть что-то похожее на email
|
||
|
* ``reject_unauth_destination`` -- "у нас нет такого юзера"/"это не наш домен"
|
||
|
* ``check_policy_service`` -- проверять SPF, если он есть у домена отправителя
|
||
|
* задержка в конце - добавлена для противодействию перебору адресов
|
||
|
|
||
|
Внешние средства
|
||
|
-----------------
|
||
|
|
||
|
Средства самого постфикса - это хорошо, но явно недостаточно. Я могу выделить 2 категории внешних средств, работающих со входящей почтой.
|
||
|
|
||
|
Первая из них - средства, работающие **до** принятия письма к доставке. (Перечислены только основные и широко используемые)
|
||
|
|
||
|
* fail2ban -- бан особо назойливых ботов, срабатывание настраивается на множественные сбои авторизации, "relay denied" и "no such recipient"
|
||
|
* dnsbl -- проверка по dns'у ip-адресов клиента. Опция достаточно спорная, листы могут просто не успевать обновляться.
|
||
|
* SPF -- сейчас уже "must have". Требует достаточно мало ресурсов, очень эффективна для доменов отправителя с политикой "-all", в крайнем случае "~all" поможет спамфильтру. *Важно:* следует использовать только reject'ы от этой проверки. См [wide-mask vulnerability](https://en.wikipedia.org/wiki/Sender_Policy_Framework#Wide-mask_vulnerability)
|
||
|
* DKIM -- в какой-то мере аналог SPF, но применяется для проверки отправителя/получателя вместо ip-адресов. Тоже - использовать только reject'ы.
|
||
|
* postscreen -- специализированный фаервол для postfix'а, расширяет возможности встроенных проверок
|
||
|
|
||
|
Вторая категория - средства, работающие над фильтрацией нежелательной почты, уже принятой к доставке.
|
||
|
|
||
|
* весь спектр байесовских спам-фильтров (dspam, spamasassin, и что полегче: bogofilter, crm114, и т.д.)
|
||
|
* антивирусы
|
||
|
* DCC, razor и прочие контент-блэклисты.
|
||
|
* обратная связь от юзера со спамфильтром
|
||
|
|
||
|
На последнем пункте стоит остановиться отдельно. Использование такой связи не должно быть сложнее "переслать это письмо"/"переместить в Спам", иначе оно просто не будет использоваться юзерами. Первый вариант, с пересылкой - реализуется на postfix'е отдельным транспортом или условием в procmail'е, второй - через dovecot или что вашем конкретном случае отдаёт юзеру его почту.
|
||
|
|
||
|
Раскладывание почты по INBOX/Spam реализуется на procmail'е или том же dovecot'е (плагин lda), после прогона по всем спамфильтрам/антивирусам.
|
||
|
|
||
|
Отдельно подчёркиваю, что средства второй категории не должны слать ничего наружу, и крайне неохотно - админу почтовой системы. Первый случай может использоваться для спама через bounce, второй - для DOS атаки.
|