Глава 3. Общие принципы работы
Прежде чем приступать к настройке rspamd необходимо понять основные принципы функционирования системы.
3.1 Планирование и запуск рабочих процессов
При запуске rspamd происходят следующие действия:
- Запускается главный процесс (rspamd main)
- Инициализируются конфигурационные параметры по умолчанию
- Читаются параметры командной строки
- Настраивается журналирование ошибок в терминал
- Читается и парсится конфигурационный файл
- Инициализируются модули
- Модули читают свои конфигурационные параметры
- Устанавливаются лимиты
- Настраивается журналирование, указанное в конфигурационном файле
- Происходит демонизация (если не указан флаг -f)
- Настраивается обработка сигналов головным процессом
- Записывается PID-файл
- Инициализируются lua плагины
- Инициализируется подсистема событий и mime парсер
- Загружается кеш символов
- Порождаются рабочие процессы (сброс привиллегий осуществляется сразу же после вызова fork)
- Начинается цикл обработки сигналов
Головной процесс rspamd реагирует на следующие сигналы:
SIGTERM - послать всем рабочим процессам SIGTERM, дождаться их завершения и выйти
SIGINT - то же, что и SIGTERM
SIGHUP - переинициализировать журналирование и породить новые рабочие процессы, завершив старые (при этом, существующие рабочие процессы завершают работу, обработав уже полученные соединения)
SIGCHLD - головной процесс получает этот сигнал при завершении работы рабочего процесса. Если рабочий процесс завершился некорректно, то планируется его перезапуск через 2 секунды.
SIGUSR2 - приходит от рабочего процесса, когда тот успешно инициализируется
SIGALARM - сигнализирует о необходимости запуска рабочего процесса, который был запланирован после получения SIGCHLD
Таким образом, головной процесс отвечает за инициализацию, конфигурацию, работу с PID-файлом, работу с журналированием, а также за порождение рабочих процессов. В ходе работы головной процесс постоянно следит за работой рабочих процессов и обеспечивает перезапуск некорректно завершившихся рабочих процессов. Для ротации файлов журналирования рабочему процессу необходимо послать сигнал SIGHUP.
3.2 Логика обработки сообщений
Инициализация рабочего процесса предельно проста: происходит переинициализация libevent, а также инициализация DNS resolver'а. После этого рабочий процесс устанавливает обработчик готовности к чтению слушающего сокета (этот сокет создается в головном процессе и передается рабочему процессу как параметр). При готовности к чтению на слущающем сокете рабочий процесс создает новый объект типа worker_task и делается accept на слушающем сокете. После этого rspamd обрабатывает протокол rspamc (или же spamc) и читает сообщение. После окончания получения сообщения rspamd декодирует его содержимое и начинает обработку. Для более простого изложения принципов работы rspamd необходимо описать некоторые понятия:
Символ - это правило фильтрации rspamd, например, некоторое регулярное выражение или же запрос к DNS или же любое другое действие. Символ имеет собственный вес и имя. Таким образом, символ можно считать результатом работы одного правила фильтрации. Если это правило сработало, то оно добавляет символ с определенным весом и атрибутами, если нет, то символ не добавляется.
Метрика - это набор логически связанных правил и связанных с ними символов. Такая группа имеет свой предел очков, после набора которых сообщение считается по этой метрике спамом. Очки формируются после подсчета весов символов, добавленных в метрику (при этом, разумеется, несработавшие правила символов не добавляют и их вес равен нулю) и обработки этих весов функцией консолидации. По умолчанию такой функцией является функция-факторизатор, которая просто считает вес каждого символа равным константе, заданной в конфигурационном файле для этого символа, например, следующие параметры в конфигурационном файле задают вес символа MIME_HTML_ONLY равный одному, а вес символа FAKE_HTML - восьми:
MIME_HTML_ONLY = 1;
FAKE_HTML = 8;
• Модуль - это набор правил rspamd, который обеспечивает общие проверки. Например, модуль проверки регулярных выражений или модуль проверки URL'ей по "черным" спискам. Модули также могут быть написаны на языке LUA. Каждый модуль регистрирует символы, соответствующие сконфигурированным в нем правилам, в таблице символов заданной метрики (или метрики по умолчанию "default").
• Таблица символов метрики - это таблица, хранящая данные о зарегистрированных символах, таблица отсортирована, чтобы обеспечить проверку самых "удобных" правил в первую очередь. Критерий "удобности" составляется из трех составляющих: веса правила, частоты его срабатывания и времени его выполнения. Чем больше вес, частота срабатывания и меньше время выполнения, тем раньше будет проверено это правило.
• Классификатор - это алгоритм, обеспечивающий определение принадлежности сообщения к какому-либо классу. Класс определяется символом (например символ SPAM, имеющий вес 5 и символ HAM, имеющий вес -5). Принадлежность к классу обеспечивается либо статистически, путем разбора текста сообщения на токены и сравнения с известными токенами, хранящимися на диске в виде файла токенов (statfile), либо же иным алгоритмом (например, нейросетью). В результате работы классификатора определяется соответствие сообщения какому-либо классу и добавления соответствующего этому классу символа. Классификатор отличается от обычного модуля тем, что он не просто проверяет какие-либо характеристики сообщения, а сравнивает содержание сообщения с известными ему наборами. То есть, классификатор для его работы необходимо обучать на различных наборах. В настоящее время в rspamd реализован алгоритм классификации winnow и разбора на токены OSB. О них будет написано в дальнейшем.
Обработка осуществляется по следующей логике:
• для каждой метрики выбирается таблица символов и выбираются по очереди символы (по степени "удобности")
• для каждого символа вызывается соответствующее правило
• после вызова очередного правила проверяется, не превысил ли результат метрики порогового результата
• при превышении порога сообщение считается по этой метрике спамом и больше символов из этой метрики не проверяется
• для сообщения проверяется принадлежность к какому-либо классу для корректировки результата
• после определения принадлежности к классу происходит окончательный пересчет очков по метрике и при совпадении критериев автообучения происходит автообучение классификатора.
После обработки сообщений для каждой из метрик выводится результат. Если используется протокол spamc, то считается только метрика "default", а дополнительные метрики добавляются как заголовки вида X-Spam-Status: metric; result. Для протокола rspamc выводятся результаты всех метрик, что позволяет настраивать различные группы правил и осуществлять фильтрацию сообщений не только как spam/ham, а задавать различные критерии оценки.
Читать далее:
Глава 6. Cтатистические алгоритмы

Виджеты МойРамблер
Почтовый антиспам
Почтовый хостинг
Авторизация Rambler-ID
Perl-модули![(please configure the [header_logo] section in trac.ini)](/trac/antispam/chrome/site/your_project_logo.png)