diff options
author | cebka@lenovo-laptop <cebka@lenovo-laptop> | 2010-02-04 20:58:47 +0300 |
---|---|---|
committer | cebka@lenovo-laptop <cebka@lenovo-laptop> | 2010-02-04 20:58:47 +0300 |
commit | f57b47be64858f088fc0406c05d8fed94f5f9477 (patch) | |
tree | 92489e4820556d7afb190622aab8bc0b84dccfeb /doc | |
parent | bb5a1a9fb091ae443dd37c497fcf9202649ba95d (diff) | |
download | rspamd-f57b47be64858f088fc0406c05d8fed94f5f9477.tar.gz rspamd-f57b47be64858f088fc0406c05d8fed94f5f9477.zip |
* Add a little review of rspamd
* Add local_scan.c from Anton Nekhoroshikh for exim MTA
Diffstat (limited to 'doc')
-rw-r--r-- | doc/why-rspamd.html | 392 | ||||
-rw-r--r-- | doc/why-rspamd.pod | 333 | ||||
-rw-r--r-- | doc/why-rspamd.txt | 240 |
3 files changed, 965 insertions, 0 deletions
diff --git a/doc/why-rspamd.html b/doc/why-rspamd.html new file mode 100644 index 000000000..aceb1228c --- /dev/null +++ b/doc/why-rspamd.html @@ -0,0 +1,392 @@ +<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> diff --git a/doc/why-rspamd.pod b/doc/why-rspamd.pod new file mode 100644 index 000000000..0b2c71cb8 --- /dev/null +++ b/doc/why-rspamd.pod @@ -0,0 +1,333 @@ +=encoding utf8 + +=head1 Фильтрация спама при помощи системы rspamd. + +=head2 1. История и предпосылки создания. + +Мы долгое время использовали для фильтрации спама spamassassin, однако, при +наших объемах почтового трафика (9-10 миллионов писем в сутки) spamassassin +не обеспечивал достаточной производительности. После анализа исходного кода и +принципов работы было выявлены следующие "врожденные" проблемы SA: + +=over + +=item * +обработка письма осуществляется набором регулярных выражений, однако, +количество этих выражений слишком велико и является ключевым моментом +задумчивости SA (например, для извлечения received заголовков письма, SA +проверяет оные на соответствие всем ему известным MTA, очевидно, что такое +действие не является оптимальным); + +=item * +нет возможности явно получить ip адрес, с которого нам отправили письмо (в SA +это делается парсом received заголовков, что я лично не считаю правильным, а тем +более оптимальным способом, так как MTA всегда знает, откуда ему пришло данное +письмо) + +=item * +нет возможности передачи спам фильтру данных SMTP диалога + +=item * +MIME парсинг писем очень медленный, так как опять же сделан на базе регулярных +выражений + +=back + +В итоге можно сказать, что основная проблема SA - это излишняя увлеченность +авторов регулярными выражениями и отсутствие оптимизации. В итоге, в качестве +базовых принципов создания rspamd были принципы оптимизации времени обработки +писем, в числе которых: + +=over + +=item * +полностью асинхронная работа с сетью (на базе libevent), в том числе DNS запросы +и работа с http + +=item * +быстрые механизмы выделения памяти + +=item * +компиляция всех регулярных выражений и вызов только тех из них, которые наиболее +возможны (то есть, имеется механизм ведения статистики срабатывания различных +правил, и при обработке следующего письма учитывается обработка предыдущих, что +позволяет максимально быстро провести основные тесты) + +=item * +расширяемая архитектура: возможность написания плагинов на си, lua, возможность +добавления новых типов фильтров, расширений протокола rspamc, возможность +добавления новых типов статистических алгоритмов, алгоритмов нормализации и +парсинга текстов + +=item * +возможность динамической загрузки различных настроек, списков ip адресов и +прочей информации через HTTP протокол с поддержкой даты модификации таких +списков + +=item * +использование везде, где возможно, специализированных конечных автоматов для +разбора и анализа текстов + +=item * +использование быстрого mime парсера gmime + +=back + +В результате перехода с SA на rspamd последний показал в среднем в 10 раз более +быструю обработку сообщений. В данный момент rspamd имеет статус бета версии, но +вполне пригоден для работы. + +=head2 2. Установка и настройка rspamd + +Для сборки rspamd вам потребуются: + +=over + +=item * libevent +L<http://www.monkey.org/~provos/libevent/> - библиотека для асинхронной +обработки событий + +=item * glib +L<http://library.gnome.org/devel/glib/> - библиотека общего назначения, +содержащая многие вещи, о которых разработчики libc, увы, забыли (glib не +является графической библиотекой, хотя и используется, например, gtk) + +=item * gmime +L<http://spruce.sourceforge.net/gmime/> - MIME парсер на базе библиотеки glib + +=item * lua +L<http://www.lua.org/> - встраиваемый скриптовый язык (в принципе, наличие lua +необязательно, но без lua многий функционал rspamd останется нереализованным) + +=item * perl +L<http://www.perl.org/> - на перле написан, например, консольный клиент rspamc, +распознаватель редиректов в URL'ях, поэтому наличие перла в системе крайне +желательно + +=item * cmake +L<http://www.cmake.org/> - система сборки, которая позволяет rspamd собираться +(по крайней мере, в теории) на всех Posix совместимых системах. Использовать +стандартные в данной ситуации autotools я не стал, так как считаю их самой +неудобной в использовании системой сборки исходников, которую можно только +придумать. + +=item * mercurial +L<http://mercurial.selenic.com/> - система управления версиями (SCM), +используемая для разработки rspamd. Так как в настоящее время rspamd находится в +состоянии бета-версии, то релизы выходят нечасто и зачастую являются менее +стабильными, чем текущая версия в репозитории, поэтому для установки rspamd +лучше использовать версию непосредственно из репозитория. + +=back + +После установки всех требуемых программ и библиотек можно приступить +непосредственно к установке rspamd. + +=over + +=item 1 +скачиваем текущее состояние репозитория: $ hg clone http://rspamd.hg.sourceforge.net:8000/hgroot/rspamd/rspamd + +=item 2 +конфигурируем rspamd: $ cd rspamd && cmake . +(при необходимости изменить параметры можно вначале воспользоваться командой +ccmake .) + +=item 3 +собираем: $ make + +=item 4 +устанавливаем: # make install + +=back + +=head3 Конфигурирование + +В процессе установки ставятся конфигурационные файлы по умолчанию в каталог +{PREFIX}/etc. При этом, в каталог etc/rspamd устанавливаются правила по +умолчанию (headers, html, drugs, loto и.т.п.), а в каталог +etc/rspamd.conf.sample устанавливается конфигурационный файл по умолчанию. Его +можно скопировать в файл etc/rspamd.conf и отредактировать в соответствии с +собственными предпочтениями. Конфигурационный файл по умолчанию снабжен +комментариями к каждой директиве, а также подробно описан в документации к +rspamd, находящейся в каталоге исходников doc/rspamd.pdf. В данном же +руководстве подробно изложен принцип работы rspamd и настройки всех модулей +системы. Для базовой работы достаточно исправить пути к файлам логов, пидфайлу, +а также обратить внимание на разделы factors и classifiers. Остановлюсь на этом +несколько подробнее. + +Все директивы rspamd имеют формат param = value; где символ ';' является +признаком окончания директивы. Также файл разбит на секции, каждая секция имеет +имя (например worker {}) и внутренние директвы внутри фигурных скобок. После +каждой секции также обязателен символ ';'. Также каждый модуль имеет особый +формат секции: + +=begin html + +<pre> +.module 'name' { + param = value; +}; +</pre> + +=end html + +Все это может показаться сложным на первый взгляд, но это позволяет лучше +структурировать файл и облегчает расширяемость rspamd. Для первоначальной +настройки достаточно обратить внимание на раздел factors, который описывает веса +различных правил, раздел metric, который описывает максимальный вес, чтобы +письмо считалось спамом, а также на раздел classifiers. Раздел classifiers +обеспечивает работу статистических алгоритмов. В rspamd в настоящее время +реализован алгоритм winnow, который работает следующим образом: + +=over + +=item 1 +текст разбивается на слова, также выделяется окно в пять слов + +=item 2 +окно перемещается по словам, при этом выделяются словосочетания по определенному +алгоритму и вычисляется их хеш + +=item 3 +каждый полученный таким образом хеш проверяется в файле статистики, в котором +хранятся хеши и их веса, если хеш найден, то его вес добавляется к суммарному +весу данного файла + +=item 4 +файл, набравший в сумме больше веса считается классом письма + +=back + +Основная идея такого подхода в определении по словосочетаниям, к какому классу +принадлежит данное письмо. В SA для этой цели используется вероятностный +алгоритм bayes, который достаточно похож на вышеописанный, но считает не веса, а +вероятности. Эффективность каждого из алгоритмов примерно одинакова и зависит в +основном от эффективности обучения. Однако, в отличие от SA, rspamd использует +не отдельные слова, а словосочетания, что повышает его эффективность. В секции +classifiers можно установить различные классы писем, а далее в секции factors +указать их вес (задав, например, для заведомо безвредных писем - ham - +отрицательный вес). Размер файлов статистики должен быть разумно большим для +хранения как можно большего числа хешей. Однако, необходимо учитывать, что эти +файлы целиком загружаются в память (хотя, реализация отображения файла в памяти +в различных ОС допускает загрузку и выгрузку страниц этого файла в своп системы, +но эффективность этого довольно низка), поэтому необходимо соизмерять размер +оперативной памяти и файлов статистики. + +=head2 4. Подключение и проверка работоспособности rspamd + +Для проверки работы системы rspamd проще всего воспользоваться командой rspamc: + +=begin html + +<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> + +=end html + +В данном случае выводится общая статистика. Такого же эффекта можно достигнуть +командой telnet на порт процесса controller (он описан в конфигурационном файле +в секции worker, type у которого controller). По умолчанию это порт 11334 на +адресе 127.0.0.1. Работу правил и статистики можно также проверить по команде +rspamc: + +=begin html + +<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> + +=end html + +В данном случае показываются баллы, набранные письмом, а также дополнительная +информация. Подробнее о протоколе rspamc в документации (doc/rspamd.pdf). Для +подключения rspamd к MTA лучше всего использовать milter, если ваш MTA postfix +или sendmail. В качестве milter'а можно использовать, например, rmilter: +L<https://www.milter.org/milter/71/>. О настройке postfix + rmilter мной была +написана следующая заметка: L<http://cebka.pp.ru/blog/2009/02/-nginxpostfixrmilter.html> +Для MTA exim можно воспользоваться файлом local_scan.c в каталоге contrib/exim. +Инструкции по его установке описаны в самом файле, однако, это требует +пересборки MTA. Также rspamd "понимает" протокол SA, поэтому для подключения +rspamd можно использовать те же средства, что и для подключения к MTA SA. + +Подробнее о командах rspamc и протоколе rspamc написано опять же в документации. + +=head2 5. Обучение rspamd + +Процесс обучения важен для корректной работы статистики. Для обучения +используется команда rspamc learn. Для указания файла (класса) письма +используется ключ -s. Пример использования: + +=begin html + +<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> + +=end html + +В качестве параметров можно указывать несколько файлов, целые каталоги, а также +imap папки: + +=begin html + +<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> + +=end html + +При обучении необходимо учитывать, чтобы количество spam и ham писем было +примерно равным. Вес показывает суммарный вес словосочетаний текста, который был +до обучения данным письмом (то есть, то, насколько велика вероятность +принадлежности данного письма к этому классу). При обнаружении неверных +срабатываний статистики можно несколько раз применить learn к заданному письму, +проверяя его суммарный вес. + +=head2 6. Поддержка и дальнейшие действия + +Если вы решили использовать rspamd для обработки вашей почты, то лучшим +источником информации будет являться документация к rspamd, а также примеры lua +плагинов: etc/plugins/lua. Целью же данной статьи является ознакомление с +основными приемами по установке, конфигурированию и обучению rspamd, а также +описание преимуществ rspamd по сравнению с SA. Если на любом этапе работы с +rspamd у вас возникает проблема, то можно о ней сообщить мне: +B<vsevolod@highsecure.ru> или же в список рассылки rspamd на sourceforge +(англоговорящий): B<rspamd-devel@lists.sourceforge.net>. Сама система +rspamd находится в состоянии бета-версии, поэтому ваша помощь в тестировании и +запросы функциональности будут неоценимы в развитии rspamd. diff --git a/doc/why-rspamd.txt b/doc/why-rspamd.txt new file mode 100644 index 000000000..dd0b09637 --- /dev/null +++ b/doc/why-rspamd.txt @@ -0,0 +1,240 @@ +Фильтрация спама при помощи системы rspamd. + 1. История и предпосылки создания. + Мы долгое время использовали для фильтрации спама spamassassin, однако, при + наших объемах почтового трафика (9-10 миллионов писем в сутки) spamassassin + не обеспечивал достаточной производительности. После анализа исходного кода + и принципов работы было выявлены следующие "врожденные" проблемы SA: + + * обработка письма осуществляется набором регулярных выражений, однако, + количество этих выражений слишком велико и является ключевым моментом + задумчивости SA (например, для извлечения received заголовков письма, SA + проверяет оные на соответствие всем ему известным MTA, очевидно, что + такое действие не является оптимальным); + + * нет возможности явно получить ip адрес, с которого нам отправили письмо + (в SA это делается парсом received заголовков, что я лично не считаю + правильным, а тем более оптимальным способом, так как MTA всегда знает, + откуда ему пришло данное письмо) + + * нет возможности передачи спам фильтру данных SMTP диалога + + * MIME парсинг писем очень медленный, так как опять же сделан на базе + регулярных выражений + + В итоге можно сказать, что основная проблема SA - это излишняя увлеченность + авторов регулярными выражениями и отсутствие оптимизации. В итоге, в + качестве базовых принципов создания rspamd были принципы оптимизации времени + обработки писем, в числе которых: + + * полностью асинхронная работа с сетью (на базе libevent), в том числе DNS + запросы и работа с http + + * быстрые механизмы выделения памяти + + * компиляция всех регулярных выражений и вызов только тех из них, которые + наиболее возможны (то есть, имеется механизм ведения статистики + срабатывания различных правил, и при обработке следующего письма + учитывается обработка предыдущих, что позволяет максимально быстро + провести основные тесты) + + * расширяемая архитектура: возможность написания плагинов на си, lua, + возможность добавления новых типов фильтров, расширений протокола + rspamc, возможность добавления новых типов статистических алгоритмов, + алгоритмов нормализации и парсинга текстов + + * возможность динамической загрузки различных настроек, списков ip адресов + и прочей информации через HTTP протокол с поддержкой даты модификации + таких списков + + * использование везде, где возможно, специализированных конечных автоматов + для разбора и анализа текстов + + * использование быстрого mime парсера gmime + + В результате перехода с SA на rspamd последний показал в среднем в 10 раз + более быструю обработку сообщений. В данный момент rspamd имеет статус бета + версии, но вполне пригоден для работы. + + 2. Установка и настройка rspamd + Для сборки rspamd вам потребуются: + + libevent <http://www.monkey.org/~provos/libevent/> - библиотека для + асинхронной обработки событий + glib <http://library.gnome.org/devel/glib/> - библиотека общего назначения, + содержащая многие вещи, о которых разработчики libc, увы, забыли (glib не + является графической библиотекой, хотя и используется, например, gtk) + gmime <http://spruce.sourceforge.net/gmime/> - MIME парсер на базе + библиотеки glib + lua <http://www.lua.org/> - встраиваемый скриптовый язык (в принципе, + наличие lua необязательно, но без lua многий функционал rspamd останется + нереализованным) + perl <http://www.perl.org/> - на перле написан, например, консольный клиент + rspamc, распознаватель редиректов в URL'ях, поэтому наличие перла в системе + крайне желательно + cmake <http://www.cmake.org/> - система сборки, которая позволяет rspamd + собираться (по крайней мере, в теории) на всех Posix совместимых системах. + Использовать стандартные в данной ситуации autotools я не стал, так как + считаю их самой неудобной в использовании системой сборки исходников, + которую можно только придумать. + mercurial <http://mercurial.selenic.com/> - система управления версиями + (SCM), используемая для разработки rspamd. Так как в настоящее время rspamd + находится в состоянии бета-версии, то релизы выходят нечасто и зачастую + являются менее стабильными, чем текущая версия в репозитории, поэтому для + установки rspamd лучше использовать версию непосредственно из репозитория. + + После установки всех требуемых программ и библиотек можно приступить + непосредственно к установке rspamd. + + 1) скачиваем текущее состояние репозитория: $ hg clone + http://rspamd.hg.sourceforge.net:8000/hgroot/rspamd/rspamd + 2) конфигурируем rspamd: $ cd rspamd && cmake . (при необходимости изменить + параметры можно вначале воспользоваться командой ccmake .) + 3) собираем: $ make + 4) устанавливаем: # make install + + Конфигурирование + В процессе установки ставятся конфигурационные файлы по умолчанию в каталог + {PREFIX}/etc. При этом, в каталог etc/rspamd устанавливаются правила по + умолчанию (headers, html, drugs, loto и.т.п.), а в каталог + etc/rspamd.conf.sample устанавливается конфигурационный файл по умолчанию. + Его можно скопировать в файл etc/rspamd.conf и отредактировать в + соответствии с собственными предпочтениями. Конфигурационный файл по + умолчанию снабжен комментариями к каждой директиве, а также подробно описан + в документации к rspamd, находящейся в каталоге исходников doc/rspamd.pdf. В + данном же руководстве подробно изложен принцип работы rspamd и настройки + всех модулей системы. Для базовой работы достаточно исправить пути к файлам + логов, пидфайлу, а также обратить внимание на разделы factors и classifiers. + Остановлюсь на этом несколько подробнее. + + Все директивы rspamd имеют формат param = value; где символ ';' является + признаком окончания директивы. Также файл разбит на секции, каждая секция + имеет имя (например worker {}) и внутренние директвы внутри фигурных скобок. + После каждой секции также обязателен символ ';'. Также каждый модуль имеет + особый формат секции: + +.module 'name' { + param = value; +}; + Все это может показаться сложным на первый взгляд, но это позволяет лучше + структурировать файл и облегчает расширяемость rspamd. Для первоначальной + настройки достаточно обратить внимание на раздел factors, который описывает + веса различных правил, раздел metric, который описывает максимальный вес, + чтобы письмо считалось спамом, а также на раздел classifiers. Раздел + classifiers обеспечивает работу статистических алгоритмов. В rspamd в + настоящее время реализован алгоритм winnow, который работает следующим + образом: + + 1) текст разбивается на слова, также выделяется окно в пять слов + 2) окно перемещается по словам, при этом выделяются словосочетания по + определенному алгоритму и вычисляется их хеш + 3) каждый полученный таким образом хеш проверяется в файле статистики, в + котором хранятся хеши и их веса, если хеш найден, то его вес добавляется к + суммарному весу данного файла + 4) файл, набравший в сумме больше веса считается классом письма + + Основная идея такого подхода в определении по словосочетаниям, к какому + классу принадлежит данное письмо. В SA для этой цели используется + вероятностный алгоритм bayes, который достаточно похож на вышеописанный, но + считает не веса, а вероятности. Эффективность каждого из алгоритмов примерно + одинакова и зависит в основном от эффективности обучения. Однако, в отличие + от SA, rspamd использует не отдельные слова, а словосочетания, что повышает + его эффективность. В секции classifiers можно установить различные классы + писем, а далее в секции factors указать их вес (задав, например, для + заведомо безвредных писем - ham - отрицательный вес). Размер файлов + статистики должен быть разумно большим для хранения как можно большего числа + хешей. Однако, необходимо учитывать, что эти файлы целиком загружаются в + память (хотя, реализация отображения файла в памяти в различных ОС допускает + загрузку и выгрузку страниц этого файла в своп системы, но эффективность + этого довольно низка), поэтому необходимо соизмерять размер оперативной + памяти и файлов статистики. + + 4. Подключение и проверка работоспособности rspamd + Для проверки работы системы rspamd проще всего воспользоваться командой + rspamc: + +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% + В данном случае выводится общая статистика. Такого же эффекта можно + достигнуть командой telnet на порт процесса controller (он описан в + конфигурационном файле в секции worker, type у которого controller). По + умолчанию это порт 11334 на адресе 127.0.0.1. Работу правил и статистики + можно также проверить по команде rspamc: + +~> 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: + В данном случае показываются баллы, набранные письмом, а также + дополнительная информация. Подробнее о протоколе rspamc в документации + (doc/rspamd.pdf). Для подключения rspamd к MTA лучше всего использовать + milter, если ваш MTA postfix или sendmail. В качестве milter'а можно + использовать, например, rmilter: <https://www.milter.org/milter/71/>. О + настройке postfix + rmilter мной была написана следующая заметка: + <http://cebka.pp.ru/blog/2009/02/-nginxpostfixrmilter.html> Для MTA exim + можно воспользоваться файлом local_scan.c в каталоге contrib/exim. + Инструкции по его установке описаны в самом файле, однако, это требует + пересборки MTA. Также rspamd "понимает" протокол SA, поэтому для подключения + rspamd можно использовать те же средства, что и для подключения к MTA SA. + + Подробнее о командах rspamc и протоколе rspamc написано опять же в + документации. + + 5. Обучение rspamd + Процесс обучения важен для корректной работы статистики. Для обучения + используется команда rspamc learn. Для указания файла (класса) письма + используется ключ -s. Пример использования: + +~> 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 + В качестве параметров можно указывать несколько файлов, целые каталоги, а + также imap папки: + +~> 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> + При обучении необходимо учитывать, чтобы количество spam и ham писем было + примерно равным. Вес показывает суммарный вес словосочетаний текста, который + был до обучения данным письмом (то есть, то, насколько велика вероятность + принадлежности данного письма к этому классу). При обнаружении неверных + срабатываний статистики можно несколько раз применить learn к заданному + письму, проверяя его суммарный вес. + + 6. Поддержка и дальнейшие действия + Если вы решили использовать rspamd для обработки вашей почты, то лучшим + источником информации будет являться документация к rspamd, а также примеры + lua плагинов: etc/plugins/lua. Целью же данной статьи является ознакомление + с основными приемами по установке, конфигурированию и обучению rspamd, а + также описание преимуществ rspamd по сравнению с SA. Если на любом этапе + работы с rspamd у вас возникает проблема, то можно о ней сообщить мне: + <mailto:vsevolod@highsecure.ru> или же в список рассылки rspamd на + sourceforge (англоговорящий): <mailto:rspamd-devel@lists.sourceforge.net>. + Сама система rspamd находится в состоянии бета-версии, поэтому ваша помощь в + тестировании и запросы функциональности будут неоценимы в развитии rspamd. + |