aboutsummaryrefslogtreecommitdiffstats
path: root/doc/why-rspamd.txt
diff options
context:
space:
mode:
Diffstat (limited to 'doc/why-rspamd.txt')
-rw-r--r--doc/why-rspamd.txt240
1 files changed, 240 insertions, 0 deletions
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.
+