Борьба со спамом, средствами самого Postfix

Материал из support.qbpro.ru

По материалам статьи Антиспам без оружия, или настройка Postfix

Пролог: спам - чума 21 века. В данной статье приведены практические рекомендации, позволяющие избавиться от этой чумы.

Имеем:

стандартную конфигурацию почтовой системы, Postfix + SASL + CYRUS.

Задача:

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

Требуемая политика для Postfix:

  • разрешена отправка писем с адресов внутренней сети
  • разрешен прием писем снаружи для адресатов внутри
  • прием писем только от существующих и корректных адресатов
  • прием писем только для имеющихся на сервере адресатов
  • для отправки писем FROM: *@mysite.ru с невнутренних хостов требовать обязательную авторизацию, без авторизации письма отклонять

Применяемые технические решения:

  • разрешать внутренним ип-адресам отправлять письма на несуществующие email-адреса (рассылка рекламного отдела)
  • проверять существование и корректность адреса отправителя
  • проверять существование и корректность адреса получателя
  • проверять корректность IP-адреса сервера передающего письм
  • проверять наличие IP-адреса отправителя в списках DNSBL
  • отклонять письма с IP-адресов, определяемых как динамические (dialup & adsl)
  • проверять заголовок письма на предмет наличия аттачя, содержащего файлы с неразрешенными типами расширений

для “особо продвинутых” респондентов применять “белые списки”

Настройки:

файл /etc/postfix/main.cf:

Часть 1 - настройка сети

myorigin = proba.ru
mydestination = $myhostname, $myorigin,  localhost.$mydomain, localhost, $mydomain
alias_database = hash:/etc/postfix/aliases
# список подсетей, которым разрешена отправка писем, и на
# письма с которых многие проверки не распространяются.
# здесь не должно быть подсетей, которые не являются “внешними”
mynetworks = 127.0.0.0/8,
    172.16.130.0/24,
    172.16.131.0/24,
    172.16.137.0/24,
    172.16.132.0/24

relay_domains = $mydestination

# Через кого пересылаем почту
#relayhost = [mail.qqq.ac.ru]
relayhost =

Часть 2 - защита от спама

# запрещаем проверку отправителем существование адреса получателя
# на этапе передачи заголовка
disable_vrfy_command = yes

# разрешаем дополнительные проверки пока отправитель
# передает RCPT TO: и MAIL FROM: заголовки. Для детализации mail.log
smtpd_delay_reject = yes
########smtpd_delay_reject = no

# требуем от отправителя представиться
# (на том, как себя представляет передающий комп,
# основаны многие эффективные проверки "на вшивость"
# автоматических рассылок от зомби и троянов)
smtpd_helo_required = yes


# ограничения на приветствие отправителя
smtpd_helo_restrictions =
    # отсекаем кривые адреса
    reject_invalid_hostname,
    # разрешаем "своим" почти все
    permit_mynetworks,
    # "Белый Список" должен быть впереди остальных проверок
    # отсекаем приветствия отправителя от моего имени
    # а также прописываем разрешения для "продвинутых"
    check_helo_access hash:/etc/postfix/helo_access,
    # отсекаем тех, кто представляется ИП-адресом.
    # это явное нарушение RFC, но практика показала, что это один из явных признаков спама.
    check_helo_access regexp:/etc/postfix/helo_regexp,
    # отсекаем почту с хостов (вида вроде news.intranet.),
    # не имеющих полноценного доменного
    # имени вида что-то.домен.домен_верхнего_уровня
    reject_non_fqdn_hostname,
    # требуем отправителя представиться доменным именем,
    # имеющим полноценный IP-адрес
    reject_unknown_hostname,
    # если все вышеперечисленное подошло, идем дальше
    permit


# ограничения, проверяемые на этапе MAIL FROM:
smtpd_sender_restrictions =
    # принимаем почту на отправку с "чужих" хостов, если пользователь
    # авторизовался по логину/паролю
    permit_sasl_authenticated,
    # "своим" можно и "просто"
    permit_mynetworks,
    # разрешаем или запрещаем "продвинутым"
    regexp:/etc/postfix/sender_access,
    # см комментарий к разделу smtpd_helo_restrictions
    reject_non_fqdn_sender,
    reject_unknown_sender_domain,
    check_sender_access mysql:/etc/postfix/sql/access.cf,
    # если все вышеперечисленное подошло, идем дальше
    permit

