sendmail:antispam
Differences
This shows you the differences between two versions of the page.
| sendmail:antispam [2007/05/19 18:52] – created - external edit 127.0.0.1 | sendmail: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:// | ||
| + | работающий в среде Unix (в данном случае --- | ||
| + | [[http:// | ||
| + | Для sendmail был разработан [[vakcf30 | конфигурационный файл]], | ||
| + | позволяющий настраивать параметры почтового узла, не пользуясь | ||
| + | традиционными сложнейшими пакетами макросов. | ||
| + | |||
| + | Файл конфигурации использует две внешних утилиты: | ||
| + | * mailscreener --- [[screener | противовирусный фильтр]], | ||
| + | * milter-regex --- антиспамный фильтр | ||
| + | |||
| + | ====== Утилита фильтрации ====== | ||
| + | Утилита фильтрации выполнена как дополнительный модуль | ||
| + | почтовой системы с интерфейсом Sendmail’s Content Management (Milter) API. | ||
| + | При разработке за основу взят | ||
| + | [[http:// | ||
| + | Дэниэлом Хартмайером. По сравнению с оригинальной версией пришлось | ||
| + | сделать следующие доработки: | ||
| + | * Добавлена команда " | ||
| + | * Добавлены команды " | ||
| + | * Сделана возможность загрузки регулярных выражений из файла, вида " | ||
| + | * Введена возможность трассировки применения каждого регулярного выражения с записью в лог-файл. | ||
| + | * Лог-сообщения приведены к более ясному и логичному виду. | ||
| + | * Исправлены некоторые ошибки. | ||
| + | |||
| + | Тексты можно скачать здесь: {{milter-regex-2004-11-12.tgz}}. | ||
| + | |||
| + | В файле milter-regex.conf задаются действия, | ||
| + | очередного письма. Полный его текст можно посмотреть | ||
| + | [[milter-regex | здесь]], | ||
| + | |||
| + | ====== Политика фильтрации ====== | ||
| + | Фильтрация писем происходит в несколько этапов: | ||
| + | * Проверка имени хоста отправителя. | ||
| + | * Проверка адреса электронной почты получателя (на конверте). | ||
| + | * Проверка адреса электронной почты отправителя (на конверте). | ||
| + | * Проверка пути письма (заголовки Received). | ||
| + | * Проверка адреса электронной почты получателя (заголовок To). | ||
| + | |||
| + | ==== Имя хоста отправителя ==== | ||
| + | Команда " | ||
| + | с именем хоста и его IP-адресом. | ||
| + | - Разрешаем соединения от локального хоста (с IP-адресом 127.0.0.1) | ||
| + | - Разрешаем соединения от хостов из " | ||
| + | - Запрещаем соединения от хостов с именем *.in-addr.arpa | ||
| + | - Запрещаем соединения от хостов с пустым именем и IP-адресом, | ||
| + | - Запрещаем соединения от хостов, | ||
| + | - Запрещаем соединения от хостов с именем вида *.цифры.цифры*, | ||
| + | - Запрещаем соединения от хостов из " | ||
| + | - Запрещаем сообщения, | ||
| + | |||
| + | Такая методика позволяет на раннем этапе отсечь большую часть спама, | ||
| + | рассылаемого [[http:// | ||
| + | --- компьютеров, | ||
| + | < | ||
| + | continue | ||
| + | connect `^localhost$`i `127\.0\.0\.1` | ||
| + | connect `=(/ | ||
| + | |||
| + | 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 " | ||
| + | connect `[.-][[: | ||
| + | |||
| + | reject " | ||
| + | connect `=(/ | ||
| + | |||
| + | reject " | ||
| + | connect `=(/ | ||
| + | not header `^Message-Id$`i `< | ||
| + | </ | ||
| + | |||
| + | ==== Адрес получателя ==== | ||
| + | Часть потока спама рассылается по адресам, | ||
| + | домена и произвольного имени пользователя, | ||
| + | на случайное совпадение с реальным именем. Чтобы избавиться от таких | ||
| + | сообщений, | ||
| + | - Безусловно разрешается доставка служебных писем по адресам postmaster@* и MAILER-DAEMON@* | ||
| + | - Для каждого из обслуживаемых доменов делается проверка соответствия имен пользователей по списку | ||
| + | |||
| + | < | ||
| + | reject " | ||
| + | envrcpt `< | ||
| + | continue | ||
| + | *envrcpt `< | ||
| + | *envrcpt `< | ||
| + | |||
| + | continue # в домене cronyx.ru | ||
| + | *envrcpt `< | ||
| + | discard envrcpt `@cronyx\.ru> | ||
| + | |||
| + | continue # в домене www.cronyx.ru | ||
| + | *envrcpt `< | ||
| + | *envrcpt `< | ||
| + | discard envrcpt `@www\.cronyx\.ru> | ||
| + | |||
| + | continue # в домене vak.ru | ||
| + | *envrcpt `< | ||
| + | discard envrcpt `@vak\.ru> | ||
| + | </ | ||
| + | |||
| + | ==== Адрес отправителя ==== | ||
| + | Часть спама идет с некорректными обратными адресами, | ||
| + | Также спамеры пользуются для рассылки " | ||
| + | поэтому следует запретить bounce и подобные. | ||
| + | - Адрес отправителя должен быть заключен в угловые скобки | ||
| + | - В адресе отправителя запрещаются символ '?' | ||
| + | * <> | ||
| + | * "" | ||
| + | * anonymous | ||
| + | * bounce | ||
| + | * bounces | ||
| + | * reklama | ||
| + | * заканчивающиеся точкой | ||
| + | - Безусловно разрешаются служебные имена типа MAILER-DAEMON@* и аналогичные | ||
| + | - Запрещаем почту от доменов вида bounce.* | ||
| + | - Запрещаем адреса из " | ||
| + | < | ||
| + | reject " | ||
| + | envfrom `< | ||
| + | envfrom `<<> | ||
| + | envfrom `<"" | ||
| + | envfrom `? | ||
| + | continue | ||
| + | envfrom `< | ||
| + | envfrom `< | ||
| + | discard | ||
| + | envfrom `< | ||
| + | envfrom `< | ||
| + | envfrom `< | ||
| + | envfrom `< | ||
| + | envfrom `@bounce\.`i | ||
| + | envfrom `\.@`i | ||
| + | |||
| + | reject "Spam rejected" | ||
| + | envfrom `[@.]=(/ | ||
| + | envfrom `< | ||
| + | </ | ||
| + | |||
| + | ==== Путь письма ==== | ||
| + | Один из основных объективных параметров сообщения - путь, отражаемый | ||
| + | в заголовках " | ||
| + | но не все. Создаем в файле / | ||
| + | серверов, | ||
| + | таких заголовков имя хоста - источника сообщения, | ||
| + | соответствие " | ||
| + | Хосты, не имеющие имени в DNS, запрещаем безусловно. | ||
| + | |||
| + | < | ||
| + | continue | ||
| + | *header `^Received$`i `localhost *( *localhost *)`i | ||
| + | |||
| + | # Пропускаем заголовок, | ||
| + | *header `^Received$`i `by *=(/ | ||
| + | |||
| + | *header `^Received$`i `(localhost \[127\.0\.0\.1])`i | ||
| + | |||
| + | *header `^Received$`i `\( *=(/ | ||
| + | *header `^Received$`i `\( *=(/ | ||
| + | |||
| + | reject "Spam rejected" | ||
| + | *header `^Received$`i `\( *[[: | ||
| + | *header `^Received$`i `\( *[[: | ||
| + | |||
| + | 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 | ||
| + | </ | ||
| + | |||
| + | ====== Составление черных списков ====== | ||
| + | Для автоматического составления черных списков применяется следующая | ||
| + | техника. Каждый из пользователей имеет специальный ящик с именем, | ||
| + | скажем, | ||
| + | помещаются в этот ящик. Затем специальная утилита периодически | ||
| + | проходит по этим ящикам, | ||
| + | и заносит их в черные списки. | ||
| + | |||
| + | Эта же утилита сравнивает черные списки с логом отраженных писем | ||
| + | за достаточно большой период (скажем, | ||
| + | неиспользуемые имена и адреса. | ||
| + | |||
| + | Тексты такой утилиты можно взять здесь: {{mk_black.tgz}} | ||
| + | |||