Sendmail vs. spam
АрхивСетевое окружение (архив)Использование возможностей Sendmail для борьбы со спамом
Каждый день в мой почтовый ящик (естественно электронный) приходит несколько писем (в худшие дни – несколько десятков) нежелательной корреспонденции – спама. Если бы я был обычным пользователем, то найти подходящий метод борьбы с ним не составляло бы труда, но я не обычный пользователь, я администратор довольно немаленькой сети.
Ежедневно на мой почтовый сервер приходит не одна сотня нежелательных писем, создавая большой паразитный трафик и забивая почтовые ящики пользователей (особенно тех, кто пишет свой служебный e-mail на каждом встречном форуме и в любой подвернувшейся онлайн-анкете). В этом случае спам-фильры необходимо устанавливать прямо на почтовом сервере организации.
Для реализации этого мы воспользуемся возможностями почтового сервера Sendmail входящего в поставку FreeBSD и Linux по умолчанию и поэтому наиболее часто используемого (порядка 75% от общего числа почтовых серверов обслуживаются с помошью SendMail).
База доступа Sendmail
Начиная с Sendmail 8.9, в настройках по умолчанию ретрансляция писем через почтовый сервер запрещена для любых узлов и перед началом использования нового почтового сервера необходимо обязательно установить, кто может осуществлять ретрансляцию почты через него. Обычно это только компьютеры локальной сети и узлы находящиеся в Вашем домене.
Самый простой способ сделать это – использовать базу доступа, которая находится в файле /etc/mail/access/. С помощью базы доступа можно ограничить ретрансляцию почты через свой сервер. Она должна содержать список почтовых адресов, доменов и ip-адресов узлов которым разрешено или, наоборот, запрещено отправлять почту, используя данный сервер.
При установке Sendmail вместе с операционной системой (как это происходит обычно с FreeBSD) конфигурационный файл sendmail.cf обычно уже содержит необходимые команды для использования базы доступа, но иногда приходится включать эту опцию вручную.
Для этого добавьте команду FEATURE(access_db)dnl в ваш файл sendmail.mc и с помошью препроцессора m4 создайте новый конфигурационный файл sendmail.cf
m4 ./sendmail.mc > sendmail.cf
А затем скопируйте новый файл конфигурации в каталог /etc/mail, не забыв сохранить (на всякий случай) предыдущий вариант.
mv /etc/mail/sendmail.cf /etc/mail/sendmail.cf.old cp ./sendmail.cf /etc/mail/sendmail.cf
И перезапустите Sendmail:
killall –HUP sendmail
Файл базы доступа (/etc/mail/access) состоит из строк содержащих пары значений, разделенных пробелами или табуляцией. Первое значение должно являться электронным адресом, именем домена или ip-адреcом (можно задавать целые сети), второе – кодовым обозначением действия. Действие может быть следующим:
- REJECT – соединение с передающим узлом немедленно разрывается.
- DISCARD – сервер примет сообщение, и "проглотит" его, сообщив об успешной доставке отправителю, но не доставит письмо.)
- OK – разрешает доступ (обычно используется для переопределения других условий)
- RELAY – разрешает пересылку почты
- Код ошибки и ее описание: аналогично REJECT, но позволяет создавать собственные сообщения об ошибках.
# наша локальная сеть - адреса 192.168.x.x 192.168 RELAY # сервера, находящиеся в вашем домене domain.ru RELAY # некто, кому разрешено пользоваться нашим # почтовым сервисом откуда угодно masha@mail.ru RELAY # домены спаммеров cyberspammer.com 550 Spam listbuilder.com 550 Spam spamer.com 550 Spam #чья-то сеть из которой активно рассылают спам. 195.161.xxx.xxx 550 Spam # нехорошо закрывать весь mail.ru, поэтому приходится # закрывать отдельные адреса spam@mail.ru 550 Spam
Вместо сообщения «550 Spam» можно написать REJECT, поведение SendMail от этого не изменится, но подробные сообщения об ошибках могут быть полезными при анализе лог-файлов Sendmail (/var/log/maillog).
Для ускорения обработки писем SendMail использует хеширование базы доступа в формате BerkeleyDB, которое производится с помошью утилиты makemap:
makemap hash /etc/mail/access.db < /etc/mail/access
Теперь почту Вашим пользователям смогут посылать все, кроме тех доменов или ip-адресов которые Вы особо укажете. К сожалению этот способ эффективен лишь для предотвращения рассылки спама через Ваш сервер, и для каждого известного Вам спамерского домена или сервера, который отправляет письма Вашим пользователям придется писать свою строку в /etc/mail/access, что довольно трудоемко.
Блокировка «Черных» списков
Для решения проблемы ведения списков серверов, с которых рассылается спам в SendMail 8.9 была введена поддержка «списков DNSBL» (DNS-based blacklists). Черные списки так называемых «открытых релеев», т.е. серверов с помощью которых спамеры могут безнаказанно рассылать миллионы писем поддерживаются различными организациями как на коммерческой основе, так и в свободном доступе. Первая система такого рода была создана Полом Викси и в настоящее время преобразована в коммерческую службу. Стоимость подписки на услуги mail-abuse.org составляет около 1500$ в год, являясь довольно значительной для маленьких компаний. К счастью существуют другие, некоммерческие организации, предоставляющие схожий сервис. Рассмотрим использование подобных сервисов на примере системы Open Realy Database (ordb.org).
В системах основанных на DNSBL ip адреса открытых релеев хранятся в базе DNS сервера в виде записей типа А (Address) в обратном порядке. Например, если сервер имеет ip-адрес 1.2.3.4 то в базе ORDB будет такая запись:
4.3.2.1.relays.ordb.org IN A 127.0.0.2
В данном случае наличие подобной записи указывает на то, что сервер 1.2.3.4 допускает свободную пересылку почты кем угодно и почта с него должна быть заблокирована. Адрес 127.0.0.2 используется лишь в качестве заполнителя (т.к. поле адреса в DNS не может быть пустым).
Для того, чтобы Ваш сервер Sendmail блокировал почту с узлов, ip адреса которых содержаться в в базе данных relays.ordb.org необходимо добавить следующую директиву в Ваш файл конфигурации sendmail.mc:
Для SendMail 8.10 и выше: FEATURE(`dnsbl', `relays.ordb.org', `Rejected - see http://ordb.org/')dnl Для SendMail 8.9: FEATURE(`rbl', `relays.ordb.org')dnl
A затем пересобрать и установить новый файл sendmail.cf
Для SendMail 8.8 и ниже для добавления этой возможности Вам придется вручную редактировать файл sendmail.cf (он располагается в каталоге /etc/mail). Добавьте в процедуру Basic_check_relay (она обозначена заглавной буквой S – SBasic_check_relay) следующие правила:
R$* $: $&{client_addr} R$-.$-.$-.$- $: > $(host $4.$3.$2.$1.relays.ordb.org. $: OK $) R>OK $: OKSOFAR R>$+ $#error $@ 5.7.1 $: Rejected - see http://ordb.org/
Обратите внимание, что добавлять эти правила нужно после всех существующих правил в этой процедуре. Определить, где кончаются правила, помещенные в процедуру SBasic_check_relay, можно по по началу следующей процедуры, имя которой обозначено символом «S», например SLocal_check_mail (обычно именно Local_check_mail идет сразу после Basic_check_relay, если конечно Sendmail не настроен как-нибудь очень нестандартно).
После того, как будет готов новый файл конфигурации, вам необходимо перезапустить SendMail:
killall –HUP sendmailВ настоящее время получил распространение еще один способ рассылки спама, использующий не открытые почтовые сервера, а прямую доставку на сервер получателя (эта возможность есть в таких программах массовой рассылки, как Advanced Direct Remailer, Advanced Mass Sender). Такая рассылка обычно производится с использованием анонимного Dial-Up подключения, спамер покупает карточку доступа в интернет, рассылает множество писем и бесследно исчезает. Для борьбы с такого рода рассылками необходимо блокировать почту приходящую с адресов, принадлежащих непосредственно модемным пулам провайдеров доступа. Такого рода сервис в российском сегменте поддерживает проект Dial-Up Users List. Провайдеры, поддерживающие эту инициативу вносят в общую базу ip-адреса, выдаваемые при подключении к их модемным пулам.
Настройка Вашего сервера для использования сервиса dul производится аналогично ordb (что собственно и не удивительно, т.к. оба используют один и тот-же механизм dnsbl), в файл sendmail.mc добавьте:
Для SendMail 8.10 и выше: FEATURE(`dnsbl', `dul.ru')dnl Для SendMail 8.9: FEATURE(`rbl', `dul.ru')dnl
Существует еще большое число подобных сервисов, о многих из них рассказано на сайте spamhaus.org, также там поддерживается система под названием The Spamhaus Block List.
Из Российских систем блокирования спама интересна DRBL – Distributed Real-time Blocking List, она использует не центральный сервер, а распределенную сеть блокирующих серверов, в которую могут вступить все желающие. К сожалению, система довольно сложна в установке и настройке.
Вспомогательные меры
Кроме подобных «радикальных» методов борьбы может быть полезным применение вспомогательных средств, таких как блокировка определенных почтовых программ и блокировка писем, не содержащих поля To: или содержащих в нем значение «undisclosed-recipients;» (Sendmail вставляет это значение, если в заголовках принимаемого письма нет поля To).
Блокировку писем рассылаемых с помощью программ массовой рассылки можно производить при помощи заголовка X-Mailer. Обычные письма содержат в этом заголовке название почтовой программы отправителя. Например «The Bat 1.60» или «Microsoft Outlook Express 6.00.2600.0000». Многие программы массовой рассылки позволяют произвольно задавать этот заголовок или просто не указывают его. Тем не менее в настройках по умолчанию у многих программ такой заголовок присутствует и многие начинающие спамеры его не меняют. Так что шанс выловить спам с помошью подобных фильтров существует. Как показывает практика обычно ловится Advanced Mass Sender.
Для фильтрации известных программ массовой рассылки на основании заголовка X-Mailer включите в ваш файл sendmail.mc в раздел LOCAL_RULES следующие правила (эту подборку сделал Сева Глущенко <gvs AT rinet.ru>):
HX-Mailer: $>CheckMailer HX-Server: $>CheckMailer SCheckMailer RAdvanced Direct Remailer $* $#error $@ 5.7.1 $: "554 Spam (ADR)" RAdvanced Mass Sender $* $#error $@ 5.7.1 $: "554 Spam (AMS)" RSpammer $* $#error $@ 5.7.1 $: "554 Spam (Spammer)" R$* Bomber $* $#error $@ 5.7.1 $: "554 Spam (Bomber)" RMega-Mailer $* $#error $@ 5.7.1 $: "554 Spam (Mega-Mailer)" RMMailer $* $#error $@ 5.7.1 $: "554 Spam (MMailer)" RMailer $* $#error $@ 5.7.1 $: "554 Spam (Mailer)" RLigra Mailer $* $#error $@ 5.7.1 $: "554 Spam (Ligra Mailer)" RDynamic Opt-In Emailer $* $#error $@ 5.7.1 $: "554 Spam (Dynamic Opt-In Em ailer)" R$* Group Spamer $#error $@ 5.7.1 $: "554 Spam (WE Group Spamer)" RMail Sender $* $#error $@ 5.7.1 $: "554 Spam (Mail Sender)" RMail Service $* $#error $@ 5.7.1 $: "554 Spam (Mail Service)" RMailloop $* $#error $@ 5.7.1 $: "554 Spam (Mailloop)" RPersMail $* $#error $@ 5.7.1 $: "554 Spam (PersMail)" RLK SendIt $* $#error $@ 5.7.1 $: "554 Spam (LK SendIt)" RWC Mail $* $#error $@ 5.7.1 $: "554 Spam (WC Mail)" RZUBA ZUB $* $#error $@ 5.7.1 $: "554 Spam (ZUBA ZUB)" RMailList Express $* $#error $@ 5.7.1 $: "554 Spam (MailList Express)" RCaretop $* $#error $@ 5.7.1 $: "554 Spam (Caretop)" RMailer Signature $#error $@ 5.7.1 $: "554 Spam (Mailer Si)" Rnone $#error $@ 5.7.1 $: "554 Spam (none)" RPG-MAILINGLIST $#error $@ 5.7.1 $: "554 Spam (PG-MAILINGLIST)" R$* advcomtest $* $#error $@ 5.7.1 $: "554 Spam (advcomtest)" Ryo yo mail $#error $@ 5.7.1 $: "554 Spam (yo yo mail)" RZanziMailer $* $#error $@ 5.7.1 $: "554 Spam (ZanziMailer)"
# Настоящий Outlook имеет версию вида: 5.0.23123244
RMicrosoft Outlook Express 5.0 $#error $@ 5.7.1 $: "554 Spam (Microsoft Outlook Express 5.0)"
RVersion 5.0 $#error $@ 5.7.1 $: "554 Spam (Version 5.0)"
# Заблокируем все мейлеры с названием только из одного слова: Rnethack $@ OK RZ-Mail-SGI $@ OK RDipost $@ OK R$- $#error $@ 5.7.1 $: "554 Spam (one-word mailer)" # Заблокируем письма с пустым заголовком R$* $: < $1 > R< > $#error $@ 5.7.1 $: "554 Illegal header (empty header)" R$* $@ OK
После внесения соответствующих изменений пересоберите свой файл sendmail.cf и установите его. Вы можете обойтись без перекомпиляции конфигурационного файла, просто добавив эти правила в конец самого файла конфигурации – раздел LOCAL_RULES переносится в него при сборке без изменений.
Также можно блокировать письма с пустым заголовком и с пустым или неправильно сформированным полем Message-ID (оно должно быть в формате идентификатор@домен). Скорее всего они отправлены спамерами. Это можно сделать с помощью следующих правил:
HTo: $>CheckTo HCC: $>CheckTo HMessage-ID: $>CheckMessageID # проверим поле To на "undisclosed-recipients;" или "undisclosed recipient" # комбинации могут быть практически произвольными. SCheckTo R$*Recipient$* $#error $@ 5.7.1 $: "554 Unspecified Mailbox ID" R$*Undisclosed$* $#error $@ 5.7.1 $: "554 Unspecified Mailbox ID" # проверим правильность формата поля Message-ID SCheckMessageID R<$+@$+> $@ < $1 @ $2 > R$* $#error $@ 5.5.2 $: "553 Bad Message ID"
Другие методы борьбы со спамом
Существуют еще много различных методов бороться со спамом, используя возможности Вашего сервера Sendmail. Кратко остановлюсь на некоторых из них.
1. Использование Procmail
Procmail – это гибкое и мощное средство фильтрации почты. Procmail сопобен фильтровать почту по большому числу правил и может справится и со спамом. Программа SpamBouncer использует возможности Procmail для блокировки писем по определенным правилам, а именно блокируются письма:
- Содержащие адреса известных спамеров
- Отправленные с хорошо известных спамерских сайтов, доменов и узлов
- Отправленные с узлов тех провайдеров, которые зарекомендовали себя нежеланием разбираться с клиентами-спамерами.
- Отправленные с использованием известных программ массовой рассылки, применяемых спамерами.
- Содержащие строки в заголовке или теле, которые однозначно идентифицируют их как спам (уже известный программе)
- Содержащие строки в заголовке или теле, которые свидетельствуют о том, что это письмо – результат деятельности почтового червя (например пресловутого Klez.h или Sircam)
2. Использование MilterAPI
Sendmail предоставляет программный интерфейс Milter для легкого создания специализированных почтовых фильтров. Этот интерфейс позволяет контролировать все этапы работы с письмом, от установки соединения и до его разрыва и может использоваться для создания антивирусных сканеров, блокировки спама и многого другого.
Проект SpamAssassin Milter Plugin использует возможности пакета SpamAssassin для идентификации спама и MilterIP для его уничтожения.
SpamAssasin – система, созданная исключительно для идентификации спама, а его блокировка обычно осуществляется сторонними программами, например с помощью правил Procmail. SpamAssassin использует набор правил, а также черные списки DNSBL для максимально точного распознавания спамеров.
Заключение
В статье я сознательно не касался моральных и юридических аспектов проблемы спама, описывая решения, применимые для защиты локальных сетей и почтовых доменов принадлежащих организациям, которые не являются провайдерами доступа. Провайдерам же при использовании подобных методов фильтрации спама как минимум необходимо разработать механизм отсылки уведомлений о блокировке спама пользователям. Это часто снимает многие возможные возражения пользователей против введения подобных систем фильтрации почты.
Cсылки по теме:
www.antispam.ru – хороший проект посвященный спаму, рассматриваются как общие вопросы, так и конкретные рекомендации для админов и пользователей.
ofisp.org/antispam.html – архив, пожалуй, самого серьезного списка рассылки, посвященного проблемам спама. Отличный ресурс для профессионалов, много технической информации по теме.
spamhaus.org – Крупный английский проект по данной тематике, много полезной информации, работает с провайдерами по всему миру.
mail-abuse.org – Коммерческая служба Mail Abuse Prevention System LLC (MAPSSM), организована, Полом Викси, пионером DNSBL.