User Tools

Site Tools


sendmail:antispam

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

sendmail:antispam [2007/05/19 18:52] – created - external edit 127.0.0.1sendmail:antispam [2022/05/16 05:14] (current) vak
Line 1: Line 1:
 +====== Фильтр спама для 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 ======
 +В качестве почтового агента используется [[http://sendmail.org/ | sendmail]],
 +работающий в среде Unix (в данном случае ---
 +[[http://www.freebsd.org/ | FreeBSD]], но это непринципиально).
 +Для sendmail был разработан [[vakcf30 | конфигурационный файл]],
 +позволяющий настраивать параметры почтового узла, не пользуясь
 +традиционными сложнейшими пакетами макросов.
 +
 +Файл конфигурации использует две внешних утилиты:
 +  * mailscreener --- [[screener | противовирусный фильтр]], посредством антивирусов ClamAV и Касперского
 +  * milter-regex --- антиспамный фильтр
 +
 +====== Утилита фильтрации ======
 +Утилита фильтрации выполнена как дополнительный модуль
 +почтовой системы с интерфейсом Sendmail’s Content Management (Milter) API.
 +При разработке за основу взят
 +[[http://www.benzedrine.cx/milter-regex.html | milter-regex]], разработанный
 +Дэниэлом Хартмайером. По сравнению с оригинальной версией пришлось
 +сделать следующие доработки:
 +  * Добавлена команда "continue", упрощающая составление выражений.
 +  * Добавлены команды "*envrcpt" и "*header" как однократные версии обычных команд. Нужны для правильной работы "continue".
 +  * Сделана возможность загрузки регулярных выражений из файла, вида "=(/etc/mail/hosts-black)".
 +  * Введена возможность трассировки применения каждого регулярного выражения с записью в лог-файл.
 +  * Лог-сообщения приведены к более ясному и логичному виду.
 +  * Исправлены некоторые ошибки.
 +
 +Тексты можно скачать здесь: {{milter-regex-2004-11-12.tgz}}.
 +
 +В файле milter-regex.conf задаются действия, выполняемые при обработке
 +очередного письма. Полный его текст можно посмотреть
 +[[milter-regex | здесь]], с кратким описанием действий и команд.
 +
 +====== Политика фильтрации ======
 +Фильтрация писем происходит в несколько этапов:
 +  * Проверка имени хоста отправителя.
 +  * Проверка адреса электронной почты получателя (на конверте).
 +  * Проверка адреса электронной почты отправителя (на конверте).
 +  * Проверка пути письма (заголовки 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, если они не от хостов из "белого списка"
 +
 +Такая методика позволяет на раннем этапе отсечь большую часть спама,
 +рассылаемого [[http://www.securitylab.ru/news/283856.php | сетями ботов]]
 +--- компьютеров, зомбированных специальными вирусами.
 +<code>
 +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 `<.*>`
 +</code>
 +
 +==== Адрес получателя ====
 +Часть потока спама рассылается по адресам, составленным из правильного имени
 +домена и произвольного имени пользователя, с надеждой
 +на случайное совпадение с реальным именем. Чтобы избавиться от таких
 +сообщений, делаем проверки:
 +  - Безусловно разрешается доставка служебных писем по адресам postmaster@* и MAILER-DAEMON@*
 +  - Для каждого из обслуживаемых доменов делается проверка соответствия имен пользователей по списку
 +
 +<code>
 +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
 +</code>
 +
 +==== Адрес отправителя ====
 +Часть спама идет с некорректными обратными адресами, и это легко отследить.
 +Также спамеры пользуются для рассылки "почтовыми отражателями",
 +поэтому следует запретить bounce и подобные.
 +  - Адрес отправителя должен быть заключен в угловые скобки
 +  - В адресе отправителя запрещаются символ '?' и имена пользователя
 +    * <>
 +    * ""
 +    * anonymous
 +    * bounce
 +    * bounces
 +    * reklama
 +    * заканчивающиеся точкой
 +  - Безусловно разрешаются служебные имена типа MAILER-DAEMON@* и аналогичные
 +  - Запрещаем почту от доменов вида bounce.*
 +  - Запрещаем адреса из "черного списка" /etc/mail/emails-black
 +<code>
 +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
 +</code>
 +
 +==== Путь письма ====
 +Один из основных объективных параметров сообщения - путь, отражаемый
 +в заголовках "Received" Часть таких заголовков спамер может подделать,
 +но не все. Создаем в файле /etc/mail/myrelays список почтовых
 +серверов, полям Received которых мы доверяем. Будем извлекать из
 +таких заголовков имя хоста - источника сообщения, и проверять его на
 +соответствие "черному списку". Хосты из "белого списка" разрешаем.
 +Хосты, не имеющие имени в DNS, запрещаем безусловно.
 +
 +<code>
 +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
 +</code>
 +
 +==== Поле "To:" ====
 +Запрещаем письма-рассылки со скрытым списком получателей.
 +Процент таких писем небольшой, но настырный.
 +<code>
 +reject "Spam rejected"
 + *header `^To$`i `undisclosed-recipients`i
 + *header `^To$`i `unlisted-recipients`i
 + *header `^To$`i `^$`i
 +</code>
 +
 +====== Составление черных списков ======
 +Для автоматического составления черных списков применяется следующая
 +техника. Каждый из пользователей имеет специальный ящик с именем,
 +скажем, "- Spam". Все письма, от которых он желает избавиться,
 +помещаются в этот ящик. Затем специальная утилита периодически
 +проходит по этим ящикам, извлекает имена хостов и адреса e-mail
 +и заносит их в черные списки.
 +
 +Эта же утилита сравнивает черные списки с логом отраженных писем
 +за достаточно большой период (скажем, месяц) и удаляет
 +неиспользуемые имена и адреса.
 +
 +Тексты такой утилиты можно взять здесь: {{mk_black.tgz}}
 +
  

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki