MTA ZMailer(zmailer.org) у нас не популярен. Порывшись в русском сегменте сети, я нашёл более-менее подробный рассказ про 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 ;-)









13.01.2009 в 16:08
Спасибо огромное! за статью )