# ограничения, проверяемые на этапе RCPT TO:
smtpd_recipient_restrictions =
    permit_sasl_authenticated,
    permit_mynetworks,
    # запрещаем выдачу писем в поток, как это делают
    # нетерпеливые спаммеры
    reject_unauth_pipelining,
    # см комментарий к разделу smtpd_sender_restrictions
    reject_non_fqdn_recipient,
    reject_unknown_recipient_domain,
    # запрещаем или разрешаем "продвинутым"
    regexp:/etc/postfix/recipient_access,
    # !!! !!! !!! !!! !!!
    # запрещаем прием и передачу писем, не относящихся к нам
    # без этой строчки сервер становится open-relay
    reject_unauth_destination,
    # !!! !!! !!! !!! !!!
    # если все вышеперечисленное подошло, идем дальше
    permit

# проверяем, а не является (по признакам ДНС-имен) ли
# динамически-назначаемым IP-адрес хоста-отправителя (определяемого
# по соединению, а не по приветствию или разрешенному ДНС/IP-адресу)
smtpd_client_restrictions =
    # разрешаем "своим" почти все
    permit_mynetworks,
    # прописываем адреса "продвинутых" в белом списке
    hash:/etc/postfix/client_access,
    # в файле dul_checks регулярные выражения доменных имен,
    # наиболее часто используемых для обратных зон блоков
    # динамически назначаемых адресов и
    # широкополосных клиентских подключений
    regexp:/etc/postfix/dul_checks,
    # проверяем IP-адрес отправителя по спискам DNSBL (www.ordb.org)
    reject_rbl_client list.dsbl.org,
    reject_rbl_client bl.spamcop.net,
    reject_rbl_client cbl.abuseat.org,
    reject_rbl_client psbl.surriel.com,
    reject_rbl_client spamsources.fabel.dk,
    reject_rbl_client opm.blitzed.org,
    reject_rbl_client combined.njabl.org,
    #####reject_rbl_client relays.ordb.org,
    reject_rbl_client dul.ru,
    reject_rbl_client dialup.balcklist.jippg.org,
    reject_rbl_client relays.mail-abuse.org,
    reject_rbl_client dnsbl.sorbs.net,
    # требуем определяемого обратного ДНС-имени IP-адреса хоста-client
    reject_unknown_client,
    permit

# запрещаем прием писем с вирями (по расширениям файлов) в атачах
header_checks = regexp:/etc/postfix/header_checks

# See also below, section "REJECTING MAIL FOR UNKNOWN LOCAL USERS".
#
unknown_local_recipient_reject_code = 550

# запрещаем прием писем с картинками ведущим по ссылкам в IFRAME
body_checks = regexp:/etc/postfix/body_checks
# После добавления следующей строки, спам вообще почти пропал.
address_verify_sender = $double_bounce_sender

Часть 3 для abills

Показываю тут эту часть, что бы хоть в одном месте весь файл был целиком.
По описанию этой части смотри Настройка почтового сервера на базе Postfix + abills + mysql.

smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous

#Максимально допустимый размер вложения 20Мб
message_size_limit = 20971520


local_recipient_maps = $virtual_mailbox_maps
#local_recipient_maps = unix:passwd.byname $alias_maps

transport_maps = mysql:/etc/postfix/sql/transport.cf

alias_database = hash:/etc/postfix/aliases

virtual_alias_maps = mysql:/etc/postfix/sql/aliases.cf
virtual_gid_maps = static:1001
virtual_mailbox_base = /var/mail/virtual

virtual_mailbox_domains = mysql:/etc/postfix/sql/virtual_domains.cf
#virtual_mailbox_domains = mysql:/etc/postfix/sql/virtual_mailbox.cf
virtual_mailbox_maps = mysql:/etc/postfix/sql/virtual_mailbox.cf

# Ограничение размера под почту 500 Мб
virtual_mailbox_limit = 524288000
# Generate maildirsize files or not
virtual_create_maildirsize = yes

# Limits only INBOX part (usefull when
# using when you have IMAP users)
virtual_mailbox_limit_inbox = yes

# maps of soft disk quotas
virtual_mailbox_limit_maps = mysql:/etc/postfix/sql/virtual_mailbox_limits.cf
virtual_mailbox_limit_override = yes
virtual_overquota_bounce = yes


# Limits only INBOX part (usefull when
# using when you have IMAP users)
# I use Courier IMAP compatibles files.
virtual_maildir_extended = yes


# I use Courier IMAP compatibles files.
virtual_maildir_extended = yes

# Usefull for Courier IMAP..
#virtual_maildir_suffix = Maildir/

virtual_minimum_uid = 1001
virtual_uid_maps = static:1001

virtual_mailbox_extended = yes

virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please try again later.

Часть 4 - описание путей, подключение антивируса

После подключения и настройки ClamAV следующие 2 строки надо разремить
#content_filter = scan:127.0.0.1:10025
#receive_override_options = no_address_mappings

debug_peer_level = 3

debugger_command =
         PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
         ddd $daemon_directory/$process_name $process_id & sleep 5

sendmail_path = /usr/sbin/sendmail.postfix

