aboutsummaryrefslogtreecommitdiffstats
path: root/doc/rspamd.lyx
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2014-09-11 12:49:01 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2014-09-11 12:49:01 +0100
commit57c3dd72006a31a1aa0707e68bda09b6294a60bc (patch)
treede70d4fdeb32ca11a4cf7086c9fc9cbaa9e6ef37 /doc/rspamd.lyx
parent5383a5b80fae73cbc082962e4c4123b2b368f1a1 (diff)
downloadrspamd-57c3dd72006a31a1aa0707e68bda09b6294a60bc.tar.gz
rspamd-57c3dd72006a31a1aa0707e68bda09b6294a60bc.zip
Remove pre-historic documentation.
Diffstat (limited to 'doc/rspamd.lyx')
-rw-r--r--doc/rspamd.lyx4299
1 files changed, 0 insertions, 4299 deletions
diff --git a/doc/rspamd.lyx b/doc/rspamd.lyx
deleted file mode 100644
index 420d1446c..000000000
--- a/doc/rspamd.lyx
+++ /dev/null
@@ -1,4299 +0,0 @@
-#LyX 1.6.4 created this file. For more info see http://www.lyx.org/
-\lyxformat 345
-\begin_document
-\begin_header
-\textclass book
-\begin_preamble
-\usepackage{indentfirst}
-\frenchspacing
-\end_preamble
-\use_default_options false
-\language russian
-\inputencoding utf8
-\font_roman cmr
-\font_sans cmss
-\font_typewriter cmtt
-\font_default_family sfdefault
-\font_sc false
-\font_osf false
-\font_sf_scale 100
-\font_tt_scale 100
-
-\graphics default
-\paperfontsize default
-\spacing single
-\use_hyperref true
-\pdf_title "Rspamd"
-\pdf_author "Vsevolod Stakhov"
-\pdf_bookmarks true
-\pdf_bookmarksnumbered true
-\pdf_bookmarksopen false
-\pdf_bookmarksopenlevel 1
-\pdf_breaklinks false
-\pdf_pdfborder true
-\pdf_colorlinks true
-\pdf_backref false
-\pdf_pdfusetitle true
-\papersize a4paper
-\use_geometry false
-\use_amsmath 0
-\use_esint 0
-\cite_engine basic
-\use_bibtopic false
-\paperorientation portrait
-\secnumdepth 3
-\tocdepth 3
-\paragraph_separation indent
-\defskip medskip
-\quotes_language french
-\papercolumns 1
-\papersides 1
-\paperpagestyle fancy
-\tracking_changes false
-\output_changes false
-\author ""
-\author ""
-\end_header
-
-\begin_body
-
-\begin_layout Title
-Руководство по системе фильтрации спама rspamd.
-\end_layout
-
-\begin_layout Date
-22.03.2010
-\end_layout
-
-\begin_layout Author
-Стахов Всеволод.
-\end_layout
-
-\begin_layout Standard
-\begin_inset CommandInset toc
-LatexCommand tableofcontents
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-
-\end_layout
-
-\begin_layout Chapter
-Общая информация и возможности rspamd
-\end_layout
-
-\begin_layout Standard
-Rspamd - это система, предназначенная для фильтрации спама.
- Изначально rspamd разрабатывался как фильтр для электронной почты, но он
- может применяться и для другого типа сообщений (например, для jabber или
- icq сообщений).
- В основе rspamd лежит концепция асинхронной обработки входящих сообщений.
- Для этого применяется библиотека libevent.
- Это накладывает определенные ограничения на возможности rspamd, так как
- для любой блокирующей операции (например, чтение из сетевого сокета) необходимо
- регистрировать отдельное событие и его обработчика, но дает преимущества
- в скорости работы системы и уменьшает различные служебные затраты (например,
- на создание процессов или потоков).
- Rspamd поддерживает встроенные фильтры на языке lua, что позволяет писать
- собственные фильтры без необходимости пересборки системы.
- Rspamd настраивается путем редактирования конфигурационного файла.
- Также имеется управляющий интерфейс, посредством которого можно различным
- образом управлять работой системы и получать ее текущее состояние.
- Rspamd поддерживает различные типы фильтров: фильтры на основе регулярных
- выражений, фильтры на основе DNS запросов, фильтры на основе статистики,
- фильтры по различным спискам и другие типы фильтров (например, фильтры,
- написанные на языке lua и выполняющие различные действия по анализу сообщений).
- Rspamd имеет протокол, совместимый с системой spamassassin (в дальнейшем
- протокол spamc), а также его расширение - rspamc, позволяющее передавать
- больше информации фильтру, что ускоряет обработку сообщений.
- Система rspamd состоит из двух основных частей: монитор процессов и процессы,
- осуществляющие обработку (workers).
- Монитор процессов отвечает за старт системы, открытие/закрытие журналов
- работы, а также обеспечивает непрерывную работу рабочих процессов и их
- перезапуск при необходимости.
-\end_layout
-
-\begin_layout Chapter
-Установка rspamd
-\end_layout
-
-\begin_layout Section
-Требования
-\end_layout
-
-\begin_layout Itemize
-GNU C компилятор (работоспособность проверялась на gcc 4.2.1)
-\end_layout
-
-\begin_layout Itemize
-cmake -
-\begin_inset CommandInset href
-LatexCommand href
-name "http://cmake.org/"
-target "http://cmake.org/"
-
-\end_inset
-
- используется для конфигурации сборки и генерации Makefile.
- Необходимая версия - не менее 2.6.
-\end_layout
-
-\begin_layout Itemize
-glib -
-\begin_inset CommandInset href
-LatexCommand href
-name "http://ftp.gnome.org/"
-target "http://ftp.gnome.org/pub/GNOME/sources/glib/2.20/"
-
-\end_inset
-
- используется для различного рода утилит и структур хранения данных (хеши,
- деревья, списки).
- Необходимая версия - не менее 2.16.
-\end_layout
-
-\begin_layout Itemize
-gmime -
-\begin_inset CommandInset href
-LatexCommand href
-name "http://ftp.acc.umu.se"
-target "http://ftp.acc.umu.se/pub/GNOME/sources/gmime/2.2/"
-
-\end_inset
-
- используется для разбора mime структуры сообщений.
- Необходимая версия 2.2.
- Работа с gmime 2.4 и старше не проверялась.
-\end_layout
-
-\begin_layout Itemize
-lua -
-\begin_inset CommandInset href
-LatexCommand href
-name "http://www.lua.org/"
-target "http://www.lua.org/download.html"
-
-\end_inset
-
- используется для работы lua плагинов (без liblua работа rspamd возможна,
- но без поддержки lua плагинов).
- Версия необходима не меньше, чем 5.1.
-\end_layout
-
-\begin_layout Itemize
-libevent -
-\begin_inset CommandInset href
-LatexCommand href
-name "http://www.monkey.org/~provos/libevent/"
-target "http://www.monkey.org/~provos/libevent/"
-
-\end_inset
-
- используется для кросс-платформенной обработки асинхронных событий, а также
- для определения DNS имен (также асинхронного).
-\end_layout
-
-\begin_layout Section
-Установка
-\end_layout
-
-\begin_layout Standard
-Для сборки rspamd необходимо скачать архив (самая свежая версия может быть
- найдена на
-\begin_inset CommandInset href
-LatexCommand href
-name "http://cebka.pp.ru/distfiles/"
-target "http://cebka.pp.ru/distfiles/"
-
-\end_inset
-
-).
- После этого необходимо распаковать архив и скомпилировать код:
-\end_layout
-
-\begin_layout LyX-Code
-$ tar xzf rspamd-x.x.x.tar.gz
-\end_layout
-
-\begin_layout LyX-Code
-$ cd rspamd-x.x.x
-\end_layout
-
-\begin_layout LyX-Code
-$ cmake .
-\end_layout
-
-\begin_layout LyX-Code
-$ make
-\end_layout
-
-\begin_layout Standard
-Установка осуществляется стандартным
-\end_layout
-
-\begin_layout LyX-Code
-# make install
-\end_layout
-
-\begin_layout Standard
-В процессе установки копируются исполняемые файлы rspamd: bin/rspamd и bin/rspam
-c, а также примеры конфигурации и плагины, устанавливающиеся в каталог etc/rspam
-d/.
- Также для ОС FreeBSD устанавливается стартовый скрипт rspamd.sh в каталог
- etc/rc.d.
-
-\end_layout
-
-\begin_layout Section
-Запуск
-\end_layout
-
-\begin_layout Standard
-Rspamd запускается либо из стартового скрипта, либо непосредственно вызовом
- rspamd.
- Доступные опции командной строки:
-\end_layout
-
-\begin_layout Code
--h: Показать справочную информацию и выйти
-\end_layout
-
-\begin_layout Code
--t: Проверить конфигурационный файл и выйти
-\end_layout
-
-\begin_layout Code
--C: Показать содержимое кеша символов и выйти
-\end_layout
-
-\begin_layout Code
--V Показать все переменные rspamd и выйти
-\end_layout
-
-\begin_layout Code
--f: Не выполнять демонизацию
-\end_layout
-
-\begin_layout Code
--c: Указать путь до конфигурационного файла (по умолчанию используется
- /usr/local/etc/rspamd.conf)
-\end_layout
-
-\begin_layout Code
--u: Пользователь, под которым осуществлять работу rspamd
-\end_layout
-
-\begin_layout Code
--g: Группа, под которой осуществять работу rspamd
-\end_layout
-
-\begin_layout Standard
-Если rspamd запускается от суперпользователя, то после создания лог-файла,
- PID-файла, а также сокетов, принимающих соединения, осуществляется сброс
- привиллегий до пользователя и группы, указанных в опциях командной строки
- (таким образом, все рабочие процессы работают от указанного пользователя
- и группы).
-\end_layout
-
-\begin_layout Chapter
-Общие принципы работы
-\end_layout
-
-\begin_layout Standard
-Прежде чем приступать к настройке rspamd необходимо понять основные принципы
- функционирования системы.
-\end_layout
-
-\begin_layout Section
-Планирование и запуск рабочих процессов
-\end_layout
-
-\begin_layout Standard
-При запуске rspamd происходят следующие действия:
-\end_layout
-
-\begin_layout Enumerate
-Запускается главный процесс (rspamd main)
-\end_layout
-
-\begin_layout Enumerate
-Инициализируются конфигурационные параметры по умолчанию
-\end_layout
-
-\begin_layout Enumerate
-Читаются параметры командной строки
-\end_layout
-
-\begin_layout Enumerate
-Настраивается журналирование ошибок в терминал
-\end_layout
-
-\begin_layout Enumerate
-Читается и парсится конфигурационный файл
-\end_layout
-
-\begin_layout Enumerate
-Инициализируются модули
-\end_layout
-
-\begin_layout Enumerate
-Модули читают свои конфигурационные параметры
-\end_layout
-
-\begin_layout Enumerate
-Устанавливаются лимиты
-\end_layout
-
-\begin_layout Enumerate
-Настраивается журналирование, указанное в конфигурационном файле
-\end_layout
-
-\begin_layout Enumerate
-Происходит демонизация (если не указан флаг -f)
-\end_layout
-
-\begin_layout Enumerate
-Настраивается обработка сигналов головным процессом
-\end_layout
-
-\begin_layout Enumerate
-Записывается PID-файл
-\end_layout
-
-\begin_layout Enumerate
-Инициализируются lua плагины
-\end_layout
-
-\begin_layout Enumerate
-Инициализируется подсистема событий и mime парсер
-\end_layout
-
-\begin_layout Enumerate
-Загружается кеш символов
-\end_layout
-
-\begin_layout Enumerate
-Порождаются рабочие процессы (сброс привиллегий осуществляется сразу же
- после вызова fork)
-\end_layout
-
-\begin_layout Enumerate
-Начинается цикл обработки сигналов
-\end_layout
-
-\begin_layout Standard
-Головной процесс rspamd реагирует на следующие сигналы:
-\end_layout
-
-\begin_layout Itemize
-SIGTERM - послать всем рабочим процессам SIGTERM, дождаться их завершения
- и выйти
-\end_layout
-
-\begin_layout Itemize
-SIGINT - то же, что и SIGTERM
-\end_layout
-
-\begin_layout Itemize
-SIGHUP - переинициализировать журналирование и породить новые рабочие процессы,
- завершив старые (при этом, существующие рабочие процессы завершают работу,
- обработав уже полученные соединения)
-\end_layout
-
-\begin_layout Itemize
-SIGCHLD - головной процесс получает этот сигнал при завершении работы рабочего
- процесса.
- Если рабочий процесс завершился некорректно, то планируется его перезапуск
- через 2 секунды.
-\end_layout
-
-\begin_layout Itemize
-SIGUSR2 - приходит от рабочего процесса, когда тот успешно инициализируется
-\end_layout
-
-\begin_layout Itemize
-SIGALARM - сигнализирует о необходимости запуска рабочего процесса, который
- был запланирован после получения SIGCHLD
-\end_layout
-
-\begin_layout Standard
-Таким образом, головной процесс отвечает за инициализацию, конфигурацию,
- работу с PID-файлом, работу с журналированием, а также за порождение рабочих
- процессов.
- В ходе работы головной процесс постоянно следит за работой рабочих процессов
- и обеспечивает перезапуск некорректно завершившихся рабочих процессов.
- Для ротации файлов журналирования рабочему процессу необходимо послать
- сигнал SIGHUP.
-\end_layout
-
-\begin_layout Section
-Логика обработки сообщений
-\end_layout
-
-\begin_layout Standard
-Инициализация рабочего процесса предельно проста: происходит переинициализация
- libevent, а также инициализация DNS resolver'а.
- После этого рабочий процесс устанавливает обработчик готовности к чтению
- слушающего сокета (этот сокет создается в головном процессе и передается
- рабочему процессу как параметр).
- При готовности к чтению на слущающем сокете рабочий процесс создает новый
- объект типа worker_task и делается accept на слушающем сокете.
- После этого rspamd обрабатывает протокол rspamc (или же spamc) и читает
- сообщение.
- После окончания получения сообщения rspamd декодирует его содержимое и
- начинает обработку.
- Для более простого изложения принципов работы rspamd необходимо описать
- некоторые понятия:
-\end_layout
-
-\begin_layout Itemize
-Символ - это правило фильтрации rspamd, например, некоторое регулярное выражение
- или же запрос к DNS или же любое другое действие.
- Символ имеет собственный вес и имя.
- Таким образом, символ можно считать результатом работы одного правила фильтраци
-и.
- Если это правило сработало, то оно добавляет символ с определенным весом
- и атрибутами, если нет, то символ не добавляется.
-\end_layout
-
-\begin_layout Itemize
-Метрика - это набор логически связанных правил и связанных с ними символов.
- Такая группа имеет свой предел очков, после набора которых сообщение считается
- по этой метрике спамом.
- Очки формируются после подсчета весов символов, добавленных в метрику (при
- этом, разумеется, несработавшие правила символов не добавляют и их вес
- равен нулю) и обработки этих весов функцией консолидации.
- По умолчанию такой функцией является функция-факторизатор, которая просто
- считает вес каждого символа равным константе, заданной в конфигурационном
- файле для этого символа, например, следующие параметры в конфигурационном
- файле задают вес символа MIME_HTML_ONLY равный одному, а вес символа FAKE_HTML
- - восьми:
-\end_layout
-
-\begin_layout LyX-Code
-"MIME_HTML_ONLY" = 1;
-\end_layout
-
-\begin_layout LyX-Code
-"FAKE_HTML" = 8;
-\end_layout
-
-\begin_layout Itemize
-Модуль - это набор правил rspamd, который обеспечивает общие проверки.
- Например, модуль проверки регулярных выражений или модуль проверки URL'ей
- по
-\begin_inset Quotes eld
-\end_inset
-
-черным
-\begin_inset Quotes erd
-\end_inset
-
- спискам.
- Модули также могут быть написаны на языке LUA.
- Каждый модуль регистрирует символы, соответствующие сконфигурированным
- в нем правилам, в таблице символов заданной метрики (или метрики по умолчанию
-
-\begin_inset Quotes eld
-\end_inset
-
-default
-\begin_inset Quotes erd
-\end_inset
-
-).
-\end_layout
-
-\begin_layout Itemize
-Таблица символов метрики - это таблица, хранящая данные о зарегистрированных
- символах, таблица отсортирована, чтобы обеспечить проверку самых
-\begin_inset Quotes eld
-\end_inset
-
-удобных
-\begin_inset Quotes erd
-\end_inset
-
- правил в первую очередь.
- Критерий
-\begin_inset Quotes eld
-\end_inset
-
-удобности
-\begin_inset Quotes erd
-\end_inset
-
- составляется из трех составляющих: веса правила, частоты его срабатывания
- и времени его выполнения.
- Чем больше вес, частота срабатывания и меньше время выполнения, тем раньше
- будет проверено это правило.
-\end_layout
-
-\begin_layout Itemize
-Классификатор - это алгоритм, обеспечивающий определение принадлежности
- сообщения к какому-либо классу.
- Класс определяется символом (например символ SPAM, имеющий вес 5 и символ
- HAM, имеющий вес -5).
- Принадлежность к классу обеспечивается либо статистически, путем разбора
- текста сообщения на токены и сравнения с известными токенами, хранящимися
- на диске в виде файла токенов (statfile), либо же иным алгоритмом (например,
- нейросетью).
- В результате работы классификатора определяется соответствие сообщения
- какому-либо классу и добавления соответствующего этому классу символа.
- Классификатор отличается от обычного модуля тем, что он не просто проверяет
- какие-либо характеристики сообщения, а сравнивает содержание сообщения
- с известными ему наборами.
- То есть, классификатор для его работы необходимо обучать на различных наборах.
- В настоящее время в rspamd реализован алгоритм классификации winnow и разбора
- на токены OSB.
- О них будет написано в дальнейшем.
-\end_layout
-
-\begin_layout Standard
-Обработка осуществляется по следующей логике:
-\end_layout
-
-\begin_layout Itemize
-для каждой метрики выбирается таблица символов и выбираются по очереди символы
- (по степени
-\begin_inset Quotes eld
-\end_inset
-
-удобности
-\begin_inset Quotes erd
-\end_inset
-
-)
-\end_layout
-
-\begin_layout Itemize
-для каждого символа вызывается соответствующее правило
-\end_layout
-
-\begin_layout Itemize
-после вызова очередного правила проверяется, не превысил ли результат метрики
- порогового результата
-\end_layout
-
-\begin_layout Itemize
-при превышении порога сообщение считается по этой метрике спамом и больше
- символов из этой метрики не проверяется
-\end_layout
-
-\begin_layout Itemize
-для сообщения проверяется принадлежность к какому-либо классу для корректировки
- результата
-\end_layout
-
-\begin_layout Itemize
-после определения принадлежности к классу происходит окончательный пересчет
- очков по метрике и при совпадении критериев автообучения происходит автообучени
-е классификатора
-\end_layout
-
-\begin_layout Standard
-После обработки сообщений для каждой из метрик выводится результат.
- Если используется протокол spamc, то считается только метрика
-\begin_inset Quotes eld
-\end_inset
-
-default
-\begin_inset Quotes erd
-\end_inset
-
-, а дополнительные метрики добавляются как заголовки вида X-Spam-Status:
- metric; result.
- Для протокола rspamc выводятся результаты всех метрик, что позволяет настраиват
-ь различные группы правил и осуществлять фильтрацию сообщений не только
- как spam/ham, а задавать различные критерии оценки.
-\end_layout
-
-\begin_layout Chapter
-Настройка rspamd
-\end_layout
-
-\begin_layout Section
-Общие правила настройки
-\end_layout
-
-\begin_layout Standard
-Файл конфигурации rspamd имеет следующий синтаксис:
-\end_layout
-
-\begin_layout LyX-Code
-param = value;
-\end_layout
-
-\begin_layout Standard
-Точка с запятой является обязательной в конце каждой директивы.
- Некоторые директивы являются составными и обрамляются фигурными скобками,
- например:
-\end_layout
-
-\begin_layout LyX-Code
-section {
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-param = value;
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-};
-\end_layout
-
-\begin_layout Standard
-Также позволяется включать другие файлы (точка с запятой в конце директивы
- не нужна):
-\end_layout
-
-\begin_layout LyX-Code
-.include /path/to/file
-\end_layout
-
-\begin_layout Standard
-В конфигурационном файле допускается определять и использовать переменные:
-\end_layout
-
-\begin_layout LyX-Code
-$var = "some text";
-\end_layout
-
-\begin_layout LyX-Code
-param = "${var}";
-\end_layout
-
-\begin_layout Standard
-Приведенный фрагмент определяет переменную $var и присваивает параметру
-
-\begin_inset Quotes eld
-\end_inset
-
-param
-\begin_inset Quotes erd
-\end_inset
-
- значение
-\begin_inset Quotes eld
-\end_inset
-
-some text
-\begin_inset Quotes erd
-\end_inset
-
-.
- Переменные имеют глобальную область действия, обрамление переменных фигурными
- скобками при использовании (вида ${some_variable}) обязательно.
- Большинство строк конфигурационного файла обрамляется двойными кавычками.
- Одинарные кавычки применяются только при конфигурации модуля (это поведение
- подлежит пересмотру в следующих версиях):
-\end_layout
-
-\begin_layout LyX-Code
-.module 'name' {
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-param = "value";
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-};
-\end_layout
-
-\begin_layout Subsection
-Определения списков
-\end_layout
-
-\begin_layout Standard
-В rspamd многие параметры задаются в виде списков.
- Списки задаются ссылкой на файл или же http ресурс.
- Основное отличие таких файлов в том, что rspamd проверяет изменения в таких
- файлах (примерно раз в минуту, используя случайный разброс) и перегружает
- списки при их модификации.
- Таким же образом организована загрузка списков через http, только вместо
- modification time используется HTTP 1.1 заголовок If-Modified-Since, в ответ
- на который http сервер может выдать ответ 304: Not modified, в таком случае
- rspamd не перечитывает список.
- Списками задаются те параметры, которые могут содержать много значений
- и которые могут часто меняться.
- Для того, чтобы не приходилось выполнять перезапуск rspamd списки перечитываютс
-я по мере их обновления.
- Определения списков выглядят следующим образом:
-\end_layout
-
-\begin_layout Itemize
-http список:
-\end_layout
-
-\begin_layout LyX-Code
-param = "http://test.ru:81/some/path.php";
-\end_layout
-
-\begin_layout LyX-Code
-param = "http://test.ru/some/other.txt";
-\end_layout
-
-\begin_layout Itemize
-file список:
-\end_layout
-
-\begin_layout LyX-Code
-param = "file:///var/run/rspamd/some.file";
-\end_layout
-
-\begin_layout Section
-Общие параметры конфигурации
-\end_layout
-
-\begin_layout Standard
-Общие параметры не принадлежат никакой секции и позволяют задавать общие
- настройки системы.
-\end_layout
-
-\begin_layout Itemize
-pidfile - путь до PID-файла:
-\end_layout
-
-\begin_layout LyX-Code
-pidfile = "/var/run/rspamd.pid";
-\end_layout
-
-\begin_layout Itemize
-statfile_pool_size - размер пула файлов статистики в памяти.
- Может быть с суффиксом, определяющим единицы измерение (по умолчанию байты):
- K - килобайты, M - мегабайты, G - гигабайты.
-\end_layout
-
-\begin_layout LyX-Code
-statfile_pool_size = 40M;
-\end_layout
-
-\begin_layout Itemize
-raw_mode - если этот параметр равен
-\begin_inset Quotes eld
-\end_inset
-
-yes
-\begin_inset Quotes erd
-\end_inset
-
-, то rspamd не осуществляет перекодировку сообщений в utf8, в этом режиме
- проверка сообщений осуществляется быстрее, но при этом одинаковые сообщения
- в разных кодировках будут обрабатываться как разные.
-\end_layout
-
-\begin_layout LyX-Code
-raw_mode = yes;
-\end_layout
-
-\begin_layout Itemize
-filters - строка, содержащая список включенных модулей, имена модулей разделяютс
-я запятыми и/или пробелами.
-\end_layout
-
-\begin_layout LyX-Code
-filters = "surbl,regexp,chartable,emails";
-\end_layout
-
-\begin_layout Section
-Настройка процессов
-\end_layout
-
-\begin_layout Standard
-Данные секции служат для определения параметров рабочих процессов.
- Общие параметры рабочего процесса:
-\end_layout
-
-\begin_layout Itemize
-type - тип рабочего процесса:
-\end_layout
-
-\begin_deeper
-\begin_layout Itemize
-normal - обычный процесс обработки сообщений
-\end_layout
-
-\begin_layout Itemize
-controller - управляющий процесс
-\end_layout
-
-\begin_layout Itemize
-lmtp - процесс обработки сообщений по протоколу lmtp
-\end_layout
-
-\begin_layout Itemize
-fuzzy - хранилище хешей
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-type = "normal";
-\end_layout
-
-\begin_layout Itemize
-bind_socket - параметры слушающего сокета процесса, может определять либо
- tcp сокет, либо unix сокет:
-\end_layout
-
-\begin_deeper
-\begin_layout Itemize
-host:port - осуществляет bind на указанные host и port
-\end_layout
-
-\begin_layout Itemize
-*:port - осуществляет bind на указанные port на всех локальных адресах
-\end_layout
-
-\begin_layout Itemize
-/path/to/socket - осуществляет bind на указанный unix socket
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-bind_socket = localhost:11334;
-\end_layout
-
-\begin_layout Itemize
-count - количество процессов данного типа.
- По умолчанию это число равно числу логических процессоров в системе.
-\end_layout
-
-\begin_layout LyX-Code
-count = 1;
-\end_layout
-
-\begin_layout Standard
-Для процессов типа
-\begin_inset Quotes eld
-\end_inset
-
-controller
-\begin_inset Quotes erd
-\end_inset
-
- можно также указать пароль для привиллегированных команд параметром password,
- а для процессов типа
-\begin_inset Quotes eld
-\end_inset
-
-fuzzy
-\begin_inset Quotes erd
-\end_inset
-
- необходимо указать путь к файлу, который будет использован как хранилище
- хешей параметром hashfile.
- Пример настройки рабочих процессов:
-\end_layout
-
-\begin_layout LyX-Code
-worker {
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
- type = "normal";
-\end_layout
-
-\begin_layout LyX-Code
- count = 1;
-\end_layout
-
-\begin_layout LyX-Code
- bind_socket = *:11333;
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-};
-\end_layout
-
-\begin_layout LyX-Code
-
-\end_layout
-
-\begin_layout LyX-Code
-worker {
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
- type = "controller";
-\end_layout
-
-\begin_layout LyX-Code
- bind_socket = localhost:11334;
-\end_layout
-
-\begin_layout LyX-Code
- count = 1;
-\end_layout
-
-\begin_layout LyX-Code
- password = "q1";
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-};
-\end_layout
-
-\begin_layout LyX-Code
-worker {
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
- type = "fuzzy";
-\end_layout
-
-\begin_layout LyX-Code
- bind_socket = localhost:11335;
-\end_layout
-
-\begin_layout LyX-Code
- count = 1;
-\end_layout
-
-\begin_layout LyX-Code
- hashfile = "/tmp/fuzzy.db";
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-};
-\end_layout
-
-\begin_layout Section
-Настройки журналирования
-\end_layout
-
-\begin_layout Standard
-Данные настройки определяют тип журналирования и его параметры.
-\end_layout
-
-\begin_layout Itemize
-log_type - тип журналирования:
-\end_layout
-
-\begin_deeper
-\begin_layout Itemize
-console - журналирование в stderr
-\end_layout
-
-\begin_layout Itemize
-syslog - журналирование через syslog
-\end_layout
-
-\begin_layout Itemize
-file - журналирование в файл
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-log_type = console;
-\end_layout
-
-\begin_layout Itemize
-log_level - уровень ведения журнала
-\end_layout
-
-\begin_deeper
-\begin_layout Itemize
-DEBUG - журналирование отладочной информации
-\end_layout
-
-\begin_layout Itemize
-INFO - журналирование информационных событий
-\end_layout
-
-\begin_layout Itemize
-WARN - журналирование только предупреждений
-\end_layout
-
-\begin_layout Itemize
-ERROR - журналирование только ошибок
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-log_level = INFO;
-\end_layout
-
-\begin_layout Itemize
-log_facility - используется для журналирования в syslog и определяет назначение
- сообщений.
- Более подробно об этом можно узнать из man syslog.
-\end_layout
-
-\begin_layout LyX-Code
-log_facility = "LOG_MAIL";
-\end_layout
-
-\begin_layout Itemize
-log_file - используется для журналирования в файл и путь к файлу журнала.
-\end_layout
-
-\begin_layout LyX-Code
-log_file = "/var/log/rspamd.log";
-\end_layout
-
-\begin_layout Standard
-Пример настройки журналирования:
-\end_layout
-
-\begin_layout LyX-Code
-logging {
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
- log_type = file;
-\end_layout
-
-\begin_layout LyX-Code
- log_level = INFO;
-\end_layout
-
-\begin_layout LyX-Code
- log_file = "/var/log/rspamd.log"
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-};
-\end_layout
-
-\begin_layout Section
-Настройки метрики
-\end_layout
-
-\begin_layout Standard
-Для настроек метрик используются секции
-\begin_inset Quotes eld
-\end_inset
-
-metric
-\begin_inset Quotes erd
-\end_inset
-
-.
- Основные параметры метрик:
-\end_layout
-
-\begin_layout Itemize
-name - имя метрики.
-\end_layout
-
-\begin_layout LyX-Code
-name = "default";
-\end_layout
-
-\begin_layout Itemize
-required_score - минимальное число очков, необходимое, чтобы сообщение считалось
- спамом по данной метрике.
-\end_layout
-
-\begin_layout LyX-Code
-required_score = 10;
-\end_layout
-
-\begin_layout Itemize
-cache_file - путь до файла, содержащего кеш символов метрики (используется,
- чтобы сохранить статистику
-\begin_inset Quotes eld
-\end_inset
-
-удобности
-\begin_inset Quotes erd
-\end_inset
-
- символов метрики, чтобы при перезапуске rspamd не терять накопленных данных).
-\end_layout
-
-\begin_layout LyX-Code
-cache_file = "/var/run/rspamd/metric.cache";
-\end_layout
-
-\begin_layout Standard
-Пример настройки метрики:
-\end_layout
-
-\begin_layout LyX-Code
-metric {
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
- name = "default";
-\end_layout
-
-\begin_layout LyX-Code
- required_score = 10.1;
-\end_layout
-
-\begin_layout LyX-Code
- cache_file = "/tmp/symbols.cache";
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-};
-\end_layout
-
-\begin_layout Section
-Настройка классификаторов
-\end_layout
-
-\begin_layout Standard
-Для настройки классификаторов используются секции
-\begin_inset Quotes eld
-\end_inset
-
-classifier
-\begin_inset Quotes erd
-\end_inset
-
-.
- Общие настройки классфикатора:
-\end_layout
-
-\begin_layout Itemize
-type - алгоритм классификатора (в настоящее время определен только
-\begin_inset Quotes eld
-\end_inset
-
-winnow
-\begin_inset Quotes erd
-\end_inset
-
-).
-\end_layout
-
-\begin_layout LyX-Code
-type = "winnow";
-\end_layout
-
-\begin_layout Itemize
-tokenizer - алгоритм разбиения сообщения на токены (в настоящее время определен
- только
-\begin_inset Quotes eld
-\end_inset
-
-osb-text
-\begin_inset Quotes erd
-\end_inset
-
-).
-\end_layout
-
-\begin_layout LyX-Code
-tokenizer = "osb-text";
-\end_layout
-
-\begin_layout Standard
-Также каждый классификатор может содержать определения классов и соответствующих
- им файлов токенов.
- Для этого используется подсекция statfile, содержащая следующие параметры:
-\end_layout
-
-\begin_layout Itemize
-symbol - имя класса и имя символа, используемого для данного класса.
-\end_layout
-
-\begin_layout LyX-Code
-symbol = "WINNOW_SPAM";
-\end_layout
-
-\begin_layout Itemize
-path - путь до файла.
-\end_layout
-
-\begin_layout LyX-Code
-path = "/var/run/rspamd/winnow.spam";
-\end_layout
-
-\begin_layout Itemize
-size - размер данного файла.
- Также может иметь суффикс размерности.
-\end_layout
-
-\begin_layout LyX-Code
-size = 100M;
-\end_layout
-
-\begin_layout Standard
-Внутри каждого определения класса можно использовать подсекцию autolearn,
- определяющую условия, при которых происходит автоматическое обучение данного
- класса.
- Секция имеет следующие параметры:
-\end_layout
-
-\begin_layout Itemize
-min_mark - минимальное число очков, при котором осуществляется обучение.
-\end_layout
-
-\begin_layout LyX-Code
-min_mark = 10.1;
-\end_layout
-
-\begin_layout Itemize
-max_mark - максимальное число очков, при котором осуществляется обучение.
-\end_layout
-
-\begin_layout LyX-Code
-max_mark = 0.1;
-\end_layout
-
-\begin_layout Standard
-Автообучение происходит, если данное сообщение отвечает данным критериям.
- То есть, логично обучать класификатор HAM сообщениями, указав максимальное
- количество очков, близкое к нулю и SPAM сообщениями, указав минимальное
- число очков, близкое к срабатыванию триггера SPAM для данной метрики.
- Таким образом, классифицируемые как спам сообщения обучают класс SPAM,
- а классифицируемые как HAM (то есть, на них не сработали правила метрики)
- - обучают класс HAM.
-\end_layout
-
-\begin_layout Standard
-Пример определения классификатора:
-\end_layout
-
-\begin_layout LyX-Code
-classifier {
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-type = "winnow";
-\end_layout
-
-\begin_layout LyX-Code
-tokenizer = "osb-text";
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-statfile {
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-symbol = "WINNOW_SPAM";
-\end_layout
-
-\begin_layout LyX-Code
-path = "/tmp/test.spam";
-\end_layout
-
-\begin_layout LyX-Code
-size = 10M;
-\end_layout
-
-\begin_layout LyX-Code
-
-\end_layout
-
-\begin_layout LyX-Code
-autolearn {
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-min_mark = 10.0;
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-};
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-};
-\end_layout
-
-\begin_layout LyX-Code
-
-\end_layout
-
-\begin_layout LyX-Code
-statfile {
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-symbol = "WINNOW_HAM";
-\end_layout
-
-\begin_layout LyX-Code
-path = "/tmp/test.ham";
-\end_layout
-
-\begin_layout LyX-Code
-size = 10M;
-\end_layout
-
-\begin_layout LyX-Code
-
-\end_layout
-
-\begin_layout LyX-Code
-autolearn {
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-max_mark = 0.1;
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-};
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-};
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-};
-\end_layout
-
-\begin_layout Subsection
-Настройка синхронизации статистики
-\end_layout
-
-\begin_layout Standard
-Статистические данные можно синхронизировать между несколькими rspamd.
- Для этого используется master/slave синхронизация и бинарный лог изменений
- в статистическом файле.
- Для настройки синхронизации используются следующие параметры при определении
- статистического файла:
-\end_layout
-
-\begin_layout LyX-Code
-statfile {
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-...
-\end_layout
-
-\begin_layout LyX-Code
-binlog = "slave";
-\end_layout
-
-\begin_layout LyX-Code
-binlog_master = "somehost:11334";
-\end_layout
-
-\begin_layout LyX-Code
-...
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-};
-\end_layout
-
-\begin_layout LyX-Code
-...
-\end_layout
-
-\begin_layout LyX-Code
-statfile {
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-...
-\end_layout
-
-\begin_layout LyX-Code
-binlog = "master";
-\end_layout
-
-\begin_layout LyX-Code
-...
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-};
-\end_layout
-
-\begin_layout Standard
-При настройке slave для синхронизации указывается адрес master для данного
- файла.
- Этот адрес фактически является адресом контроллера, который сконфигурирован
- работать с данным файлом как master.
- Если rspamd настроен работать с данным файлом статистики как master, то
- создается специальный файл с таким же именем, как файл статистики, но имеющим
- суффикс .binlog.
- В данный файл записываются ревизии и изменения, внесенные в файл статистики.
- Данный файл хранит фиксированное число изменений и ротируется при переполнении.
- Синхронизация производится всеми slave хостами с промежутком от 1-й до
- 2-х минут.
- При этом, нет разницы, в каком состоянии был файл статистики на slave хосте
- - после синхронизации файл статистики на slave будет в точности совпадать
- с файлом статистики на master'е.
- Обновления файлов статистики являются инкрементальными, то есть передаются
- только изменения, а не файлы целиком.
- Синхронизация файлов статистики позволяет легко построить кластер rspamd,
- которые работают и обучаются идентично (хотя обучение должно производиться
- через контроллер мастера).
-\end_layout
-
-\begin_layout Section
-Настройка коэффициентов символов
-\end_layout
-
-\begin_layout Standard
-Для настройки коэффициентов применяется секция
-\begin_inset Quotes eld
-\end_inset
-
-factors
-\begin_inset Quotes erd
-\end_inset
-
-.
- Данная секция состоит из набора определений вида
-\end_layout
-
-\begin_layout LyX-Code
-"СИМВОЛ" = вес;
-\end_layout
-
-\begin_layout Standard
-например:
-\end_layout
-
-\begin_layout LyX-Code
-"R_UNDISC_RCPT" = 5;
-\end_layout
-
-\begin_layout LyX-Code
-"MISSING_MID" = 3;
-\end_layout
-
-\begin_layout LyX-Code
-"R_RCVD_SPAMBOTS" = 3;
-\end_layout
-
-\begin_layout LyX-Code
-"R_TO_SEEMS_AUTO" = 3;
-\end_layout
-
-\begin_layout LyX-Code
-"R_MISSING_CHARSET" = 5;
-\end_layout
-
-\begin_layout Standard
-В секции
-\begin_inset Quotes fld
-\end_inset
-
-factors
-\begin_inset Quotes frd
-\end_inset
-
- также можно задать параметр grow_factor, который задает коэффициент приращения
- при добавлении символов в метрику.
- Работает это так: допустим, добавляется первый символ - его реальный вес
- будет равен 1 * factor (то есть, если factor равен 1, то и реальный вес
- будет равен 1), после чего следующий символ будет иметь реальный вес grow_facto
-r * factor (например, если grow_factor = 1.1, то реальный вес будет 1.1 *
- factor), далее следующий будет иметь вес (1 + ((grow_factor) - 1)*2)*factor
- (то есть, при предыдущем grow_factor, реальный вес будет 1.2 * factor, следующий
- символ 1.3, затем 1.4 и.т.д.).
- Данная возможность позволяет увеличивать вес письмам, проходящим по нескольким
- правилам.
- Правила с отрицательным весом не увеличивают grow_factor и не модифицируются
- им (то есть, реальный вес таких правил равен 1 * factor).
- Пример задания параметра grow_factor:
-\end_layout
-
-\begin_layout LyX-Code
-grow_factor = 1.1;
-\end_layout
-
-\begin_layout Standard
-Также существует возможность создавать
-\begin_inset Quotes fld
-\end_inset
-
-составные
-\begin_inset Quotes frd
-\end_inset
-
- символы - символы, которые являются комбинацией других символов.
- Это нужно для возможности указывать, что комбинация определенных символов
- имеет больший (или, наоборот, меньший) вес, чем сумма весов нескольких
- символов.
- Составные символы представляют собой логические выражения из других символов,
- например:
-\end_layout
-
-\begin_layout LyX-Code
-composites {
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-COMPOSITE_SYMBOL1 =
-\begin_inset Quotes fld
-\end_inset
-
-SYMBOL1 & (SYMBOL2 | SYMBOL3)
-\begin_inset Quotes frd
-\end_inset
-
-;
-\end_layout
-
-\begin_layout LyX-Code
-COMPOSITE_SYMBOL2 =
-\begin_inset Quotes fld
-\end_inset
-
-SYMBOL3 & !SYMBOL4
-\begin_inset Quotes frd
-\end_inset
-
-;
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-};
-\end_layout
-
-\begin_layout Standard
-При добавлении составного символа все символы, входящие в него, удаляются
- из результата.
- То есть, при срабатывании COMPOSITE_SYMBOL1 из предыдущего примера символы
- SYMBOL1, SYMBOL2 и SYMBOL3 в ответе не появятся.
-\end_layout
-
-\begin_layout Section
-Представления и настройки
-\end_layout
-
-\begin_layout Subsection
-Представления
-\end_layout
-
-\begin_layout Standard
-В rspamd существует возможность настройки правил, которые будут проверяться,
- исходя из определенных критериев.
- Представления настраиваются в конфигурационном файле rspamd и позволяют
- разделить правила, исходя из входящих данных, например, заголовок From
- письма или же по ip, откуда нам пришло данное письмо.
- Представления проверяются при проверке любого правила и при совпадении
- данных письма проверяются не все символы, а те, которые заданы данным представл
-ением.
- При настройки представлений задаются входные данные письма (from и ip)
- и символы, которые должны проверяться.
- Входные данные могут дублироваться, то есть, можно задать несколько from
- и несколько ip, задаются эти параметры либо в виде регулярных выражений:
-\end_layout
-
-\begin_layout LyX-Code
-from =
-\begin_inset Quotes fld
-\end_inset
-
-/^.*@somedomain.com$
-\begin_inset Quotes frd
-\end_inset
-
-;
-\end_layout
-
-\begin_layout LyX-Code
-from =
-\begin_inset Quotes fld
-\end_inset
-
-/^.*@otherdoma[a-z]+.com$
-\begin_inset Quotes frd
-\end_inset
-
-;
-\end_layout
-
-\begin_layout Standard
-либо в виде map:
-\end_layout
-
-\begin_layout LyX-Code
-from =
-\begin_inset Quotes fld
-\end_inset
-
-file:///usr/local/etc/rspamd/from.map
-\begin_inset Quotes frd
-\end_inset
-
-;
-\end_layout
-
-\begin_layout LyX-Code
-ip =
-\begin_inset Quotes fld
-\end_inset
-
-http://somehost:81/ip.map
-\begin_inset Quotes frd
-\end_inset
-
-;
-\end_layout
-
-\begin_layout Standard
-Символы также могут быть заданы несколькими директивами symbols (которые
- будут объединены в список):
-\end_layout
-
-\begin_layout LyX-Code
-symbols =
-\begin_inset Quotes fld
-\end_inset
-
-/^.*URIBL.*$/
-\begin_inset Quotes frd
-\end_inset
-
-;
-\end_layout
-
-\begin_layout Standard
-Пример задания представления в конфигурационном файле:
-\end_layout
-
-\begin_layout LyX-Code
-view {
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-ip = "file:///usr/local/etc/rspamd/ip_internal.inc";
-\end_layout
-
-\begin_layout LyX-Code
-skip_check = yes;
-\end_layout
-
-\begin_layout LyX-Code
-from = "file:///usr/local/etc/rspamd/from_internal.inc";
-\end_layout
-
-\begin_layout LyX-Code
-symbols = "/^.*URIBL.*$/";
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-};
-\end_layout
-
-\begin_layout Standard
-Директива
-\begin_inset Quotes fld
-\end_inset
-
-skip_check
-\begin_inset Quotes frd
-\end_inset
-
- используется для пропуска всех проверок rspamd для данного представлений.
- В результате при использовании протокола rspamc 1.1 вместо маркера спама
- (True или False) будет маркер пропуска (Skip).
- При использовании spamc или же rspamc 1.0 будет стандартный маркер False
- (так как реально у письма будет 0 баллов).
-\end_layout
-
-\begin_layout Subsection
-Пользовательские настройки
-\end_layout
-
-\begin_layout Standard
-Пользовательские настройки, в отличие от представлений, дают возможность
- выбора правил, а также настройки граничных значений баллов письма, исходя
- из получателя письма.
- При этом, настройки можно задавать индивидуально пользователю или же всему
- домену пользователя.
- Индивидуальные настройки пользователя перекрывают настройки домена.
- При выборе настроек используются следующие данные (учитывая последовательность)
-:
-\end_layout
-
-\begin_layout Enumerate
-проверяется заголовок Deliver-To, передаваемый при использовании протокола
- rspamc;
-\end_layout
-
-\begin_layout Enumerate
-проверяется заголовок User, передаваемый MTA exim при использовании любого
- протокола;
-\end_layout
-
-\begin_layout Enumerate
-проверяется первый получатель письма из заголовка rspamc Rcpt;
-\end_layout
-
-\begin_layout Enumerate
-проверяется первый получатель письма из заголовка mime To.
-\end_layout
-
-\begin_layout Standard
-Необходимо обратить внимание , что при наличии нескольких получателей, будет
- проверяться только первый из них, чтобы избегать двусмысленного поведения.
- Сами настройки задаются в json файлах, так как данные файлы могут содержать
- очень много информации о пользователях, и хранить это все в конфигурационном
- файле нецелесообразно.
- Для задания пользовательских настроек используется секция
-\begin_inset Quotes fld
-\end_inset
-
-settings
-\begin_inset Quotes frd
-\end_inset
-
-, которая содержит всего два параметра: user_settings и domain_settings.
- Например:
-\end_layout
-
-\begin_layout LyX-Code
-settings {
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-user_settings = "http://somehost/users.php";
-\end_layout
-
-\begin_layout LyX-Code
-domain_settings = "http://somehost/domains.php";
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-};
-\end_layout
-
-\begin_layout Standard
-Формат соответствующих json файлов достаточно прост - это массив объектов,
- задающих настройки.
- Объект настройки содержит следующие параметры:
-\end_layout
-
-\begin_layout Itemize
-name - имя пользователя или домена;
-\end_layout
-
-\begin_layout Itemize
-metrics - объект, задающий предельные очки по метрикам, вида
-\begin_inset Quotes fld
-\end_inset
-
-metric_name
-\begin_inset Quotes frd
-\end_inset
-
- -> score;
-\end_layout
-
-\begin_layout Itemize
-factors - объект, задающий индивидуальные настройки множителей вида
-\begin_inset Quotes fld
-\end_inset
-
-symbol
-\begin_inset Quotes frd
-\end_inset
-
- -> score;
-\end_layout
-
-\begin_layout Itemize
-want_spam - булево значение, при задании его как true, rspamd отключает
- проверки для данного пользователя.
-\end_layout
-
-\begin_layout Standard
-Пример json настроек:
-\end_layout
-
-\begin_layout LyX-Code
-[
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-{
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-"name":"somedomain.ru",
-\end_layout
-
-\begin_layout LyX-Code
-"metrics":{"default":11},
-\end_layout
-
-\begin_layout LyX-Code
-"factors":{"R_FUZZY":10.1},
-\end_layout
-
-\begin_layout LyX-Code
-"want_spam":false
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-},
-\end_layout
-
-\begin_layout LyX-Code
-{
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-"name":"some.other.domain.com",
-\end_layout
-
-\begin_layout LyX-Code
-"metrics":{"default":5.5},
-\end_layout
-
-\begin_layout LyX-Code
-"factors":{"URIBL":20.3},
-\end_layout
-
-\begin_layout LyX-Code
-"want_spam":false
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-}
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-]
-\end_layout
-
-\begin_layout Standard
-Файлы настроек перезагружаются по мере обновления, как и любые другие файлы
- списков.
-\end_layout
-
-\begin_layout Chapter
-Настройка модулей
-\end_layout
-
-\begin_layout Section
-Настройка модуля surbl
-\end_layout
-
-\begin_layout Standard
-Модуль surbl служит для проверки URL'ей в письме на различных
-\begin_inset Quotes eld
-\end_inset
-
-черных
-\begin_inset Quotes erd
-\end_inset
-
- списках.
- Модуль делает следующее: для каждого из url, найденных в сообщении, извлекает
- доменный компонент (2-го или 3-го уровня), добавляет суффикс имени surbl
- и делает dns запрос.
- При успешном определении такого имени добавляется символ.
- Пример работы:
-\end_layout
-
-\begin_layout LyX-Code
-URL (http://some.test.ru/index.html) -> test.ru + (insecure-bl.rambler.ru) ->
-\end_layout
-
-\begin_layout LyX-Code
-resolve test.ru.insecure-bl.rambler.ru -> 127.0.0.1 -> add symbol
-\end_layout
-
-\begin_layout Standard
-Параметры настройки:
-\end_layout
-
-\begin_layout LyX-Code
-.module 'surbl' {
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
- # Определение суффикса SURBL
-\end_layout
-
-\begin_layout LyX-Code
- # Символы '%b' заменяются на значение определенного бита
-\end_layout
-
-\begin_layout LyX-Code
- suffix_%b_SURBL_MULTI = "multi.surbl.org";
-\end_layout
-
-\begin_layout LyX-Code
-
-\end_layout
-
-\begin_layout LyX-Code
- # Суффикс для каждого из бит
-\end_layout
-
-\begin_layout LyX-Code
- bit_2 = "SC"; # sc.surbl.org
-\end_layout
-
-\begin_layout LyX-Code
- bit_4 = "WS"; # ws.surbl.org
-\end_layout
-
-\begin_layout LyX-Code
- bit_8 = "PH"; # ph.surbl.org
-\end_layout
-
-\begin_layout LyX-Code
- bit_16 = "OB"; # ob.surbl.org
-\end_layout
-
-\begin_layout LyX-Code
- bit_32 = "AB"; # ab.surbl.org
-\end_layout
-
-\begin_layout LyX-Code
- bit_64 = "JP"; # jp.surbl.org
-\end_layout
-
-\begin_layout LyX-Code
-
-\end_layout
-
-\begin_layout LyX-Code
- # Имя метрики
-\end_layout
-
-\begin_layout LyX-Code
- metric = "default";
-\end_layout
-
-\begin_layout LyX-Code
- # Список доменов, для которых необходимо использовать 3 доменных
-\end_layout
-
-\begin_layout LyX-Code
- # компонента, вместо двух
-\end_layout
-
-\begin_layout LyX-Code
- 2tld = "file:///etc/rspamd/2tld.inc";
-\end_layout
-
-\begin_layout LyX-Code
- # Список URL'ей, которые не будут проверяться этим модулем
-\end_layout
-
-\begin_layout LyX-Code
- whitelist = "file:///etc/rspamd/surbl-whitelist.inc";
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-};
-\end_layout
-
-\begin_layout Standard
-Некоторые пояснения по данной конфигурации.
- Модуль SURBL может осуществлять проверку битов в полученном от DNS сервера
- ответе, и вставлять соответствующий символ.
- Это используется для проверки сразу нескольких списков одним DNS запросе.
- Тогда ответ сервера содержит списки, в которых встретился данный URL в
- виде битов адреса.
- Более подробно с этим можно ознакомиться тут:
-\begin_inset CommandInset href
-LatexCommand href
-name "http://www.surbl.org/lists.html#multi"
-target "http://www.surbl.org/lists.html#multi"
-
-\end_inset
-
-.
- Список 2tld используется для задания списка доменов, для которых необходимо
- проверять не два уровня доменного имени, а три.
- Например, это актуально для виртуальных хостингов или же специальных зон
- для доменов третьего уровня, например org.ru или pp.ru.
-\end_layout
-
-\begin_layout Section
-Настройка модуля regexp
-\end_layout
-
-\begin_layout Standard
-Модуль regexp является очень важным в работе rspamd, так как определяет
- все правила фильтрации сообщений по регулярным выражениям.
- Модуль работает с логическими выражениями из регулярных выражений, поэтому
- его настройка выглядит достаточно запутанной.
- Однако, если пользоваться переменными, то логика работы становится более
- понятной.
- При настройке самого модуля используются простые директивы вида:
-\end_layout
-
-\begin_layout Code
-ИМЯ_СИМВОЛА = "логическое выражение"
-\end_layout
-
-\begin_layout Standard
-Само логическое выражение содержит различные регулярные выражения и функции,
- объединенные символами логики:
-\end_layout
-
-\begin_layout Itemize
-& - логическое
-\begin_inset Quotes eld
-\end_inset
-
-\begin_inset Quotes erd
-\end_inset
-
-
-\end_layout
-
-\begin_layout Itemize
-| - логическое
-\begin_inset Quotes eld
-\end_inset
-
-ИЛИ
-\begin_inset Quotes erd
-\end_inset
-
-
-\end_layout
-
-\begin_layout Itemize
-! - логическое отрицание
-\end_layout
-
-\begin_layout Standard
-Приоритет операций может изменяться скобками, например:
-\end_layout
-
-\begin_layout LyX-Code
-A & B | C - выполняется слева направо A & B затем | C
-\end_layout
-
-\begin_layout LyX-Code
-A & (B | C) - выполняется как (B | C) затем & A
-\end_layout
-
-\begin_layout Standard
-Сами регулярные выражения совместимы с perl regular expressions.
- Их синтаксис можно изучить в соответствующей литературе:
-\begin_inset CommandInset href
-LatexCommand href
-name "http://perldoc.perl.org/perlre.html"
-target "http://perldoc.perl.org/perlre.html"
-
-\end_inset
-
-.
- У rspamd есть дополнительные флаги, определяющие, в какой части сообщения
- искать заданное регулярное выражение:
-\end_layout
-
-\begin_layout Itemize
-r - "сырой" незакодированный в utf8 regexp
-\end_layout
-
-\begin_layout Itemize
-H - ищет по заголовкам сообщения
-\end_layout
-
-\begin_layout Itemize
-M - ищет по всему сообщению (в "сыром" виде, то есть без mime декодинга)
-
-\end_layout
-
-\begin_layout Itemize
-P - ищет по всем текстовым mime частям
-\end_layout
-
-\begin_layout Itemize
-U - ищет по url
-\end_layout
-
-\begin_layout Itemize
-X - ищет по "сырым" хедерам (опять же без декодирования)
-\end_layout
-
-\begin_layout Standard
-Если в регулярном выражении встречаются символы двойной кавычки (
-\begin_inset Quotes eld
-\end_inset
-
-) или же слэша (/), то их необходимо экранировать обратным слэшем (при этом
- сам обратный слэш экранировать необязательно):
-\end_layout
-
-\begin_layout LyX-Code
-
-\backslash
-"
-\backslash
-/
-\end_layout
-
-\begin_layout Standard
-Для поиска по заголовкам формат регулярного выражения несколько меняется:
-\end_layout
-
-\begin_layout LyX-Code
-Имя_заголовка=/регулярное_выражение/H
-\end_layout
-
-\begin_layout Standard
-При поиске по заголовкам происходит поиск заголовков с таким именем и сравнение
- их значений с регулярным выражением, пока это выражение не будет найдено,
- либо пока не будут проверены все заголовки с таким именем.
- Для multipart сообщений происходит поиск заголовков по всем частям сообщения.
- Это справедливо для всех функций, работающих с заголовками.
- Поиск по
-\begin_inset Quotes eld
-\end_inset
-
-сырым
-\begin_inset Quotes erd
-\end_inset
-
- заголовкам происходит без учета mime частей - только по заголовкам самого
- сообщения.
- При этом, хотя и не происходит декодирования заголовков, но происходит
- их де-фолдинг (фолдинг - перенос заголовков по строчкам).
- Модуль regexp также может использовать внутри логических выражений встроенные
- функции rspamd.
- Встроенные функции всегда возвращат логическое значение (истина или ложь)
- и могут принимать аргументы (в том числе аргументы, являющиеся логическими
- выражениями).
- Список встроенных функций:
-\end_layout
-
-\begin_layout Itemize
-header_exists - принимает в качестве аргумента имя хедера, возвращает true,
- если такой заголовок существует
-\end_layout
-
-\begin_layout Itemize
-compare_parts_distance - принимает в качестве аргумента число от 0 до 100,
- которое отражает разницу в процентах между частями письма.
- Функция работает с сообщениями, содержащими 2 текстовые части (text/plain
- и text/html) и возвращает true тогда, когда эти части различаются более
- чем на n процентов.
- Если аргумент не указан, то по умолчанию ищется различие в 100% (полностью
- разные части).
-\end_layout
-
-\begin_layout Itemize
-compare_transfer_encoding - сравнивает Content-Transfer-Encoding с заданной
- строкой
-\end_layout
-
-\begin_layout Itemize
-content_type_compare_param - сравнивает параметр content-type заголовка
- с регулярным выражением или строкой:
-\end_layout
-
-\begin_layout LyX-Code
-content_type_compare_param(Charset, /windows-
-\backslash
-d+/)
-\end_layout
-
-\begin_layout LyX-Code
-content_type_compare_param(Charset, ascii)
-\end_layout
-
-\begin_layout Itemize
-content_type_has_param - проверяет, есть ли в заголовке content-type определенны
-й параметр
-\end_layout
-
-\begin_layout Itemize
-content_type_is_subtype - сравнивает подтип content-type с регулярным выражением
- или строкой
-\end_layout
-
-\begin_layout Itemize
-content_type_is_type - сравнивает тип content-type с регулярным выражением
- или строкой
-\end_layout
-
-\begin_layout LyX-Code
-content_type_is_type(text)
-\end_layout
-
-\begin_layout LyX-Code
-content_type_is_subtype(/?.html/)
-\end_layout
-
-\begin_layout Itemize
-regexp_match_number - принимает в качестве первого параметра число, которое
- означает порог сработавших регэкспов и список регэкспов или функций, которые
- должны проверяться.
- Если число сработавших регэкспов или функций больше порога, функция возвращает
- TRUE, иначе - FALSE, например:
-\end_layout
-
-\begin_layout LyX-Code
-regexp_match_number(2, ${__RE1}, ${__RE2}, header_exists(Subject))
-\end_layout
-
-\begin_layout Itemize
-has_only_html_part - функция возвращает TRUE, если в сообщении есть только
- одна HTML часть
-\end_layout
-
-\begin_layout Itemize
-compare_recipients_distance - вычисляет процент схожих получателей письма.
- Принимает аргумент - порог в процентах похожести.
-
-\end_layout
-
-\begin_layout Itemize
-is_recipients_sorted - возвращает TRUE, если список получателей сортирован
- (работает только если число получателей >= 5).
-
-\end_layout
-
-\begin_layout Itemize
-is_html_balanced - возвращает TRUE, если теги всех html частей сбалансированы
-
-\end_layout
-
-\begin_layout Itemize
-has_html_tag - возвращает TRUE, если заданный html тег найден
-\end_layout
-
-\begin_layout Standard
-Данные функции были созданы для решения задач, которые сложно или же невозможно
- решить при помощи обычных регулярных выражений.
- При конфигурации модуля regexp целесообразно определить все логические
- выражения в отдельных переменных, подключить их при помощи директивы .include
- и задавать символы как:
-\end_layout
-
-\begin_layout LyX-Code
-СИМВОЛ="${переменная}";
-\end_layout
-
-\begin_layout Standard
-иначе конфигурация модуля будет практически нечитаемой из-за обилия регулярных
- выражений.
-\end_layout
-
-\begin_layout Section
-Настройка модуля spf
-\end_layout
-
-\begin_layout Standard
-Модуль spf предназначен для проверки spf записей для отправителя письма.
- Технология SPF позволяет определить в DNS TXT запись для данного домена
- с определениями, с каких ip адресов или сетей допустима отправка почты
- для данного домена.
- Также spf позволяет создавать
-\begin_inset Quotes fld
-\end_inset
-
-черные списки
-\begin_inset Quotes frd
-\end_inset
-
- для данного домена - адреса, с которых запрещена отправка почты для домена.
- Rspamd может получать spf записи, и проверять, возможна ли отправка почты
- данного домена с данного ip.
- При этом возможно добавление 3-х символов:
-\end_layout
-
-\begin_layout Itemize
-FAIL - отправка запрещена
-\end_layout
-
-\begin_layout Itemize
-SOFTFAIL - отправка явно не разрешена, но и явно не запрещена
-\end_layout
-
-\begin_layout Itemize
-ALLOW - отправка явно разрешена
-\end_layout
-
-\begin_layout Standard
-Для задания этих символов можно использовать настройки модуля spf:
-\end_layout
-
-\begin_layout LyX-Code
-.module 'spf' {
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-symbol_fail = "SPF_FAIL";
-\end_layout
-
-\begin_layout LyX-Code
-symbol_softfail = "SPF_SOFTFAIL";
-\end_layout
-
-\begin_layout LyX-Code
-symbol_allow = "SPF_ALLOW";
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-};
-\end_layout
-
-\begin_layout Standard
-Коэффициенты для данных символов лучше определить следующим образом: высокий
- вес для символа FAIL, достаточно низкий вес для символа SOFTFAIL и отрицательны
-й вес для символа ALLOW.
-\end_layout
-
-\begin_layout Chapter
-Cтатистические алгоритмы
-\end_layout
-
-\begin_layout Section
-Winnow и OSB
-\end_layout
-
-\begin_layout Standard
-В rspamd используется алгоритм ортогональных разреженных биграмм (OSB),
- который основан на следующем принципе:
-\end_layout
-
-\begin_layout Code
-\begin_inset listings
-inline false
-status open
-
-\begin_layout Quotation
-
-\end_layout
-
-\begin_layout Quotation
-
-\end_layout
-
-\begin_layout Quotation
-
- н -----------------------------------
-\end_layout
-
-\begin_layout Quotation
-
- а -----------------------------------
-\end_layout
-
-\begin_layout Quotation
-
- б -----------------------------------
-\end_layout
-
-\begin_layout Quotation
-
- о | w1 | w2 | w3 | w4 | w5 |
-\end_layout
-
-\begin_layout Quotation
-
- р | | | | | | --> выходные токены
-\end_layout
-
-\begin_layout Quotation
-
- ы -----------------------------------
-\end_layout
-
-\begin_layout Quotation
-
- / Текущий набор хешей и весов
-\end_layout
-
-\begin_layout Quotation
-
- /
-\end_layout
-
-\begin_layout Quotation
-
-Входные токены
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Standard
-То есть, процесс преобразования можно представить следующим образом: для
- каждого набора весов (w1..w5) составляется набор хешей.
- Токены образуются из текста.
- Например, возьмем некое письмо и наложим на него окно:
-\end_layout
-
-\begin_layout LyX-Code
-"Мама мыла раму."
-\end_layout
-
-\begin_layout LyX-Code
-|________|
-\end_layout
-
-\begin_layout Standard
-В данном окне создаются 2 токена:
-\end_layout
-
-\begin_layout Standard
-h("Мама"), h("мыла"), где h - хеш функция.
-\end_layout
-
-\begin_layout Standard
-Дальше окно двигается вправо на один токен и опять создаются 2 токена: h("мыла")
-, h("раму")
-\end_layout
-
-\begin_layout Standard
-В rspamd используется окно в 5 токенов и используются пары:
-\end_layout
-
-\begin_layout LyX-Code
-1 - 5 -- h1
-\end_layout
-
-\begin_layout LyX-Code
-2 - 5 -- h2
-\end_layout
-
-\begin_layout LyX-Code
-3 - 5 -- h3
-\end_layout
-
-\begin_layout LyX-Code
-4 - 5 -- h4
-\end_layout
-
-\begin_layout Standard
-Каждый такой токен состоит из двух хешей (h1 и h2).
- То есть каждое слово текста может давать до 5-ти токенов.
- Это делается для того, чтобы в статистических алгоритмах учитывать не индивидуа
-льные слова, и их сочетания, чтобы уменьшить ошибку.
-\end_layout
-
-\begin_layout Standard
-После этого мы должны вычислить принадлежность потока выходных токенов к
- некоторому классу.
- Для этого используется алгоритм Winnow.
- Идея алгоритма очень проста:
-\end_layout
-
-\begin_layout Enumerate
-Каждый возможный входной токен имеет вес 1.0 (то есть, нас интересуют только
- те токены, которые не равны 1.0)
-\end_layout
-
-\begin_layout Enumerate
-Для обучения проделываем следующие шаги:
-\end_layout
-
-\begin_deeper
-\begin_layout Enumerate
-генерируем набор токенов путем OSB алгоритма
-\end_layout
-
-\begin_layout Enumerate
-удаляем все дупликаты
-\end_layout
-
-\begin_layout Enumerate
-если данный входной набор принадлежит классу (например, спам или неспам),
- то умножаем вес каждого встреченного токена на т.н.
- Promotion Constant, которая равна 1,23
-\end_layout
-
-\begin_layout Enumerate
-если данный входной набор не принадлежит классу, то умножаем каждый найденный
- токен на Demotion Constant в данном классе, которая равна 0,83
-\end_layout
-
-\begin_layout Enumerate
-абсолютно неважно, сколько раз встречался данный токен во входном потоке,
- мы его умножаем на promotion или demotion только один раз
-\end_layout
-
-\end_deeper
-\begin_layout Enumerate
-Для классификации потока мы поступаем следующим образом:
-\end_layout
-
-\begin_deeper
-\begin_layout Enumerate
-генерируем набор токенов путем OSB алгоритма
-\end_layout
-
-\begin_layout Enumerate
-удаляем все дупликаты
-\end_layout
-
-\begin_layout Enumerate
-суммируем веса всех токенов, найденных в каждом из файлов данных статистики
- (при этом те токены, которые мы не нашли, имеют вес 1)
-\end_layout
-
-\begin_layout Enumerate
-затем мы делим полученную сумму на число токенов и смотрим, какой из классов
- (файлов данных) набрал больше очков и делаем заключение о принадлежности
- входного текста к классу
-\end_layout
-
-\end_deeper
-\begin_layout Standard
-Файлы данных статистики представляют собой следующие структуры:
-\end_layout
-
-\begin_layout LyX-Code
-{
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-Header,
-\end_layout
-
-\begin_layout LyX-Code
-{ feature_block1..feature_blockN }
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-}
-\end_layout
-
-\begin_layout Standard
-Заголовок файла очень прост:
-\end_layout
-
-\begin_layout LyX-Code
-struct {
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-char magic[3] = { 'r', 's', 'd' };
-\end_layout
-
-\begin_layout LyX-Code
-u_char version[2] = { '1', '0' };
-\end_layout
-
-\begin_layout LyX-Code
-uint64_t create_time;
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-}
-\end_layout
-
-\begin_layout Standard
-Каждый feature_block состоит из 4-х полей:
-\end_layout
-
-\begin_layout LyX-Code
-struct {
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-uint32_t hash1;
-\end_layout
-
-\begin_layout LyX-Code
-uint32_t hash2;
-\end_layout
-
-\begin_layout LyX-Code
-double value;
-\end_layout
-
-\begin_layout LyX-Code
-uint32_t last_access;
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-}
-\end_layout
-
-\begin_layout Standard
-Итого 16 байт на каждый feature.
- 0-е значения показывают свободную ячейку.
- Значение hash1 используется в качестве индекса:
-\end_layout
-
-\begin_layout LyX-Code
-idx = hash1 % filesize;
-\end_layout
-
-\begin_layout Standard
-Где filesize - размер в количестве feature_block'ов.
- При этом данный токен должен помещаться в заданную ячейку или ячейку за
- ним.
- При этом образуется цепочка токенов:
-\end_layout
-
-\begin_layout Standard
-\begin_inset listings
-inline false
-status open
-
-\begin_layout Plain Layout
-
-idx
-\end_layout
-
-\begin_layout Plain Layout
-
-
-\backslash
-
-\end_layout
-
-\begin_layout Plain Layout
-
-| занят | занят | занят | свободен |
-\end_layout
-
-\begin_layout Plain Layout
-
-
-\backslash
------^
-\backslash
------^
-\backslash
------^
-\end_layout
-
-\end_inset
-
-При этом, длина такой цепочки должна быть лимитирована некоторым разумным
- числом, например 128.
- Тогда максимальное время доступа будет не более 128-и итераций.
- Если мы не нашли за 128 итераций свободную ячейку, то мы можем поместить
- новый токен на место того, который меньше всего использовался (min (last_access
-)).
- При этом при доступе к ячейке необходимо обновлять last_access:
-\end_layout
-
-\begin_layout Code
-last_access = now - creation_time.
-
-\end_layout
-
-\begin_layout Standard
-Такая организация позволяет замещать только наименее используемые токены.
-\end_layout
-
-\begin_layout Chapter
-Протокол rspamc
-\end_layout
-
-\begin_layout Standard
-Формат запроса схож с http:
-\end_layout
-
-\begin_layout LyX-Code
-COMMAND RSPAMC/1.0
-\end_layout
-
-\begin_layout Standard
-При этом допустимы следующие команды:
-\end_layout
-
-\begin_layout Itemize
-CHECK - проверить сообщение и выдать результат по каждой из метрик (не выводя
- символов)
-\end_layout
-
-\begin_layout Itemize
-SYMBOLS - проверить сообщение, выдать результат по каждой из метрик и символы
- по каждой из метрик
-\end_layout
-
-\begin_layout Itemize
-PROCESS - проверить сообщение, выдать результат по каждой из метрик, а затем
- вывести исходное сообщение
-\end_layout
-
-\begin_layout Itemize
-PING - не принимая сообщение выдать готовность к работе
-\end_layout
-
-\begin_layout Standard
-Также в зависимости от подключенных плагинов могут быть доступны другие
- команды протокола, например URLS (вывести все найденные в сообщении url'и)
- или EMAILS.
-\end_layout
-
-\begin_layout Standard
-Формат ответа:
-\end_layout
-
-\begin_layout LyX-Code
-SPAMD/1.1 0 EX_OK
-\end_layout
-
-\begin_layout LyX-Code
-
-\backslash
- /
-\backslash
-/
-\end_layout
-
-\begin_layout LyX-Code
-Версия Код ошибки
-\end_layout
-
-\begin_layout LyX-Code
-Spam: False ; 2 / 5
-\end_layout
-
-\begin_layout Standard
-Это формат совместимости с sa-spamd (без метрик).
- Новый формат ответа:
-\end_layout
-
-\begin_layout LyX-Code
-RSPAMD/1.0 0 EX_OK
-\end_layout
-
-\begin_layout LyX-Code
-Metric: Name; Spam_Result; Spam_Mark / Spam_Mark_Required
-\end_layout
-
-\begin_layout LyX-Code
-Metric: Name2 ; Spam_Result2 ; Spam_Mark2 / Spam_Mark_Required2
-\end_layout
-
-\begin_layout Standard
-Заголовков типа metric может быть несколько.
- Формат вывода символов:
-\end_layout
-
-\begin_layout LyX-Code
-SYMBOL1, SYMBOL2, SYMBOL3 -- формат совместимости с sa-spamd
-\end_layout
-
-\begin_layout LyX-Code
-Symbol: Name; Param1,Param2,Param3 -- формат rspamd
-\end_layout
-
-\begin_layout Standard
-Формат ответа зависит от формата запроса:
-\end_layout
-
-\begin_layout LyX-Code
-PROCESS SPAMC/1.2
-\end_layout
-
-\begin_layout LyX-Code
-
-\backslash
- /
-\backslash
- /
-\end_layout
-
-\begin_layout LyX-Code
-Команда Версия
-\end_layout
-
-\begin_layout Standard
-В любом из режимов работы поддерживаются следующие заголовки:
-\end_layout
-
-\begin_layout Itemize
-Content-Length - длина сообщения
-\end_layout
-
-\begin_layout Itemize
-Helo - HELO, полученный от клиента
-\end_layout
-
-\begin_layout Itemize
-From - MAIL FROM
-\end_layout
-
-\begin_layout Itemize
-IP - IP клиента
-\end_layout
-
-\begin_layout Itemize
-Recipient-Number - число реципиентов
-\end_layout
-
-\begin_layout Itemize
-Rcpt - реципиент
-\end_layout
-
-\begin_layout Itemize
-Queue-ID - идентификатор очереди
-\end_layout
-
-\begin_layout Standard
-Эти значения могут использоваться в фильтрах rspamd.
-\end_layout
-
-\begin_layout Chapter
-Клиент rspamc
-\end_layout
-
-\begin_layout Standard
-Клиент rspamc представляет собой программу, написанную на perl и предназначенную
- для работы с системой rspamd.
- Rspamc принимает следующие аргументы:
-\end_layout
-
-\begin_layout Itemize
--с: определяет путь к конфигурационному файлу rspamd, используется для работы
- с локальным rspamd
-\end_layout
-
-\begin_layout Itemize
--h: определяет адрес удаленного rspamd сервера
-\end_layout
-
-\begin_layout Itemize
--p: определяет порт для удаленного rspamd сервера
-\end_layout
-
-\begin_layout Itemize
--P: определяет пароль для работы с привиллегированными командами rspamd
-\end_layout
-
-\begin_layout Itemize
--s: определяет имя символа для обучения классификатора
-\end_layout
-
-\begin_layout Standard
-Последним аргументом rspamc принимает команду.
- Если команда не задана, то используется команда SYMBOLS.
- Команды, принимаемые rspamc:
-\end_layout
-
-\begin_layout Itemize
-команды по обработке сообщений:
-\end_layout
-
-\begin_deeper
-\begin_layout Itemize
-symbols - по данной команде проверяется сообщение, переданное через stdin
- rspamc
-\end_layout
-
-\begin_layout Itemize
-check - по данной команде выводится только результат по метрикам без символов
-\end_layout
-
-\begin_layout Itemize
-process - возвращает не только символы, но и исходное сообщение
-\end_layout
-
-\begin_layout Itemize
-urls - выводит все найденные url'и
-\end_layout
-
-\begin_layout Itemize
-emails - выводит все найденные адреса e-mail в сообщении
-\end_layout
-
-\end_deeper
-\begin_layout Itemize
-команды по работе с управляющим интерфейсом
-\end_layout
-
-\begin_deeper
-\begin_layout Itemize
-stat - выводит статистику работы
-\end_layout
-
-\begin_layout Itemize
-learn - обучает классификатор по определенному классу (указанному опцией
- -s)
-\end_layout
-
-\begin_layout Itemize
-shutdown - останавливает систему rspamd
-\end_layout
-
-\begin_layout Itemize
-uptime - выводит время работы rspamd
-\end_layout
-
-\begin_layout Itemize
-counters - выводит значения счетчиков символов
-\end_layout
-
-\begin_layout Itemize
-fuzzy_add - добавляет fuzzy hash в хранилище
-\end_layout
-
-\begin_layout Itemize
-fuzzy_del - удаляет fuzzy hash из хранилища
-\end_layout
-
-\end_deeper
-\begin_layout Chapter
-LUA API плагинов
-\end_layout
-
-\begin_layout Standard
-Rspamd позволяет реализовывать различную логику в виде lua плагинов, для
- чего используется директива modules.
- Данная директива позволяет задавать пути к каталогам, содержащим скрипты
- на lua:
-\end_layout
-
-\begin_layout LyX-Code
-modules {
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-module_path =
-\begin_inset Quotes fld
-\end_inset
-
-/some/path/
-\begin_inset Quotes frd
-\end_inset
-
-;
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-};
-\end_layout
-
-\begin_layout Standard
-При инициализации rspamd загружает все файлы вида *.lua и выполняет их (при
- ошибке в коде плагинов rspamd запускаться не будет, выдавая ошибку конфигурации
-, при указанной опции -t будет проверяться не только синтаксис конфигурационного
- файла, но и синтаксис плагинов).
- При этом, определяется глобальная переменная rspamd_config, позволяющая
- извлекать опции конфигурации и регистрировать правила и соответствующие
- им символы.
- Таким образом, каждый lua плагин условно можно разделить на две части:
- исполняемый код, выполняющий настройку опций модуля, регистрирующий функции
- правил (callbacks), и собственно обработчики правил.
-
-\end_layout
-
-\begin_layout Section
-Настройка lua модуля
-\end_layout
-
-\begin_layout Standard
-Для извлечения параметров конфигурации и регистрации обработчиков правил
- применяется глобальная переменная rspamd_config, которая обладает рядом
- полезных методов:
-\end_layout
-
-\begin_layout Itemize
-get_module_opt (module_name, option_name) - возвращает значение опции option_nam
-e для модуля с именем module_name.
- То есть, если в конфигурационном файле есть следующая запись:
-\end_layout
-
-\begin_layout LyX-Code
-module 'test' {
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-param =
-\begin_inset Quotes fld
-\end_inset
-
-value
-\begin_inset Quotes frd
-\end_inset
-
-;
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-};
-\end_layout
-
-\begin_deeper
-\begin_layout Standard
-То вызов rspamd_config:get_module_opt('test', 'param') вернет строку 'value';
-\end_layout
-
-\end_deeper
-\begin_layout Itemize
-get_all_opts (module_name) - возвращает таблицу из всех опций для данного
- модуля, ключом служит имя опции:
-\end_layout
-
-\begin_layout LyX-Code
-local opts = rspamd_config:get_all_opts('test')
-\end_layout
-
-\begin_layout LyX-Code
-if opts then
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-var = opts['param']
-\end_layout
-
-\begin_layout LyX-Code
-for k,v in pairs opts do
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-print (
-\begin_inset Quotes fld
-\end_inset
-
-Param:
-\begin_inset Quotes frd
-\end_inset
-
- ..
- k ..
-
-\begin_inset Quotes fld
-\end_inset
-
- Value:
-\begin_inset Quotes frd
-\end_inset
-
- ..
- v)
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-end
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-end
-\end_layout
-
-\begin_layout Itemize
-get_metric (name) - возвращает объект метрики с данным именем
-\end_layout
-
-\begin_layout Itemize
-register_function(name, callback) - регистрирует функцию lua для использования
- в логических выражениях rspamd, callback в данном случае - строка с именем
- функции, пример применения:
-\end_layout
-
-\begin_layout LyX-Code
-function some_func(task, arg1, arg2)
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-return false
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-end
-\end_layout
-
-\begin_layout LyX-Code
-rspamd_config:register_function('lua_func', 'some_func')
-\end_layout
-
-\begin_layout Standard
-Объект метрики используется для регистрации символов:
-\end_layout
-
-\begin_layout Itemize
-register_symbol (symbol, initial_weight, callback) - symbol определяет имя
- символа, initial_weight - изначальный вес, callback - строка с именем функции:
-\end_layout
-
-\begin_layout LyX-Code
-local m = rspamd_config:get_metric('default')
-\end_layout
-
-\begin_layout LyX-Code
-if m then
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-m:register_symbol('TEST', 1.0, 'some_callback')
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-end
-\end_layout
-
-\begin_layout Standard
-После регистрации обработчика символа этот обработчик будет вызываться rspamd
- обычным образом, используя планировщик символов (это подробно описано в
- 3.2).
-\end_layout
-
-\begin_layout Section
-Обработчик правила
-\end_layout
-
-\begin_layout Standard
-Обработчик правила - это функция, реализующая логику правила.
- В качестве параметра она принимает объект task, из которого можно извлечь
- различную информацию о сообщении.
- После выполнения логики работы обработчик может вставить символ, используя
- тот же объект task.
- Таким образом типичная функция-обработчик выглядит следующим образом:
-\end_layout
-
-\begin_layout LyX-Code
-function some_callback(task)
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-if some_condition(task) then
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-task:insert_result(metric, symbol, 1)
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-end
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-end
-\end_layout
-
-\begin_layout Standard
-Функция insert_result принимает в качестве параметров имя метрики, имя символа,
- вес и необязательный список строковых параметров, которые будут ассоциированы
- с этим символом.
- Объект task предоставляет ряд функций, позволяющих создать логику правила
- фильтрации:
-\end_layout
-
-\begin_layout Itemize
-get_received_headers() - возвращает массив из обработанных заголовков Received
- в виде таблицы:
-\end_layout
-
-\begin_deeper
-\begin_layout Itemize
-h['from_hostname'] - hostname, откуда получено сообщение
-\end_layout
-
-\begin_layout Itemize
-h['from_ip'] - ip, откуда получено сообщение
-\end_layout
-
-\begin_layout Itemize
-h['real_hostname'] - hostname, распознанное самим релеем
-\end_layout
-
-\begin_layout Itemize
-h['real_ip'] - ip, который соответствует real_hostname
-\end_layout
-
-\begin_layout Itemize
-h['by_hostname'] - hostname самого релея
-\end_layout
-
-\begin_layout Standard
-received заголовки в массиве идут в обратном порядке, то есть, первые релеи
- письма будут первыми элементами массива
-\end_layout
-
-\end_deeper
-\begin_layout Itemize
-get_raw_headers() - возвращает строку, содержащую все заголовки сообщения
- в неразобранном виде
-\end_layout
-
-\begin_layout Itemize
-get_text_parts() - возвращает массив объектов типа text_part
-\end_layout
-
-\begin_layout Itemize
-get_urls() - возвращает массив строк, содержащих извлеченные из сообщения
- URL'и
-\end_layout
-
-\begin_layout Itemize
-get_message() - возвращает объект типа сообщение
-\end_layout
-
-\begin_layout Itemize
-get_recipients() - возвращает массив получателей письма, переданных в ходе
- smtp диалога (командами RCPT TO:)
-\end_layout
-
-\begin_layout Itemize
-get_from() - возвращает адрес отправителя письма, переданных в ходе smtp
- диалога (команда MAIL FROM:)
-\end_layout
-
-\begin_layout Itemize
-get_helo() - возвращает значение HELO
-\end_layout
-
-\begin_layout Itemize
-get_from_ip() - возвращает ip адрес, откуда нам пришло данное письмо
-\end_layout
-
-\begin_layout Standard
-Объект
-\begin_inset Quotes fld
-\end_inset
-
-message
-\begin_inset Quotes frd
-\end_inset
-
- применяется для манипуляций с заголовками:
-\end_layout
-
-\begin_layout Itemize
-get_header(headername) - возвращает массив всех значений заголовков с таким
- именем (может быть массив из одного элемента, если такой заголовок в сообщении
- представлен единожды)
-\end_layout
-
-\begin_layout Itemize
-set_header(headername, headervalue) - устанавливает заданный заголовок
-\end_layout
-
-\begin_layout Standard
-Объект text_part предназначен для манипуляций с текстовым содержимым сообщения:
-\end_layout
-
-\begin_layout Itemize
-get_content() - возвращает текстовое содержимое части
-\end_layout
-
-\begin_layout Itemize
-is_html() - возвращает true, если данная часть представляет собой HTML
-\end_layout
-
-\begin_layout Itemize
-is_empty() - возвращает true, если данная часть не содержит текста
-\end_layout
-
-\begin_layout Itemize
-get_fuzzy() - возвращает строку с нечетким хешем для данного сообщения
-\end_layout
-
-\begin_layout Standard
-Пример функции-обработчика:
-\end_layout
-
-\begin_layout LyX-Code
-function received_cb (task)
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-local recvh = task:get_received_headers()
-\end_layout
-
-\begin_layout LyX-Code
-for _,rh in ipairs(recvh) do
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-if rh['real_ip'] then
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-local parts = task:get_text_parts()
-\end_layout
-
-\begin_layout LyX-Code
-for _,part in ipairs(parts) do
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-if not part:is_empty() then
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-local text = part:get_content()
-\end_layout
-
-\begin_layout LyX-Code
-if some_filter(text) then
-\end_layout
-
-\begin_layout LyX-Code
-task:insert_result(metric, symbol, 1)
-\end_layout
-
-\begin_layout LyX-Code
-end
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-end
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-end
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-end
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-end
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-end
-\end_layout
-
-\begin_layout Section
-Использование DNS
-\end_layout
-
-\begin_layout Standard
-Для многих задач фильтрации сообщений используются различные DNS запросы,
- поэтому lua интерфейс предоставляет возможность планирования DNS запросов,
- используя объект task:
-\end_layout
-
-\begin_layout Itemize
-resolve_dns_a(host, callback) - выполняет прямое преобразование имени host,
- после чего вызывает обработчик callback
-\end_layout
-
-\begin_layout Itemize
-resolve_dns_ptr(ip, callback) - то же, что и предыдущее, но выполняет обратное
- преобразование ip
-\end_layout
-
-\begin_layout Standard
-Так как DNS преобразования осуществляются асинхронно, то необходимо задавать
- обработчик, который будет вызываться по завершению DNS запроса.
- Обработчик имеет следующий вид:
-\end_layout
-
-\begin_layout LyX-Code
-function dns_cb(task, to_resolve, results, err)
-\end_layout
-
-\begin_layout Itemize
-task - объект task
-\end_layout
-
-\begin_layout Itemize
-to_resolve - строка, содержащая имя хоста или ip, для которого выполнялось
- преобразование
-\end_layout
-
-\begin_layout Itemize
-results - массив, содержащий ip адреса (для прямого преобразования) или
- же имя хоста (для обратного).
- В случае ошибки этот параметр имеет значение nil
-\end_layout
-
-\begin_layout Itemize
-err - строка, описывающая ошибку (или nil, если преобразование успешно завершило
-сь)
-\end_layout
-
-\begin_layout Standard
-Пример функции-обработчика результатов DNS запроса:
-\end_layout
-
-\begin_layout LyX-Code
-function dns_cb(task, to_resolve, results, err)
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-if results then
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-local _,_,rbl = string.find(to_resolve, '%d+
-\backslash
-.%d+
-\backslash
-.%d+
-\backslash
-.%d+
-\backslash
-.(.+)')
-\end_layout
-
-\begin_layout LyX-Code
-task:insert_result(metric, symbol, 1, rbl)
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-end
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-end
-\end_layout
-
-\begin_layout Section
-Использование файлов-списков
-\end_layout
-
-\begin_layout Standard
-В lua плагинах можно задавать и использовать файлы списков, как это описано
- в п.
- 4.1.
- Это полезно, когда в lua необходимо использовать некоторые данные, которые
- бы асинхронно обновлялись в процессе работы rspamd.
- API по работе со списками сожержит следующие функции:
-\end_layout
-
-\begin_layout Itemize
-rspamd_config:add_radix_map (string) - добавляет определение списка, содержащего
- ip адреса и сети.
- При удачном добавлении возвращается объект типа rspamd_radix, который может
- использоваться в обработчиках символов для определения наличия в каком-либо
- списке заданного ip;
-\end_layout
-
-\begin_layout Itemize
-rspamd_config:add_hash_map (string) - добавляет определение списка строк
- (доменов), при успешном добавлении возвращает объект типа rspamd_hash.
-\end_layout
-
-\begin_layout Standard
-Использовать списки целесообразно в функциях-обработчкиках, так как сразу
- же после добавления эти списки могут оказаться пустыми.
- Объекты, возвращаемые функциями, регистрирующими файлы списков, имеют метод
- get_key, позволяющий определить наличие какого-либо элемента в списке.
- Для списков ip адресов этот объект принимает целое число, для списка строк
- - строку.
- Простой пример использования списков.
-\end_layout
-
-\begin_layout Standard
-Регистрация:
-\end_layout
-
-\begin_layout LyX-Code
-local radix_list = nil
-\end_layout
-
-\begin_layout LyX-Code
-local host_list = nil
-\end_layout
-
-\begin_layout LyX-Code
-radix_list = rspamd_config:add_radix_map ('http://somehost/ip.list')
-\end_layout
-
-\begin_layout LyX-Code
-host_list = rspamd_config:add_hash_map ('http://otherhost/host.list')
-\end_layout
-
-\begin_layout Standard
-Использование в обработчике символа:
-\end_layout
-
-\begin_layout LyX-Code
-function check_whitelist (task)
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
--- check client's ip
-\end_layout
-
-\begin_layout LyX-Code
-local ipn = task:get_from_ip_num()
-\end_layout
-
-\begin_layout LyX-Code
-if ipn and radix_list then
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-local key = radix_list:get_key(ipn)
-\end_layout
-
-\begin_layout LyX-Code
-if key then
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-task:insert_result(metric, symbol_ip, 1)
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-end
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-end
-\end_layout
-
-\begin_layout LyX-Code
-
-\end_layout
-
-\begin_layout LyX-Code
--- check client's from domain
-\end_layout
-
-\begin_layout LyX-Code
-local from = task:get_from()
-\end_layout
-
-\begin_layout LyX-Code
-if from and host_list then
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
--- extract domain part
-\end_layout
-
-\begin_layout LyX-Code
-local _,_,domain = string.find(from, '@(.+)>?$')
-\end_layout
-
-\begin_layout LyX-Code
-local key = host_list:get_key(domain)
-\end_layout
-
-\begin_layout LyX-Code
-if key then
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-task:insert_result(metric, symbol_from, 1)
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-end
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-end
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-end
-\end_layout
-
-\begin_layout Chapter
-Perl API rspamd
-\end_layout
-
-\begin_layout Standard
-Для обработки сообщений системой rspamd было создано простое perl api для
- проверки сообщений системой rspamd и обучения системы rspamd.
- Данное API содержится в модуле Mail::Rspamd::Client.
- Использование API достаточно тривиально:
-\end_layout
-
-\begin_layout LyX-Code
-#!/usr/bin/perl -w
-\end_layout
-
-\begin_layout LyX-Code
-
-\end_layout
-
-\begin_layout LyX-Code
-use Mail::Rspamd::Client;
-\end_layout
-
-\begin_layout LyX-Code
-
-\end_layout
-
-\begin_layout LyX-Code
-my $testmsg;
-\end_layout
-
-\begin_layout LyX-Code
-while (<>) {
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-$testmsg .= $_;
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-}
-\end_layout
-
-\begin_layout LyX-Code
-my $client = new Mail::Rspamd::Client(
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-{
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-port => 11333,
-\end_layout
-
-\begin_layout LyX-Code
-hosts => ['localhost:11333',],
-\end_layout
-
-\begin_layout LyX-Code
-ip => '127.0.0.1'
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-}
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-);
-\end_layout
-
-\begin_layout LyX-Code
-
-\end_layout
-
-\begin_layout LyX-Code
-if ($client->ping()) {
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-print "Ping is ok
-\backslash
-n";
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-}
-\end_layout
-
-\begin_layout LyX-Code
-my $result = $client->check($testmsg);
-\end_layout
-
-\begin_layout LyX-Code
-
-\end_layout
-
-\begin_layout LyX-Code
-if ($result && $result->{'default'}->{'isspam'} eq 'True') {
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-print "spam
-\backslash
-n";
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-} else {
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-print "ham
-\backslash
-n";
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-}
-\end_layout
-
-\begin_layout Standard
-Результаты обработки сообщения возвращаются в виде ссылки на хеш, который
- индексирован по метрикам.
- Каждая из метрик, в свою очередь, также является ссылкой на хеш, содержащий
- поля:
-\end_layout
-
-\begin_layout Itemize
-isspam - строка 'True' или 'False'
-\end_layout
-
-\begin_layout Itemize
-score - вес сообщения
-\end_layout
-
-\begin_layout Itemize
-threshold - предельный вес данной метрики
-\end_layout
-
-\begin_layout Itemize
-symbols - массив символов для данного сообщения
-\end_layout
-
-\begin_layout Standard
-Модуль имеет внутреннюю логику работы с несколькими серверами rspamd, выбирая
- каждый раз случайный сервер, а также помечая долго не работающие сервера,
- исключая их из списка активных на некоторое время.
- При создании Mail::Rspamd::Client также можно указать параметр from (значение
- SMTP команды mail from), параметр rcpt (массив SMTP команд rcpt to) и user
- (авторизированный пользователь SMTP).
- Полный список параметров:
-\end_layout
-
-\begin_layout Itemize
-username - имя пользователя (строка)
-\end_layout
-
-\begin_layout Itemize
-ip - ip адрес, с которого пришло сообщение (строка)
-\end_layout
-
-\begin_layout Itemize
-subject - тема письма (для не mime сообщений)
-\end_layout
-
-\begin_layout Itemize
-timeout - время ожидания в секундах (число)
-\end_layout
-
-\begin_layout Itemize
-password - пароль для команд котроллера (строка)
-\end_layout
-
-\begin_layout Itemize
-statfile - имя символа файла статистики для обучения (строка)
-\end_layout
-
-\begin_layout Itemize
-weight - вес сообщения для команд fuzzy_add и learn (число)
-\end_layout
-
-\begin_layout Itemize
-imap_search - строка поиска по IMAP (строка)
-\end_layout
-
-\begin_layout Standard
-Для выполнения команды на всех серверах используется команда do_all_cmd,
- возвращающая хеш вида host => %results.
-
-\end_layout
-
-\begin_layout Chapter
-Использование HTTP Redirector
-\end_layout
-
-\begin_layout Standard
-HTTP редиректор представляет собой утилиту, которая умеет проверять различные
- способы HTTP редиректов и выдавать реальный URL для любого заданного.
- Данная утилита предназначена для проверки URL'ей вида tinyurl.com, youfrog.com
- и прочих сервисов
-\begin_inset Quotes fld
-\end_inset
-
-коротких
-\begin_inset Quotes frd
-\end_inset
-
- URL'ей.
- HTTP редиректор работает как обычный HTTP сервер и принимает стандартные
- запросы вида:
-\end_layout
-
-\begin_layout LyX-Code
-GET /url_to_resolve HTTP/1.0
-\end_layout
-
-\begin_layout LyX-Code
-
-\end_layout
-
-\begin_layout Standard
-Для работы URL редиректор требует ряд perl модулей:
-\end_layout
-
-\begin_layout Itemize
-HTTP::Request - обработка HTTP запросов;
-\end_layout
-
-\begin_layout Itemize
-POE (Component::Server::TCP Filter::HTTPD Component::Client::HTTP) - для
- асинхронной обработки соединений;
-\end_layout
-
-\begin_layout Itemize
-HTML::HeadParser - для парсинга HTTP заголовков;
-\end_layout
-
-\begin_layout Itemize
-SWF::Element - для обработки SWF (adobe flash) редиректов;
-\end_layout
-
-\begin_layout Itemize
-Cache::Memcached::Fast - для хранения кеша URL'ей;
-\end_layout
-
-\begin_layout Itemize
-Digest::SHA256 - для индексации хеша;
-\end_layout
-
-\begin_layout Itemize
-Proc::Daemon, Proc::PidUtil - для демонизации и управления процессом;
-\end_layout
-
-\begin_layout Itemize
-URI::Escape - для нормализации URL'ей.
-\end_layout
-
-\begin_layout Standard
-Настройка утилиты осуществляется правкой скрипта rspamd-redirector, конфигурацио
-нные параметры находятся в хеше %cfg:
-\end_layout
-
-\begin_layout LyX-Code
-our %cfg = (
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-port => 8080, # Порт для приема соединений
-\end_layout
-
-\begin_layout LyX-Code
-max_size => 102400, # Максимальный размер принимаемых
- данных
-\end_layout
-
-\begin_layout LyX-Code
-http_timeout => 5, # Таймаут соединений (секунды)
-\end_layout
-
-\begin_layout LyX-Code
-max_rec => 5, # Максимум подзапросов
-\end_layout
-
-\begin_layout LyX-Code
-pidfile => '/var/run/rspamd/redirector.pid',# Путь до файла pid'а
-\end_layout
-
-\begin_layout LyX-Code
-logfile => '/var/log/rspamd-redirector.log',# Путь до log файла
-\end_layout
-
-\begin_layout LyX-Code
-do_log => 0, # Включить логирование запросов
-\end_layout
-
-\begin_layout LyX-Code
-debug => 0, # Включить отладочную информацию
-\end_layout
-
-\begin_layout LyX-Code
-memcached_servers => # Сервера кеша URL'ей
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-[
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-{ address => 'localhost:11211', weight => 2.5 },
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-],
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-digest_bits => 256, # Число бит в ключе кеша
-\end_layout
-
-\begin_layout LyX-Code
-cache_expire => 3600, # Время в секундах хранения
- записи кеша
-\end_layout
-
-\begin_layout LyX-Code
-user => '@RSPAMD_USER@', # Пользователь
-\end_layout
-
-\begin_layout LyX-Code
-group => '@RSPAMD_GROUP@', # Группа
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-);
-\end_layout
-
-\begin_layout Standard
-Для работы с redirector'ом необходимо учитывать следующее: при определенни
- редиректа rspamd-redirector делает полноценный http запрос, то есть, если
- мы будем пытаться разрешить запросы с различными GET параметрами в URL
- (например http://some_evil_host/unsubscribe?email=good@email.com), то тем
- самым можем занести
-\begin_inset Quotes fld
-\end_inset
-
-хорошие
-\begin_inset Quotes frd
-\end_inset
-
- адреса в списки спамеров.
- Кроме этого, появляется возможность организовать атаку на некоторый http
- сервер, послав много писем, содержащих его адрес.
- Поэтому проверять редиректы можно только у проверенных доменов.
- Для этого используются настройки модуля surbl в самом rspamd (так как именно
- модуль surbl отвечает за работу с редиректором):
-\end_layout
-
-\begin_layout LyX-Code
-.module 'surbl' {
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-...
-\end_layout
-
-\begin_layout LyX-Code
-redirector = "localhost:8080";
-\end_layout
-
-\begin_layout LyX-Code
-# Connect timeout for redirector
-\end_layout
-
-\begin_layout LyX-Code
-redirector_connect_timeout = "1s";
-\end_layout
-
-\begin_layout LyX-Code
-# IO timeout for redirector
-\end_layout
-
-\begin_layout LyX-Code
-redirector_read_timeout = "10s";
-\end_layout
-
-\begin_layout LyX-Code
-# Maps for hosts that should be checked with redirector
-\end_layout
-
-\begin_layout LyX-Code
-redirector_hosts_map = "http://some_host/redirector.hosts";
-\end_layout
-
-\begin_layout LyX-Code
-...
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-};
-\end_layout
-
-\begin_layout Standard
-При этом список redirector_hosts_map содержит домены, которые будут перед
- проверкой по surbl листам проверяться на наличие редиректов (то есть, именно
- в том виде, что будет при surbl запросе - 2 или 3 компонента имени хоста).
- Кеш URL'ей обязателен для работы редиректора, так как в противном случае
- массовая рассылка с одинаковым URL'ем приведет к большому числу http запросов.
- Кроме этого, кеш URL'ей существенно ускоряет работу редиректора.
- Лог файл редиректора позволяет увидеть, какие редиректы были распознаны
- и их тип: HTTP редирект, HTML редирект (тег meta refresh), JavaScript редирект
- (location = ...), SWF редирект или же кешированный редирект (найденный в memcached
-).
- Взаимодействие с редиректором возможно не только из rspamd, но и из любого
- другого приложения, работающего по HTTP протоколу.
-\end_layout
-
-\begin_layout Chapter
-Хранилище нечетких хешей
-\end_layout
-
-\begin_layout Standard
-Нечеткий хеш (fuzzy hash) отличается от обычного тем, что при небольшом
- изменении в исходном тексте, он также меняется незначительно.
- Традиционный (криптографический) хеш в таком случае меняется сильно.
- Эта особенность позволяет использовать нечеткие хеши для определения степени
- похожести текстов (у похожих текстов будут похожие нечеткие хеши).
- Эта операция является более быстрой, чем сравнение текстов, кроме этого,
- нечеткие хеши можно хранить, сравнивая с ними впоследствие полученные сообщения.
- В rspamd есть возможность использования хранилища нечетких хешей для проверки
- сообщений.
- При этом считаются хеши всех текстовых частей сообщения, а затем эти хеши
- проверяются на наличие в хранилище (с определенным процентом ошибки).
- Для хранилища хешей создается специальный процесс fuzzy, который работает
- с рабочим процессом rspamd по UDP протоколу.
- Несколько хранилищ создают общее хранилище хешей, каждый из элементов которого
- содержит часть хешей.
- При добавлении или удалении нового хранилища в общее хранилище, все данные
- хешей теряются (возможно, это будет устранено в будущем).
- При проверке хеша выбирается одно из хранилищ (соответственно хешу) и на
- него шлется запрос.
- При записи хеша выбирается то же самое хранилище, что и при проверке.
- Запись и удаление хеша из общего хранилища обеспечивается командами fuzzy_add
- и fuzzy_del на любом из контроллеров, использующих данное хранилище.
- Это можно делать, например, используя клиент rspamc:
-\end_layout
-
-\begin_layout LyX-Code
-rspamc fuzzy_add < message_to_add.eml
-\end_layout
-
-\begin_layout LyX-Code
-rspamd fuzzy_del < message_to_del.eml
-\end_layout
-
-\begin_layout Standard
-Настройка хранилища обеспечивается созданием записи для процесса fuzzy storage:
-\end_layout
-
-\begin_layout LyX-Code
-worker {
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-type = "fuzzy";
-\end_layout
-
-\begin_layout LyX-Code
-# Bind socket for fuzzy interface
-\end_layout
-
-\begin_layout LyX-Code
-bind_socket = *:11335;
-\end_layout
-
-\begin_layout LyX-Code
-count = 1;
-\end_layout
-
-\begin_layout LyX-Code
-# Path to filesystem storage
-\end_layout
-
-\begin_layout LyX-Code
-hashfile = "/tmp/fuzzy.db";
-\end_layout
-
-\begin_layout LyX-Code
-# Expire time for hashes in storage (h - for hours, d - for days)
-\end_layout
-
-\begin_layout LyX-Code
-expire = "10d";
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-};
-\end_layout
-
-\begin_layout Standard
-Для увеличения производительности хранилища можно заменить нечеткий поиск
- на поиск точного соответствия, а также установкой libJudy (
-\begin_inset CommandInset href
-LatexCommand href
-name "judy arrays"
-target "http://judy.sourceforge.net"
-
-\end_inset
-
-).
- После этого необходимо пересобрать rspamd (libJudy обнаруживается автоматически
-) и указать в настройках fuzzy worker'а параметр:
-\end_layout
-
-\begin_layout LyX-Code
-use_judy = "yes";
-\end_layout
-
-\begin_layout Standard
-Настройка hashfile используется для указания файла, в который периодически
- будут записываться полученные в хранилище хеши (частота синхронизации с
- файлом зависит от интенсивности модификаций в хранилище, также синхронизация
- происходит при завершении процесса fuzzy storage).
- Для настройки клиентской части хранилища используется модуль fuzzy_check:
-\end_layout
-
-\begin_layout LyX-Code
-.module 'fuzzy_check' {
-\end_layout
-
-\begin_deeper
-\begin_layout LyX-Code
-metric = "default";
-\end_layout
-
-\begin_layout LyX-Code
-symbol = "R_FUZZY";
-\end_layout
-
-\begin_layout LyX-Code
-# List of fuzzy storage servers, separated by ',' or ';' or simple by spaces
-
-\end_layout
-
-\begin_layout LyX-Code
-servers = "localhost:11335;some_host:11335";
-\end_layout
-
-\end_deeper
-\begin_layout LyX-Code
-};
-\end_layout
-
-\begin_layout Standard
-После настройки клиентской части с указанными серверами начинает работать
- как рабочий процесс (для проверки сообщений), так и контроллер (для записи/удал
-ения хешей из хранилища).
-
-\end_layout
-
-\begin_layout Chapter
-CGI интерфейс rspamd
-\end_layout
-
-\begin_layout Standard
-Rspamd имеет простой интерфейс для управления кластером серверов при помощи
- веб браузера.
- Интерфейс позволяет выполнять основные команды (проверка сообщений, обучение
- rspamd, операции с fuzzy хешами, статистика) на выбранных серверах.
- Для передачи сообщения rspamd используется либо поле текстового ввода,
- либо непосредственная загрузка файла.
- Если используется поле текстового ввода и сообщение вводится в него без
- mime заголовков (например, для обучения), то интерфейс автоматически вставляет
- заголовки по умолчанию и передает составленное таким образом сообщение
- для обработки rspamd.
- Запуск CGI интерфейса возможен двумя способами: как standalone сервера
- и как cgi скрипта.
- Первый способ подходит для тестовой работы или же для использования в один
- поток.
- Второй способ лишен этиго недостатка, но требует наличия настроенного веб
- сервера.
- Для работы с rspamd используется модуль Mail::Rspamd::Client, описанный
- ранее.
- Аргументы запуска CGI интерфейса:
-\end_layout
-
-\begin_layout Itemize
--standalone - запуск в виде standalone http сервера
-\end_layout
-
-\begin_layout Itemize
--port - порт для запуска
-\end_layout
-
-\begin_layout Itemize
--host - имя хоста для запуска standalone сервера
-\end_layout
-
-\begin_layout Itemize
--cfg - имя файла, содержащего список серверов, с которыми будет работать
- CGI интерфейс
-\end_layout
-
-\end_body
-\end_document