şunun yansıması
https://github.com/rspamd/rspamd.git
eşitlendi 2024-07-31 08:18:22 +02:00
f57b47be64
* Add local_scan.c from Anton Nekhoroshikh for exim MTA
393 satır
60 KiB
HTML
393 satır
60 KiB
HTML
<html><head><title>Фильтрация спама при помощи системы rspamd.</title>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" >
|
|
</head>
|
|
<body class='pod'>
|
|
<!--
|
|
generated by Pod::Simple::HTML v3.13,
|
|
using Pod::Simple::PullParser v3.13,
|
|
under Perl v5.010000 at Thu Feb 4 17:55:58 2010 GMT.
|
|
|
|
If you want to change this HTML document, you probably shouldn't do that
|
|
by changing it directly. Instead, see about changing the calling options
|
|
to Pod::Simple::HTML, and/or subclassing Pod::Simple::HTML,
|
|
then reconverting this document from the Pod source.
|
|
When in doubt, email the author of Pod::Simple::HTML for advice.
|
|
See 'perldoc Pod::Simple::HTML' for more info.
|
|
|
|
-->
|
|
|
|
<!-- start doc -->
|
|
<a name='___top' class='dummyTopAnchor' ></a>
|
|
|
|
<h1><a class='u' href='#___top' title='click to go to top of document'
|
|
name="(1060)(1080)(1083)(1100)(1090)(1088)(1072)(1094)(1080)(1103)_(1089)(1087)(1072)(1084)(1072)_(1087)(1088)(1080)_(1087)(1086)(1084)(1086)(1097)(1080)_(1089)(1080)(1089)(1090)(1077)(1084)(1099)_rspamd."
|
|
>Фильтрация спама при помощи системы rspamd.</a></h1>
|
|
|
|
<h2><a class='u' href='#___top' title='click to go to top of document'
|
|
name="1._(1048)(1089)(1090)(1086)(1088)(1080)(1103)_(1080)_(1087)(1088)(1077)(1076)(1087)(1086)(1089)(1099)(1083)(1082)(1080)_(1089)(1086)(1079)(1076)(1072)(1085)(1080)(1103)."
|
|
>1.
|
|
История и предпосылки создания.</a></h2>
|
|
|
|
<p>Мы долгое время использовали для фильтрации спама spamassassin,
|
|
однако,
|
|
при наших объемах почтового трафика (9-10 миллионов писем в сутки) spamassassin не обеспечивал достаточной производительности.
|
|
После анализа исходного кода и принципов работы было выявлены следующие "врожденные" проблемы SA:</p>
|
|
|
|
<ul>
|
|
<li>обработка письма осуществляется набором регулярных выражений,
|
|
однако,
|
|
количество этих выражений слишком велико и является ключевым моментом задумчивости SA (например,
|
|
для извлечения received заголовков письма,
|
|
SA проверяет оные на соответствие всем ему известным MTA,
|
|
очевидно,
|
|
что такое действие не является оптимальным);</li>
|
|
|
|
<li>нет возможности явно получить ip адрес,
|
|
с которого нам отправили письмо (в SA это делается парсом received заголовков,
|
|
что я лично не считаю правильным,
|
|
а тем более оптимальным способом,
|
|
так как MTA всегда знает,
|
|
откуда ему пришло данное письмо)</li>
|
|
|
|
<li>нет возможности передачи спам фильтру данных SMTP диалога</li>
|
|
|
|
<li>MIME парсинг писем очень медленный,
|
|
так как опять же сделан на базе регулярных выражений</li>
|
|
</ul>
|
|
|
|
<p>В итоге можно сказать,
|
|
что основная проблема SA - это излишняя увлеченность авторов регулярными выражениями и отсутствие оптимизации.
|
|
В итоге,
|
|
в качестве базовых принципов создания rspamd были принципы оптимизации времени обработки писем,
|
|
в числе которых:</p>
|
|
|
|
<ul>
|
|
<li>полностью асинхронная работа с сетью (на базе libevent),
|
|
в том числе DNS запросы и работа с http</li>
|
|
|
|
<li>быстрые механизмы выделения памяти</li>
|
|
|
|
<li>компиляция всех регулярных выражений и вызов только тех из них,
|
|
которые наиболее возможны (то есть,
|
|
имеется механизм ведения статистики срабатывания различных правил,
|
|
и при обработке следующего письма учитывается обработка предыдущих,
|
|
что позволяет максимально быстро провести основные тесты)</li>
|
|
|
|
<li>расширяемая архитектура: возможность написания плагинов на си,
|
|
lua,
|
|
возможность добавления новых типов фильтров,
|
|
расширений протокола rspamc,
|
|
возможность добавления новых типов статистических алгоритмов,
|
|
алгоритмов нормализации и парсинга текстов</li>
|
|
|
|
<li>возможность динамической загрузки различных настроек,
|
|
списков ip адресов и прочей информации через HTTP протокол с поддержкой даты модификации таких списков</li>
|
|
|
|
<li>использование везде,
|
|
где возможно,
|
|
специализированных конечных автоматов для разбора и анализа текстов</li>
|
|
|
|
<li>использование быстрого mime парсера gmime</li>
|
|
</ul>
|
|
|
|
<p>В результате перехода с SA на rspamd последний показал в среднем в 10 раз более быструю обработку сообщений.
|
|
В данный момент rspamd имеет статус бета версии,
|
|
но вполне пригоден для работы.</p>
|
|
|
|
<h2><a class='u' href='#___top' title='click to go to top of document'
|
|
name="2._(1059)(1089)(1090)(1072)(1085)(1086)(1074)(1082)(1072)_(1080)_(1085)(1072)(1089)(1090)(1088)(1086)(1081)(1082)(1072)_rspamd"
|
|
>2.
|
|
Установка и настройка rspamd</a></h2>
|
|
|
|
<p>Для сборки rspamd вам потребуются:</p>
|
|
|
|
<ul>
|
|
<li>libevent <a href="http://www.monkey.org/~provos/libevent/" class="podlinkurl"
|
|
>http://www.monkey.org/~provos/libevent/</a> - библиотека для асинхронной обработки событий</li>
|
|
|
|
<li>glib <a href="http://library.gnome.org/devel/glib/" class="podlinkurl"
|
|
>http://library.gnome.org/devel/glib/</a> - библиотека общего назначения,
|
|
содержащая многие вещи,
|
|
о которых разработчики libc,
|
|
увы,
|
|
забыли (glib не является графической библиотекой,
|
|
хотя и используется,
|
|
например,
|
|
gtk)</li>
|
|
|
|
<li>gmime <a href="http://spruce.sourceforge.net/gmime/" class="podlinkurl"
|
|
>http://spruce.sourceforge.net/gmime/</a> - MIME парсер на базе библиотеки glib</li>
|
|
|
|
<li>lua <a href="http://www.lua.org/" class="podlinkurl"
|
|
>http://www.lua.org/</a> - встраиваемый скриптовый язык (в принципе,
|
|
наличие lua необязательно,
|
|
но без lua многий функционал rspamd останется нереализованным)</li>
|
|
|
|
<li>perl <a href="http://www.perl.org/" class="podlinkurl"
|
|
>http://www.perl.org/</a> - на перле написан,
|
|
например,
|
|
консольный клиент rspamc,
|
|
распознаватель редиректов в URL'ях,
|
|
поэтому наличие перла в системе крайне желательно</li>
|
|
|
|
<li>cmake <a href="http://www.cmake.org/" class="podlinkurl"
|
|
>http://www.cmake.org/</a> - система сборки,
|
|
которая позволяет rspamd собираться (по крайней мере,
|
|
в теории) на всех Posix совместимых системах.
|
|
Использовать стандартные в данной ситуации autotools я не стал,
|
|
так как считаю их самой неудобной в использовании системой сборки исходников,
|
|
которую можно только придумать.</li>
|
|
|
|
<li>mercurial <a href="http://mercurial.selenic.com/" class="podlinkurl"
|
|
>http://mercurial.selenic.com/</a> - система управления версиями (SCM),
|
|
используемая для разработки rspamd.
|
|
Так как в настоящее время rspamd находится в состоянии бета-версии,
|
|
то релизы выходят нечасто и зачастую являются менее стабильными,
|
|
чем текущая версия в репозитории,
|
|
поэтому для установки rspamd лучше использовать версию непосредственно из репозитория.</li>
|
|
</ul>
|
|
|
|
<p>После установки всех требуемых программ и библиотек можно приступить непосредственно к установке rspamd.</p>
|
|
|
|
<dl>
|
|
<dt><a name="1_(1089)(1082)(1072)(1095)(1080)(1074)(1072)(1077)(1084)_(1090)(1077)(1082)(1091)(1097)(1077)(1077)_(1089)(1086)(1089)(1090)(1086)(1103)(1085)(1080)(1077)_(1088)(1077)(1087)(1086)(1079)(1080)(1090)(1086)(1088)(1080)(1103):_$_hg_clone_http://rspamd.hg.sourceforge.net:8000/hgroot/rspamd/rspamd"
|
|
>1 скачиваем текущее состояние репозитория: $ hg clone http://rspamd.hg.sourceforge.net:8000/hgroot/rspamd/rspamd</a></dt>
|
|
|
|
<dd>
|
|
<dt><a
|
|
>2 конфигурируем rspamd: $ cd rspamd && cmake .
|
|
(при необходимости изменить параметры можно вначале воспользоваться командой ccmake .)</a></dt>
|
|
|
|
<dd>
|
|
<dt><a name="3_(1089)(1086)(1073)(1080)(1088)(1072)(1077)(1084):_$_make"
|
|
>3 собираем: $ make</a></dt>
|
|
|
|
<dd>
|
|
<dt><a name="4_(1091)(1089)(1090)(1072)(1085)(1072)(1074)(1083)(1080)(1074)(1072)(1077)(1084):_#_make_install"
|
|
>4 устанавливаем: # make install</a></dt>
|
|
</dl>
|
|
|
|
<h3><a class='u' href='#___top' title='click to go to top of document'
|
|
name="(1050)(1086)(1085)(1092)(1080)(1075)(1091)(1088)(1080)(1088)(1086)(1074)(1072)(1085)(1080)(1077)"
|
|
>Конфигурирование</a></h3>
|
|
|
|
<p>В процессе установки ставятся конфигурационные файлы по умолчанию в каталог {PREFIX}/etc.
|
|
При этом,
|
|
в каталог etc/rspamd устанавливаются правила по умолчанию (headers,
|
|
html,
|
|
drugs,
|
|
loto и.т.п.),
|
|
а в каталог etc/rspamd.conf.sample устанавливается конфигурационный файл по умолчанию.
|
|
Его можно скопировать в файл etc/rspamd.conf и отредактировать в соответствии с собственными предпочтениями.
|
|
Конфигурационный файл по умолчанию снабжен комментариями к каждой директиве,
|
|
а также подробно описан в документации к rspamd,
|
|
находящейся в каталоге исходников doc/rspamd.pdf.
|
|
В данном же руководстве подробно изложен принцип работы rspamd и настройки всех модулей системы.
|
|
Для базовой работы достаточно исправить пути к файлам логов,
|
|
пидфайлу,
|
|
а также обратить внимание на разделы factors и classifiers.
|
|
Остановлюсь на этом несколько подробнее.</p>
|
|
|
|
<p>Все директивы rspamd имеют формат param = value; где символ ';' является признаком окончания директивы.
|
|
Также файл разбит на секции,
|
|
каждая секция имеет имя (например worker {}) и внутренние директвы внутри фигурных скобок.
|
|
После каждой секции также обязателен символ ';'.
|
|
Также каждый модуль имеет особый формат секции:</p>
|
|
|
|
<pre>
|
|
.module 'name' {
|
|
param = value;
|
|
};
|
|
</pre>
|
|
|
|
|
|
<p>Все это может показаться сложным на первый взгляд,
|
|
но это позволяет лучше структурировать файл и облегчает расширяемость rspamd.
|
|
Для первоначальной настройки достаточно обратить внимание на раздел factors,
|
|
который описывает веса различных правил,
|
|
раздел metric,
|
|
который описывает максимальный вес,
|
|
чтобы письмо считалось спамом,
|
|
а также на раздел classifiers.
|
|
Раздел classifiers обеспечивает работу статистических алгоритмов.
|
|
В rspamd в настоящее время реализован алгоритм winnow,
|
|
который работает следующим образом:</p>
|
|
|
|
<dl>
|
|
<dt><a name="1_(1090)(1077)(1082)(1089)(1090)_(1088)(1072)(1079)(1073)(1080)(1074)(1072)(1077)(1090)(1089)(1103)_(1085)(1072)_(1089)(1083)(1086)(1074)(1072),_(1090)(1072)(1082)(1078)(1077)_(1074)(1099)(1076)(1077)(1083)(1103)(1077)(1090)(1089)(1103)_(1086)(1082)(1085)(1086)_(1074)_(1087)(1103)(1090)(1100)_(1089)(1083)(1086)(1074)"
|
|
>1 текст разбивается на слова,
|
|
также выделяется окно в пять слов</a></dt>
|
|
|
|
<dd>
|
|
<dt><a name="2_(1086)(1082)(1085)(1086)_(1087)(1077)(1088)(1077)(1084)(1077)(1097)(1072)(1077)(1090)(1089)(1103)_(1087)(1086)_(1089)(1083)(1086)(1074)(1072)(1084),_(1087)(1088)(1080)_(1101)(1090)(1086)(1084)_(1074)(1099)(1076)(1077)(1083)(1103)(1102)(1090)(1089)(1103)_(1089)(1083)(1086)(1074)(1086)(1089)(1086)(1095)(1077)(1090)(1072)(1085)(1080)(1103)_(1087)(1086)_(1086)(1087)(1088)(1077)(1076)(1077)(1083)(1077)(1085)(1085)(1086)(1084)(1091)_(1072)(1083)(1075)(1086)(1088)(1080)(1090)(1084)(1091)_(1080)_(1074)(1099)(1095)(1080)(1089)(1083)(1103)(1077)(1090)(1089)(1103)_(1080)(1093)_(1093)(1077)(1096)"
|
|
>2 окно перемещается по словам,
|
|
при этом выделяются словосочетания по определенному алгоритму и вычисляется их хеш</a></dt>
|
|
|
|
<dd>
|
|
<dt><a
|
|
>3 каждый полученный таким образом хеш проверяется в файле статистики,
|
|
в котором хранятся хеши и их веса,
|
|
если хеш найден,
|
|
то его вес добавляется к суммарному весу данного файла</a></dt>
|
|
|
|
<dd>
|
|
<dt><a name="4_(1092)(1072)(1081)(1083),_(1085)(1072)(1073)(1088)(1072)(1074)(1096)(1080)(1081)_(1074)_(1089)(1091)(1084)(1084)(1077)_(1073)(1086)(1083)(1100)(1096)(1077)_(1074)(1077)(1089)(1072)_(1089)(1095)(1080)(1090)(1072)(1077)(1090)(1089)(1103)_(1082)(1083)(1072)(1089)(1089)(1086)(1084)_(1087)(1080)(1089)(1100)(1084)(1072)"
|
|
>4 файл,
|
|
набравший в сумме больше веса считается классом письма</a></dt>
|
|
</dl>
|
|
|
|
<p>Основная идея такого подхода в определении по словосочетаниям,
|
|
к какому классу принадлежит данное письмо.
|
|
В SA для этой цели используется вероятностный алгоритм bayes,
|
|
который достаточно похож на вышеописанный,
|
|
но считает не веса,
|
|
а вероятности.
|
|
Эффективность каждого из алгоритмов примерно одинакова и зависит в основном от эффективности обучения.
|
|
Однако,
|
|
в отличие от SA,
|
|
rspamd использует не отдельные слова,
|
|
а словосочетания,
|
|
что повышает его эффективность.
|
|
В секции classifiers можно установить различные классы писем,
|
|
а далее в секции factors указать их вес (задав,
|
|
например,
|
|
для заведомо безвредных писем - ham - отрицательный вес).
|
|
Размер файлов статистики должен быть разумно большим для хранения как можно большего числа хешей.
|
|
Однако,
|
|
необходимо учитывать,
|
|
что эти файлы целиком загружаются в память (хотя,
|
|
реализация отображения файла в памяти в различных ОС допускает загрузку и выгрузку страниц этого файла в своп системы,
|
|
но эффективность этого довольно низка),
|
|
поэтому необходимо соизмерять размер оперативной памяти и файлов статистики.</p>
|
|
|
|
<h2><a class='u' href='#___top' title='click to go to top of document'
|
|
name="4._(1055)(1086)(1076)(1082)(1083)(1102)(1095)(1077)(1085)(1080)(1077)_(1080)_(1087)(1088)(1086)(1074)(1077)(1088)(1082)(1072)_(1088)(1072)(1073)(1086)(1090)(1086)(1089)(1087)(1086)(1089)(1086)(1073)(1085)(1086)(1089)(1090)(1080)_rspamd"
|
|
>4.
|
|
Подключение и проверка работоспособности rspamd</a></h2>
|
|
|
|
<p>Для проверки работы системы rspamd проще всего воспользоваться командой rspamc:</p>
|
|
|
|
<pre>
|
|
hostname:~> rspamc stat
|
|
Do rspamc command stat
|
|
Messages scanned: 1234040
|
|
Messages learned: 59151
|
|
Connections count: 1176623
|
|
Control connections count: 59152
|
|
Pools allocated: 2530714
|
|
Pools freed: 2530699
|
|
Bytes allocated: 66991793394
|
|
Memory chunks allocated: 6453232
|
|
Shared chunks allocated: 3
|
|
Chunks freed: 6453090
|
|
Oversized chunks: 468849
|
|
Statfile: WINNOW_HAM (version 69); length: 100.0 MB; free blocks: 4563488; total blocks: 6553581; free: 69.63%
|
|
Statfile: WINNOW_SPAM (version 36383); length: 100.0 MB; free blocks: 760504; total blocks: 6553581; free: 11.60%
|
|
</pre>
|
|
|
|
|
|
<p>В данном случае выводится общая статистика.
|
|
Такого же эффекта можно достигнуть командой telnet на порт процесса controller (он описан в конфигурационном файле в секции worker,
|
|
type у которого controller).
|
|
По умолчанию это порт 11334 на адресе 127.0.0.1.
|
|
Работу правил и статистики можно также проверить по команде rspamc:</p>
|
|
|
|
<pre>
|
|
~> rspamc symbols /tmp/mailman.eml
|
|
Processing /tmp/mailman.eml
|
|
Process file: /tmp/mailman.eml
|
|
Sending 4950 bytes...
|
|
RSPAMD/1.1 0 OK
|
|
Metric: default; False; -3.35 / 10.00 / 0.00
|
|
Symbol: WINNOW_HAM; 5.00
|
|
Symbol: RECEIVED_RBL; pbl.spamhaus.org,insecure-bl.rambler.ru
|
|
Urls:
|
|
</pre>
|
|
|
|
|
|
<p>В данном случае показываются баллы,
|
|
набранные письмом,
|
|
а также дополнительная информация.
|
|
Подробнее о протоколе rspamc в документации (doc/rspamd.pdf).
|
|
Для подключения rspamd к MTA лучше всего использовать milter,
|
|
если ваш MTA postfix или sendmail.
|
|
В качестве milter'а можно использовать,
|
|
например,
|
|
rmilter: <a href="https://www.milter.org/milter/71/" class="podlinkurl"
|
|
>https://www.milter.org/milter/71/</a>.
|
|
О настройке postfix + rmilter мной была написана следующая заметка: <a href="http://cebka.pp.ru/blog/2009/02/-nginxpostfixrmilter.html" class="podlinkurl"
|
|
>http://cebka.pp.ru/blog/2009/02/-nginxpostfixrmilter.html</a> Для MTA exim можно воспользоваться файлом local_scan.c в каталоге contrib/exim.
|
|
Инструкции по его установке описаны в самом файле,
|
|
однако,
|
|
это требует пересборки MTA.
|
|
Также rspamd "понимает" протокол SA,
|
|
поэтому для подключения rspamd можно использовать те же средства,
|
|
что и для подключения к MTA SA.</p>
|
|
|
|
<p>Подробнее о командах rspamc и протоколе rspamc написано опять же в документации.</p>
|
|
|
|
<h2><a class='u' href='#___top' title='click to go to top of document'
|
|
name="5._(1054)(1073)(1091)(1095)(1077)(1085)(1080)(1077)_rspamd"
|
|
>5.
|
|
Обучение rspamd</a></h2>
|
|
|
|
<p>Процесс обучения важен для корректной работы статистики.
|
|
Для обучения используется команда rspamc learn.
|
|
Для указания файла (класса) письма используется ключ -s.
|
|
Пример использования:</p>
|
|
|
|
<pre>
|
|
~> rspamc -s WINNOW_HAM learn /tmp/mailman.eml
|
|
Processing /tmp/mailman.eml
|
|
Process file: /tmp/mailman.eml
|
|
Do rspamc command learn
|
|
Sending 4950 bytes...
|
|
Learn succeed. Sum weight: 128.48
|
|
</pre>
|
|
|
|
|
|
<p>В качестве параметров можно указывать несколько файлов,
|
|
целые каталоги,
|
|
а также imap папки:</p>
|
|
|
|
<pre>
|
|
~> rspamc -s WINNOW_SPAM learn imaps:user:cebka:password::host:somehost.rambler.ru:mbox:abuse.spam
|
|
Processing imaps:user:cebka:password::host:mailsupport.rambler.ru:mbox:abuse.spam
|
|
Enter IMAP password:
|
|
Process imap: host: somehost.rambler.ru, mbox: abuse.spam
|
|
Do rspamc command learn
|
|
Sending 382650 bytes...
|
|
Learn succeed. Sum weight: 1850.24
|
|
<skipped>
|
|
</pre>
|
|
|
|
|
|
<p>При обучении необходимо учитывать,
|
|
чтобы количество spam и ham писем было примерно равным.
|
|
Вес показывает суммарный вес словосочетаний текста,
|
|
который был до обучения данным письмом (то есть,
|
|
то,
|
|
насколько велика вероятность принадлежности данного письма к этому классу).
|
|
При обнаружении неверных срабатываний статистики можно несколько раз применить learn к заданному письму,
|
|
проверяя его суммарный вес.</p>
|
|
|
|
<h2><a class='u' href='#___top' title='click to go to top of document'
|
|
name="6._(1055)(1086)(1076)(1076)(1077)(1088)(1078)(1082)(1072)_(1080)_(1076)(1072)(1083)(1100)(1085)(1077)(1081)(1096)(1080)(1077)_(1076)(1077)(1081)(1089)(1090)(1074)(1080)(1103)"
|
|
>6.
|
|
Поддержка и дальнейшие действия</a></h2>
|
|
|
|
<p>Если вы решили использовать rspamd для обработки вашей почты,
|
|
то лучшим источником информации будет являться документация к rspamd,
|
|
а также примеры lua плагинов: etc/plugins/lua.
|
|
Целью же данной статьи является ознакомление с основными приемами по установке,
|
|
конфигурированию и обучению rspamd,
|
|
а также описание преимуществ rspamd по сравнению с SA.
|
|
Если на любом этапе работы с rspamd у вас возникает проблема,
|
|
то можно о ней сообщить мне: <b>vsevolod@highsecure.ru</b> или же в список рассылки rspamd на sourceforge (англоговорящий): <b>rspamd-devel@lists.sourceforge.net</b>.
|
|
Сама система rspamd находится в состоянии бета-версии,
|
|
поэтому ваша помощь в тестировании и запросы функциональности будут неоценимы в развитии rspamd.</p>
|
|
|
|
<!-- end doc -->
|
|
|
|
</body></html>
|