newaliases_path = /usr/bin/newaliases

mailq_path = /usr/bin/mailq

setgid_group = postdrop
html_directory = /usr/share/doc/postfix/html

manpage_directory = /usr/share/man
readme_directory = /usr/share/doc/postfix/README_FILES
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/lib64/postfix
data_directory = /var/lib/postfix
mail_owner = postfix
#default_privs = nobody

Описание файлов для раздела борьба со спамом

теперь указанные в кач-ве параметров файлы:

/etc/postfix/helo_access

example.com REJECT you are not in my local networks
80.80.80.80 REJECT you are not in my local networks
dc.DOM OK broken M$ Widnows server

последняя строка иллюстрирует пример “продвинутого” респондента, чей компьютер выдает бесмысленное приветствие helo, а почту от такого респондента принимать надо.

/etc/postfix/dul_checks

/81-177-70-6\.donnetwork\.ru/i             OK 81-177-70-6.donnetwork.ru (@aaanet.ru)
/([0-9]*-){3}[0-9]*(\..*){2,}/i            553 SPAM_ip-add-rr-ess_networks
/([0-9]*\.){4}(.*\.){3,}.*/i               553 SPAM_ip-add-rr-ess_networks
/.*\..*\...\.comcast\.net/i                553 SPAM_comcast-net
/.*yahoobb.*\.bbtec\.net/i                 553 SPAM_yahoobb_bbtec-net
/[0-9]{12}\.bbtec\.net/i                   553 SPAM_host_bbtec-net
/.*\.broadband\.hu/i                       553 SPAM_broadband-hu
/client.*\..*\..*/i                        553 SPAM_CLIENT
/cable.*\..*\..*/i                         553 SPAM_CABLE
/pool.*\..*\..*/i                          553 SPAM_POOL
/dial.*\..*\..*/i                          553 SPAM_DIAL
/ppp.*\..*\..*/i                           553 SPAM_PPP
/dslam.*\..*\..*/i                         553 SPAM_DSLAM
/dhcp.*\..*\..*/i                          553 SPAM_DHCP
/adsl\.r61\.net/i                          OK adsl.r61.net
/adsl\.infotecstt\.ru/i                    OK adsl.infotecstt.ru
/[\.-]dsl.*\..*\..*/i                      553 SPAM_DSL
/[ax]dsl.*\..*\..*/i                       553 SPAM_XDSL
/.*([0-9]*\.){4}cableonline\.com\.mx/i     553 SPAM_IP-cableonline-com-mx
/.*\.([0-9]*\.){4}ip\.holtonks\.net/i      553 SPAM_ip-holtonks-net
/([0-9]*-){3}[0-9]*\.fibertel\.com\.ar/i   553 SPAM_IP-fibertel-com-ar
/.*[0-9]*-[0-9]*\.fibertel\.com\.ar/i      553 SPAM_IP-fibertel-com-ar
/[0-9]*\.user\.veloxzone\.com\.br/i        553 SPAM_user-veloxzone-com-br
/[0-9]*\.customer\.alfanett\.no/i          553 SPAM_customer-alfanett-no
/.*([0-9]*-){3}[0-9]*\.telecom\.net\.ar/i  553 SPAM_host-telecom-net-ar
/.*(-[0-9]*){2}\.telpol\.net\.pl/i         553 SPAM_host-telpol-net-pl
/(.*\.){2}maxonline\.com\.sg/i             553 SPAM_host-maxonline-com-sg
/(.*-){2}.*\.fairgamemail\.us/i            553 SPAM_host-fairgamemail-us
/[0-9]*[0-9]*-\.wispnet\.net/i             553 SPAM_host-wispnet-net
/.*-.*(\..*){2}\.ne\.jp/i                  553 SPAM_host-ne-jp
/[0-9]*\..*\.ne\.jp/i                      553 SPAM_h09t-ne-jp
/(.*\.){3}ad\.jp/i                         553 SPAM_host-ad-jp
/(.*\.){4}revip\.asianet\.co\.th/i         553 SPAM_revip-asianet-co-th
/[0-9]*\..*\.virtua\.com\.br/i             553 SPAM_host-virtua-com-br
/([0-9]*-){3}[0-9]*\.exatt\.net/i          553 SPAM_host-exatt-net
/([0-9]*\.){4}ip\.alltel\.net/i            553 SPAM_host-ip-alltel-net
/[0-9]{6,}\.chello\.../i                   553 SPAM_host-chello
/.*[0-9]*\..*\.chello\.../i                553 SPAM_host-chello-xx
/.*\..*\.t-dialin\.net/i                   553 SPAM_t-dialin-net
/.*\..*\.t-ipconnect\.de/i                 553 SPAM_t-ipconnect-de
/([0-9]*-){2,3}[0-9]*\..*\.cgocable\.net/i 553 SPAM_host-cgocable-net
/.*\..*\.shawcable\.net/i                  553 SPAM_host-shawcable-net
/p[0-9]*\.mp[0-9]*\.aaanet\.ru/i           553 SPAM_aaa_modem_pool
/([0-9]*-){2}[0-9]*\.ip\.adsl\.hu/i        553 SPAM_ip-adsl-hu
/([0-9]{1,3}\.){2}broadband4\.iol\.cz/i    553 SPAM_broadband-iol-cz
/.*\.yandex\.ru/i                          OK yandex.ru

