Версия для печати

MTA ZMailer(zmailer.org) у нас не популярен. Порывшись в русском сегменте сети, я нашёл более-менее подробный рассказ про ZMailer только в статье Игоря Ченцова: «Борьба со СПАМ-ом на примере почтового сервера zmailer».

Zmailer Для больших высоконагруженных почтовых систем подходят далеко не все методы борьбы со спамом и вирусами. К сожалению, но гибкий и достаточно универсальный SpamAssassin с ядром на Perl становится узким местом, при большом потоке почты. Приходится или экстенсивным методом наращивать железо или искать другие методы решения задач.

Здесь я хочу рассказать, как организовать проверку на вирусы и некоторые типы борьбы со спамом в промышленных масштабах, с потоком почты более 5'000'000 писем в сутки.

1. В качестве MTA используем ZMailer. Я согласен с Игорем Ченцовым:

  • Во-первых, это не очень распространённый почтовый сервер, что позволит читателю не зарываться в конкретные реализации sendmail или postfix.
  • Во-вторых, zmailer обладает модульной структурой , что позволяет разбить общую задачу доставки почты на отдельные подзадачи которые облегчают понимание сути проблемы.
  • В-третьих, в основе языка конфигурации почтового маршрутизатора лежит язык, очень похожий на язык Bourne sh, с небольшими дополнениями.
  • Ну и в последних, это просто очень неплохой почтовый сервер :-)

Скачать исходники и попытаться использовать ZMailer можно на сайте: http://zmailer.org

2. Вначале используем внутренние возможности ZMailer для ограничения входящей почты. Анализируя почтовые логи можно явно заблокировать почту с плохо зарекомендовавших себя IP адресов или IP сетей. Например, в zmailer/db/smtp-policy.src так:

[123.123.123.0]/24 message "You are sending too much spam" rejectnet +

Можно организовать проверку валидности почтовых адресов отправителя и/или получателя в DNS и MX . Например, в smtpserver.conf так:

*                   999 FR
#  List of supported style flags:
#    F     DISABLE processing of MAIL FROM thru the interactive router
#    T     DISABLE processing of RCPT TO thru the interactive router
#    v     Process VRFY thru the interactive router
#    e     Process EXPN thru the interactive router
#    R     Require always fully-qualified addresses for MAIL FROM,
#          and for RCPT TO; that is, have @ and domain.
#          ( <postmaster> is the only exception! )
#    S     Allow utter sloppyness in input syntax; mainly extra
#          white-spaces in places where they don't belong are
#          tolerated.  Also lack of HELO/EHLO greeting is allowed!
#    h     Process HELO parameter thru the interactive router
#          Use of this IS NOT RECOMMENED, but is here for the
#          completeness sake...
#    D     Don't Discard; protocol timeouts leave behind files in
#          the $POSTOFFICE/public/ directory with suffixes:
#               .SMTP-TIMEOUT   .DATA-EOF    .BDAT-EOF
#          depending on where the abort happened..

Достаточно эффективно и просто организовать проверку наличия IP адреса отправителя в DNSBL — DNS blacklist или DNS blocklist списках. Раньше такие списки назывались RBL, Real-time Blackhole List, но сейчас это название является торговой маркой, принадлежащей MAPS LLC. Например, в zmailer/db/smtp-policy.src так:

#| Third RBL variant: Late block with RBL+DUL+RSS
_RBL0          rcpt-dns-rbl      dnsbl.njabl.org:bl.spamcop.net:sbl-xbl.spamhaus.org
_RBL1          test-rcpt-dns-rbl +

Если у вас есть клиенты, которые находятся не в ваших сетях и они будут использовать SMTP AUTH для отправки, то лучше использовать третий вариант RBL (Third RBL variant), когда блокировка происходит не на ранней стадии, а уже после аутентификации пользователей. В таком случае вы сможете отключить проверку RBL для аутентифицированных клиентов. Если таких клиентов нет, то для повышения производительность лучше использовать второй способ:

#| Second RBL variant: Early block with RBL+DUL+RSS
_RBL0          test-dns-rbl  dnsbl.njabl.org:bl.spamcop.net:sbl-xbl.spamhaus.org
_RBL1          # Nothing at late phase

3. Используем SPF (структура политики отправителя). Устанавливаем libspf2 и при сборке ZMailer используем ключ: --with-spf

SPF позволяет владельцу домена указать в TXT записи, соответствующей имени домена, специальным образом сформированную строку, указывающую список серверов, имеющих право отправлять email-сообщения с обратными адресами в этом домене. Агенты передачи почты получающие почтовые сообщения могут запрашивать SPF-информацию с помощью простого DNS-запроса, верифицируя таким образом сервер отправителя.

Конфигурируем ZMailer. В smtpserver.conf:

PARAM spf-received                      # create "Received-SPF:" header
PARAM spf-threshold         softfail    # worst acceptable SPF check result

И в zmailer/db/smtp-policy.src добавляем использование SPF «spf +» для нужных групп правил:

#| If you compiled the package with SPF support (http://spf.pobox.com/),
#| adding 'spf +' attribute pair will turn on SPF checks (and  creation
#| of 'Received-SPF:' header if requested in smtpserver.conf).

4. Контекстный фильтр Zmscanner. Последние версии Zmailer позволяют использовать в качестве фильтра не только исполняемый файл, но и UNIX-сокет, через который происходит общение. Это более производительная модель общения MTA и фильтра. В качестве фильтра используем Zmscanner — это модульный фильтр для почтовых систем ZMailer и Sendmail.  В smtpserver.conf включаем его так:

PARAM  contentfilter   /var/run/zmscanner

Сам фильтр и набор базовых модулей к нему можно скачать на сайте автора Eugene Crosser: http://average.org/zmscanner

Собираем и устанавливаем:

$ cd zmscanner
$ sh autogen.sh
$ make

Конфигурируем /usr/local/etc/zmscanner.conf:

# control socket location
socket          /var/run/zmscanner
pidfile         /var/run/zmscanner.pid

# maximum size to scan in the messages (rest ignored)
maxsize         4M

# initial stage to enter message
initstage       zmsg

# termination stage called after everything else with null data
finalstage      zfin

# directory where to search for dynamic modules
#moddir         /usr/local/lib/zmscanner

# directory where modules should look for their personal config files
modconfdir      /usr/local/etc/zmscanner
# modules to load
module          zms_clamav.so
module          zms_dehtml.so
module          zms_pcre.so
#
module          zms_dcc.so
module          zms_restage.so

Там же на сайте Eugene Crosser берем и устанавливаем базовые дополнительные модули: zms_clamav, zms_dehtml, zms_pcre. Перевод описания и функционала модулей есть у меня на сайте. Эти модули позволяют эффективно использовать антивирус ClamAV и иметь возможность по фильтрации содержимого сообщений. Для работы с антивирусом, скачиваем и устанавливаем ClamAV с официального сайта. Замечание: сам clamd демон не используется, проверка идёт через низкоуровневые вызовы библиотеки — это повышает производительность фильтра.

5. Дополнительные модули для Zmscanner. API Zmscanner позволяет достаточно просто разрабатывать и подключать свои модули. Мы открыли проект с нашими дополнительными модулями к Zmscanner: http://kocmuk.ru/zmscanner

Существующие на данный момент доп. модули — это: zms_dcc и zms_restage.  Zms_dcc модуль позволяет использовать возможности контекстного антиспам фильтра DCC. Zms_restage модуль используется для фильтрации писем по регулярным выражениям. В отличии от zms_pcre, zms_restage анализирует EHLO/HELO, env_From, env_To и wholeRFC822 сообщение, фильтр позволяет генерировать 450 и 550 SMTP-ответы, а так же передавать сообщение для обработки в другие программы (”| exec”).

