Предлагаемая технология фильтрации спама создавалась постепенно, исходя из практических потребностей. Три года эксплуатации на почтовом узле cronyx.ru подтвердили пригодность системы в реальных условиях нынешнего интернета.
По состоянию на май 2007 узел принимает в сутки около 16500 сообщений. Из них:
Сквозь фильтр просачивается около 30 сообщений спама в сутки. Эффективность фильтрации составляет около 99.8 %.
Наиболее активные спамеры:
В качестве почтового агента используется sendmail, работающий в среде Unix (в данном случае — FreeBSD, но это непринципиально). Для sendmail был разработан конфигурационный файл, позволяющий настраивать параметры почтового узла, не пользуясь традиционными сложнейшими пакетами макросов.
Файл конфигурации использует две внешних утилиты:
Утилита фильтрации выполнена как дополнительный модуль почтовой системы с интерфейсом Sendmail’s Content Management (Milter) API. При разработке за основу взят milter-regex, разработанный Дэниэлом Хартмайером. По сравнению с оригинальной версией пришлось сделать следующие доработки:
Тексты можно скачать здесь: milter-regex-2004-11-12.tgz.
В файле milter-regex.conf задаются действия, выполняемые при обработке очередного письма. Полный его текст можно посмотреть здесь, с кратким описанием действий и команд.
Фильтрация писем происходит в несколько этапов:
Команда “connect” имеет два параметра — шаблоны для сравнения с именем хоста и его IP-адресом.
Такая методика позволяет на раннем этапе отсечь большую часть спама, рассылаемого сетями ботов — компьютеров, зомбированных специальными вирусами.
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 `<.*>`
Часть потока спама рассылается по адресам, составленным из правильного имени домена и произвольного имени пользователя, с надеждой на случайное совпадение с реальным именем. Чтобы избавиться от таких сообщений, делаем проверки:
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 и подобные.
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
Запрещаем письма-рассылки со скрытым списком получателей. Процент таких писем небольшой, но настырный.
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