Фильтр спама для 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 был разработан конфигурационный файл, позволяющий настраивать параметры почтового узла, не пользуясь традиционными сложнейшими пакетами макросов.

Файл конфигурации использует две внешних утилиты:

Утилита фильтрации

Утилита фильтрации выполнена как дополнительный модуль почтовой системы с интерфейсом 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-адресом.

  1. Разрешаем соединения от локального хоста (с IP-адресом 127.0.0.1)
  2. Разрешаем соединения от хостов из “белого списка” /etc/mail/hosts-white
  3. Запрещаем соединения от хостов с именем *.in-addr.arpa
  4. Запрещаем соединения от хостов с пустым именем и IP-адресом, отличающимся от 127.0.0.1
  5. Запрещаем соединения от хостов, не имеющих имени в DNS
  6. Запрещаем соединения от хостов с именем вида *.цифры.цифры*, обычно это анонимные пользователи больших сетей домашнего и корпоративного интернета
  7. Запрещаем соединения от хостов из “черного списка” /etc/mail/hosts-black
  8. Запрещаем сообщения, не имеющие поля 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		`<.*>`

Адрес получателя

Часть потока спама рассылается по адресам, составленным из правильного имени домена и произвольного имени пользователя, с надеждой на случайное совпадение с реальным именем. Чтобы избавиться от таких сообщений, делаем проверки:

  1. Безусловно разрешается доставка служебных писем по адресам postmaster@* и MAILER-DAEMON@*
  2. Для каждого из обслуживаемых доменов делается проверка соответствия имен пользователей по списку
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 и подобные.

  1. Адрес отправителя должен быть заключен в угловые скобки
  2. В адресе отправителя запрещаются символ ‘?’ и имена пользователя
    • <>
    • “”
    • anonymous
    • bounce
    • bounces
    • reklama
    • заканчивающиеся точкой
  3. Безусловно разрешаются служебные имена типа MAILER-DAEMON@* и аналогичные
  4. Запрещаем почту от доменов вида bounce.*
  5. Запрещаем адреса из “черного списка” /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

 
proj/sendmail/antispam.txt · Последние изменения: 2007/05/19 11:52
 
Copyright (C) 1996-2013 Serge Vakulenko
serge@vak.ru