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