Борьба со спамом, средствами самого Postfix
По материалам статьи Антиспам без оружия, или настройка 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-адресов из спамных писем.
"Спам - явление социальное, и только объединившись и действуя сообща, мы сможем его победить" (Кто-то из великих)