/etc/postfix/sender_access

/.*@aaanet\.ru/i OK 
/.*@.*tele2\.../i REJECT

здесь задаем маски адресов, от кого мы хотим получать корреспонденцию несмотря на то, что домены этих адресов могут быть неопределены.
Нижняя строчка также иллюстрирует блокировку распространненного спама, якобы от пользователей Tele2.

/etc/postfix/recipient_access

/.*@friends\.ru/i OK
/.*evil\.org/i REJECT

разрешаем отправку писем на эти адреса

/etc/postfix/header_checks

/^content-(type|disposition):.*name[[:space:]]*=.*\.(dll|vbs|pif|com|bat|scr|lnk)/ REJECT Prohibited attachement file name extension: $2

конечно, вирь может прийти в виде файла с расширением EXE или ZIP, но это могут быть и нормальные файлы

/etc/postfix/body_checks

/^ < iframe src=(3D)?cid:.* height=(3D)?0 width=(3D)?0>$/ REJECT IFRAME vulnerability exploit

файл /etc/postfix/helo_regexp:

/([0-9]{1,3}(\.|-)){3}[0-9]{1,3}/i      REJECT IP-able helo SPAM

запрещаем ИП-адрес в качестве HELO. Это явное нарушение RFC, но практика показала, что это работает без сбоев.

после создания файлов helo_access, client_access и dul_checks необходимо выполнить

server# postmap helo_access 
server# postmap client_access 
server# postmap dul_checks 
server# postfix check

и если все прошло без ругани, то

server# postfix reload 

и можно смотреть лог-файл на предмет ошибок и наличие ошибочных срабатываний (if ever any :) ).

В моем примере я несколько дней изучал журналы /var/log/mail.log на предмет ложных срабатываний, и не обнаружил ни одного случая блокировки нормальной почты по вине нашего сервера (один из респондентов пытался отправлять письма с просроченного домена, записи о котором оставались в whois и были убраны из DNS). Следует отметить, что встречались очень искусные попытки мимикрии под реальные емайл-адреса, которые тем не менее легко проверялись с помощью whois-запросов.

В течение двух недель также выявились “продвинутые” респонденты, которые отсылали письма с адресов, не имеющих ДНС-имен или с некорректным HELO. Для них всех были добавлены записи в “белые списки”, что также решило проблему.

Как показал опыт, DNSBL-проверки отсекают примерно 70% спама в процессе приема заголовков, и на этом экономится трафик не принятых тел писем спамов (примерно 20-50 kb на каждой попытке, а их может быть примерно 30-50 тыс в неделю).

Удивительное рядом, но на проверках HELO/EHLO отсекается большинство хитрых спаммеров, которые пытаются замаскироваться под приличный сервер(10% от общего числа писем). А на проверках по выражениям dul_checks вместе с требованием существования и корректности обратного ДНС-имени хоста-отправителя эффективно отсекаются хосты-зомби с динамическими адресами.

Это особенно актуально в связи с тем, что динамически выделяемые IP-адреса технически не очень эффективно попадают в DNSBL-списки, так как часто к моменту проверки на open-relay'ность некоторого адреса на нем уже “сидит” совершенно другой комп. Зато по обратным доменным именам такие адреса легко распознаются :), и это не зависит от спаммеров, а только от ISP.

Приведенные настройки обеспечили эффективную фильтрацию спама, уменьшив его кол-во на порядок (с 300-500 спамов в сутки до 10-15 на один ящик электронной почты).

Для сервера с 30 почтовыми ящиками (примерно 5 тыс принятых и 10 тыс отклоненных писем в неделю) кумулятивная экономия трафика составляет примерно 300 мб в неделю, или около полутора гигабайт в месяц.

Стоит отметить, что вместе с “закручиванию гаек” для проверок на этапе SMTP-соединений осуществлялись offline-меры по борьбе со спамом. Среди них анализ тенденций по журналу mail.log, отсылка spam-report'ов на www.spamcop.net и DSBL-проверки IP-адресов из спамных писем.

"Спам - явление социальное, и только объединившись и действуя сообща, мы сможем его победить" (Кто-то из великих)