Антиспам фильтр DCC включает  в себя механизм «Серые списки» (англ. Greylisting) — способ автоматической блокировки спама, основанный на том, что «поведение» программного обеспечения, предназначенного для рассылки спама, отличается от поведения обычных серверов электронной почты.

Итоги:

  • мы зафильтровали явные источники спама или абьюза в конфигах Zmailer;
  • настроили прием сообщений с проверкой адресов отправителя и получателя (MAIL FROM, RCPT TO);
  • используем DNSBL для отсечения известных открытых релеев и источников спама;
  • используем SPF для проверки валидности сервера отправителя;
  • используем контекстный фильтр Zmscanner для проверки почты антивирусом ClamAV и фильтрации писем по содержимому;
  • используем контекстный антиспам фильтр DCC и его дополнительную возможность: Greylisting, для уменьшения потока распределённого спама.

Ссылки:

  • Почтовый сервер ZMailer — http://zmailer.org
  • Модульный фильтр Zmscanner для ZMailer — http://average.org/zmscanner
  • Дополнительные модули для Zmscanner — http://kocmuk.ru/zmscanner
  • Open Source антивирус ClamAV — http://clamav.net
  • Структура политики отправителя Sender Policy Framework (SPF) — http://www.openspf.org
  • Контекстный антиспам фильтр Distributed Checksum Clearinghouses (DCC) — http://www.dcc-servers.net/dcc
  • Спасибо Eugene Crosser за Zmscanner и разного рода помощь — http://average.org/~crosser   ;-)

По теме:

Комментарии (4) на запись “Борьба со СПАМом для высоконагруженных почтовых систем на примере MTA Zmailer”

  1. dedmd пишет:

    Спасибо огромное! за статью )

  2. Михаил пишет:

    Чего я только не пробывал какие только фильтры не ставил всё равно спам блин проходил и будет проходить эти гады тоже на месте не сидят. Но я всё же реально решил эту проблему. Кому интересно прочитайте, особенно тем у кого собственные почтовые сервера и их уже просто реально достал спам.

    С чего всё началось

    www.tarantinov.ru/antispam/antispam.php

    и что происходит сейчас

    www.tarantinov.ru/antispam/

  3. kocmuk.ru пишет:

    Банить зарубежные сервера по IP — это не всегда хорошее решение. Я, вот например, жду письма с зарубежных серверов, как с этой проблемой справится ваше решение?

  4. Михаил пишет:

    Банить зарубежные сервера по IP — это не всегда хорошее решение. Я, вот например, жду письма с зарубежных серверов, как с этой проблемой справится ваше решение?

    Справится! В моём предложении банятся IP адреса зарубежных серверов с целью выявления диапазона серверов рассылки спама на сервер получателя. Я не говорю что необходимо сделать железный занавес навсегда.

    Например.

    Благодаря времянному железному занавесу на сервере.

    Мой скрипт который собирает IP адреса зарубежных серверов в одну базу.

    Из этой базы он выявляет IP адреса которые использовались несколько раз, их не так уж и много в основном 2 — 3 раза на один адрес в месяц максимум 5. Если Вы ведёте активную переписку с кемто из зарубежа, то показатель увеличиваетя на десятки раз. Т.к. задача спамера посылать письмо с разного IP он будет использовать сервер с динамическим IP адресом. В этом случаи показатель совпадения по IP адресу очень мал, как я говорил выше 2 — 3 раза на один адрес.

    Далее скрипт сверяет показатели с базой IP диапазонов стран, и тут-то видно откуда постоянно валится спам. Далее блокируем диапазоны и избавляемся от спама. То есть если писем приходит 60-70 то после такой процедуры 5-8. достаточно 2-3 месяца чтоб увидеть IP диапазоны с которых постоянно бомбят Вашу почту.

    www.tarantinov.ru/antispam/

    Тут всё видно. Из 5183 адресов выявленно 577 диапазонов аиз них самых активных 32

Оставить комментарий


Антиспам-картинка