<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>