Table of Contents
Фильтр спама для sendmail
Предлагаемая технология фильтрации спама создавалась постепенно, исходя из практических потребностей. Три года эксплуатации на почтовом узле cronyx.ru подтвердили пригодность системы в реальных условиях нынешнего интернета.
По состоянию на май 2007 узел принимает в сутки около 16500 сообщений. Из них:
- 2.4 % — доставленные письма
- 97.6 % — отражённый спам
Сквозь фильтр просачивается около 30 сообщений спама в сутки. Эффективность фильтрации составляет около 99.8 %.
Наиболее активные спамеры:
- 31.7 % — безымянные хосты (нет имени в DNS)
- 38.5 % — анонимные хосты (имена вида 12.34.56.somewhere.net)
- 5.21 % — .dip.t-dialin.net
- 2.08 % — .rr.com
- 1.59 % — .mtu-net.ru
- 1.44 % — .tpnet.pl
- 1.30 % — .comcast.net
- 1.05 % — .ttnet.net.tr
- 1.02 % — .wanadoo.fr
- 1.00 % — .bezeqint.net
Конфигурация sendmail
В качестве почтового агента используется sendmail, работающий в среде Unix (в данном случае — FreeBSD, но это непринципиально). Для sendmail был разработан конфигурационный файл, позволяющий настраивать параметры почтового узла, не пользуясь традиционными сложнейшими пакетами макросов.
Файл конфигурации использует две внешних утилиты:
- mailscreener — противовирусный фильтр, посредством антивирусов ClamAV и Касперского
- milter-regex — антиспамный фильтр
Утилита фильтрации
Утилита фильтрации выполнена как дополнительный модуль почтовой системы с интерфейсом Sendmail’s Content Management (Milter) API. При разработке за основу взят milter-regex, разработанный Дэниэлом Хартмайером. По сравнению с оригинальной версией пришлось сделать следующие доработки:
- Добавлена команда “continue”, упрощающая составление выражений.
- Добавлены команды “*envrcpt” и “*header” как однократные версии обычных команд. Нужны для правильной работы “continue”.
- Сделана возможность загрузки регулярных выражений из файла, вида “=(/etc/mail/hosts-black)”.
- Введена возможность трассировки применения каждого регулярного выражения с записью в лог-файл.
- Лог-сообщения приведены к более ясному и логичному виду.
- Исправлены некоторые ошибки.
Тексты можно скачать здесь: milter-regex-2004-11-12.tgz.
В файле milter-regex.conf задаются действия, выполняемые при обработке очередного письма. Полный его текст можно посмотреть здесь, с кратким описанием действий и команд.
Политика фильтрации
Фильтрация писем происходит в несколько этапов:
- Проверка имени хоста отправителя.
- Проверка адреса электронной почты получателя (на конверте).
- Проверка адреса электронной почты отправителя (на конверте).
- Проверка пути письма (заголовки Received).
- Проверка адреса электронной почты получателя (заголовок To).
Имя хоста отправителя
Команда “connect” имеет два параметра — шаблоны для сравнения с именем хоста и его IP-адресом.
- Разрешаем соединения от локального хоста (с IP-адресом 127.0.0.1)
- Разрешаем соединения от хостов из “белого списка” /etc/mail/hosts-white
- Запрещаем соединения от хостов с именем *.in-addr.arpa
- Запрещаем соединения от хостов с пустым именем и IP-адресом, отличающимся от 127.0.0.1
- Запрещаем соединения от хостов, не имеющих имени в DNS
- Запрещаем соединения от хостов с именем вида *.цифры.цифры*, обычно это анонимные пользователи больших сетей домашнего и корпоративного интернета
- Запрещаем соединения от хостов из “черного списка” /etc/mail/hosts-black
- Запрещаем сообщения, не имеющие поля Message-Id, если они не от хостов из “белого списка”
Такая методика позволяет на раннем этапе отсечь большую часть спама, рассылаемого сетями ботов — компьютеров, зомбированных специальными вирусами.
continue connect `^localhost$`i `127\.0\.0\.1` connect `=(/etc/mail/hosts-white)$`ie `` reject "Your host name is invalid" connect `\.in-addr\.arpa$`i `` connect `\.`n `127\.0\.0\.1`n tempfail "Your host IP address not resolving - check DNS, or send via SMTP server of your provider" connect `\[.*]` `` reject "Direct mail from your host is not permitted - send via SMTP server of your provider" connect `[.-][[:digit:]]+[.-][[:digit:]]`ie `` reject "Direct mail from your host is not permitted" connect `=(/etc/mail/hosts-black)$`ie `` reject "Invalid message format" connect `=(/etc/mail/hosts-white)$`ien `` and \ not header `^Message-Id$`i `<.*>`
Адрес получателя
Часть потока спама рассылается по адресам, составленным из правильного имени домена и произвольного имени пользователя, с надеждой на случайное совпадение с реальным именем. Чтобы избавиться от таких сообщений, делаем проверки:
- Безусловно разрешается доставка служебных писем по адресам postmaster@* и MAILER-DAEMON@*
- Для каждого из обслуживаемых доменов делается проверка соответствия имен пользователей по списку
reject "Adressee invalid" envrcpt `<.*>`n continue *envrcpt `<postmaster@`i *envrcpt `<MAILER-DAEMON@`i continue # в домене cronyx.ru *envrcpt `<=(/etc/mail/users)@cronyx\.ru>`ie discard envrcpt `@cronyx\.ru>`i continue # в домене www.cronyx.ru *envrcpt `<www-adm@www\.cronyx\.ru>`i *envrcpt `<info-adm@www\.cronyx\.ru>`i discard envrcpt `@www\.cronyx\.ru>`i continue # в домене vak.ru *envrcpt `<vak@vak\.ru>`i discard envrcpt `@vak\.ru>`i
Адрес отправителя
Часть спама идет с некорректными обратными адресами, и это легко отследить. Также спамеры пользуются для рассылки “почтовыми отражателями”, поэтому следует запретить bounce и подобные.
- Адрес отправителя должен быть заключен в угловые скобки
- В адресе отправителя запрещаются символ '?' и имена пользователя
- <>
- “”
- anonymous
- bounce
- bounces
- reklama
- заканчивающиеся точкой
- Безусловно разрешаются служебные имена типа MAILER-DAEMON@* и аналогичные
- Запрещаем почту от доменов вида bounce.*
- Запрещаем адреса из “черного списка” /etc/mail/emails-black
reject "Sender invalid" envfrom `<.*>`in envfrom `<<>@` envfrom `<""@` envfrom `?` continue envfrom `<MAILER-DAEMON@hanoi\.cronyx\.ru>`i envfrom `<antivirus-notify@hanoi\.cronyx\.ru>`i discard envfrom `<anonymous@`i envfrom `<bounce@`i envfrom `<bounces@`i envfrom `<reklama@`i envfrom `@bounce\.`i envfrom `\.@`i reject "Spam rejected" envfrom `[@.]=(/etc/mail/emails-black)>`ie envfrom `<=(/etc/mail/emails-black)>`ie
Путь письма
Один из основных объективных параметров сообщения - путь, отражаемый в заголовках “Received”. Часть таких заголовков спамер может подделать, но не все. Создаем в файле /etc/mail/myrelays список почтовых серверов, полям Received которых мы доверяем. Будем извлекать из таких заголовков имя хоста - источника сообщения, и проверять его на соответствие “черному списку”. Хосты из “белого списка” разрешаем. Хосты, не имеющие имени в DNS, запрещаем безусловно.
continue *header `^Received$`i `localhost *( *localhost *)`i # Пропускаем заголовок, если это не через знакомый сервер *header `^Received$`i `by *=(/etc/mail/myrelays)[[:space:]]`ien *header `^Received$`i `(localhost \[127\.0\.0\.1])`i *header `^Received$`i `\( *=(/etc/mail/hosts-white) *\[`ie *header `^Received$`i `\( *=(/etc/mail/hosts-white) *\)`ie reject "Spam rejected" *header `^Received$`i `\( *[[:alnum:]-]+ *\[`ie *header `^Received$`i `\( *[[:alnum:].-]*=(/etc/mail/hosts-black) *\[`ie tempfail "Your host IP address not resolving, check DNS" *header `^Received$`i `( *[^)][^)]*) *( *\[.*] *)`i *header `^Received$`i `( *\[.*])`i *header `^Received$`i `(.*@ *\[.*])`i
Поле "To:"
Запрещаем письма-рассылки со скрытым списком получателей. Процент таких писем небольшой, но настырный.
reject "Spam rejected" *header `^To$`i `undisclosed-recipients`i *header `^To$`i `unlisted-recipients`i *header `^To$`i `^$`i
Составление черных списков
Для автоматического составления черных списков применяется следующая техника. Каждый из пользователей имеет специальный ящик с именем, скажем, “- Spam”. Все письма, от которых он желает избавиться, помещаются в этот ящик. Затем специальная утилита периодически проходит по этим ящикам, извлекает имена хостов и адреса e-mail и заносит их в черные списки.
Эта же утилита сравнивает черные списки с логом отраженных писем за достаточно большой период (скажем, месяц) и удаляет неиспользуемые имена и адреса.
Тексты такой утилиты можно взять здесь: mk_black.tgz