Rspamd 4.0.0: экономия памяти, новый протокол и важный шаг миграции

Платформа для фильтрации спама с открытым исходным кодом Rspamd выпустила версию 4.0.0, представив фундаментальные изменения в своей инфраструктуре: протокол сканирования, модель памяти, хранилище хэшей и систему конфигурации. Некоторые изменения являются критическими, и для обновления как минимум один шаг требует миграции.

Новый протокол сканирования

В релизе представлена конечная точка /checkv3, которая заменяет HTTP-заголовки структурированными JSON или msgpack для передачи метаданных. Новый эндпоинт использует multipart/form-data для запросов и multipart/mixed для ответов, поддерживает сжатие zstd для каждой части, включает опциональную часть для переписанных сообщений и применяет поэлементную запись writev с нулевым копированием для вывода ответов. Администраторы могут активировать новый протокол с помощью флагов rspamc --protocol-v3 или rspamc --msgpack.

Предыдущий протокол остаётся доступным.

Fasttext становится встроенным и сокращает использование памяти

Ранее Rspamd зависела от внешней библиотеки libfasttext на C++. Версия 4 устраняет эту зависимость, заменяя её встроенным решением на основе mmap, которое загружает данные модели в общую память для всех рабочих процессов. Это изменение убирает копии данных модели в куче для каждого воркера, что, по оценкам проекта, экономит от 500 МБ до 7 ГБ оперативной памяти в развёртываниях с несколькими воркерами, в зависимости от размера модели. Существующие файлы моделей .bin и .ftz продолжают работать без изменений.

Опция сборки ENABLE_FASTTEXT удалена; поддержка Fasttext теперь всегда встроена. Сборщикам пакетов необходимо удалить зависимость от внешней библиотеки libfasttext.

Нечёткие хэши получают множественные флаги

Ранее сохранённый нечёткий хэш нёс только один флаг. Версия 4 позволяет одному дайджесту одновременно содержать до восьми флагов, так что несколько правил обнаружения могут независимо срабатывать на один и тот же хэш без дублирования записи в хранилище. Логика обновления Redis была переписана на Lua с использованием EVALSHA и восстановлением NOSCRIPT.

Релиз также вводит символ HTML_FUZZY_PHISHING. Он активируется, когда HTML-шаблон совпадает с известным фишинговым шаблоном, но встроенные домены различаются, что нацелено на фишинговые кампании, повторно использующие структуру шаблона, заменяя только ссылки.

Сетевой протокол переходит на эпоху 12 и сохраняет обратную совместимость. Флаг с наибольшим значением занимает основной слот.

Кольцевой хэш заменяет Jump Hash

Rspamd применял Jump Hash для консистентного хеширования при работе с шардированными байесовскими хранилищами. В версии 4 его заменили на Ring Hash (Ketama) с виртуальными узлами. При использовании Ring Hash при отказе одного из узлов перераспределяется лишь примерно 1/n ключей, а при восстановлении узла ключи возвращаются на свои исходные шарды.

Это изменение является критическим для администраторов, использующих байесовскую фильтрацию на пользователя с шардированным Redis. После обновления существующие данные окажутся на неверных шардах. Проект требует от администраторов выполнить команду rspamadm statistics_dump migrate перед обновлением. Развёртывания с одним сервером не затрагиваются.

Добавлена встроенная поддержка HTTPS

Воркеры теперь могут обслуживать HTTPS напрямую, без обратного прокси перед ними. SSL определяется автоматически из конфигурации сокета привязки. Предыдущая опция воркера ssl = true удалена; администраторам следует убрать её из конфигураций и добавить суффикс ssl к строкам привязки.

Балансировка нагрузки по методу токенов становится стандартной

Балансировка нагрузки для прокси-апстримов по умолчанию меняется с простого циклического перебора на метод токенов. Алгоритм принимает настраиваемые параметры max_tokens, scale и base_cost для обработки всплесков трафика. Администраторы, желающие вернуть циклический перебор, могут удалить ключ token_bucket из конфигурации прокси-апстрима.

Шаблонизация Jinja2 для файлов конфигурации

Файлы конфигурации теперь предварительно обрабатываются движком шаблонов Lupa, совместимым с Jinja2, перед парсингом UCL. Переменные окружения с префиксом RSPAMD_ доступны внутри шаблонов в таблице env. В системе шаблонизации используются изменённые разделители ({= =} для выражений, {% %} для управляющих структур), чтобы избежать конфликтов с синтаксисом UCL. Фильтры валидации, включая mandatory, require_int и require_json, прерывают запуск при неверных входных данных, что призвано поддержать контейнерные развёртывания, настраивающие Rspamd через переменные окружения.

Прочие добавления и исправления

Rspamd 4 добавляет встроенную генерацию UUID v7 для каждой задачи сканирования, синхронизированную с заголовком Log-Tag и поддержкой колонки UUID v7 в ClickHouse. Байесовский классификатор получает поддержку многоклассовой классификации, позволяя обучать классификаторы произвольным категориям, а не только бинарным "спам/не спам". Интерфейс обучения в WebUI обновлён соответствующим образом.

Компиляция Hyperscan переведена на асинхронный Lua-бэкенд с общим кешем на базе Redis, доступным для всех процессов и узлов. Устранены несколько ситуаций использования памяти после её освобождения при обработке кеша Hyperscan во время динамической перезагрузки конфигурации.

В данной версии правила SenderScore RBL по умолчанию отключены. Проект отмечает, что для работы этих правил требуется аккаунт MyValidity, и ранее они возвращали результат "заблокировано" для всех незарегистрированных IP-адресов. Операторам с зарегистрированными аккаунтами необходимо явно повторно включить эти правила.

В парсинге PDF исправлены проблемы с декодированием ASCII85, подстановкой лигатур и обходом проверок через дополнение объектов. Обработка неизвестных и некорректных ключей DKIM обновлена в соответствии с поведением, описанным в RFC. Устранена утечка памяти в пути RSA при подписании DKIM, а также обход криптополитики для подписей DKIM с SHA-1 в RHEL/CentOS 10.
Также в этом выпуске исправлены использование памяти после освобождения в нечётких UDP-сессиях и бесконечный цикл загрузки процессора в нечётком TCP-клиенте.

Rspamd доступен для бесплатной загрузки на GitHub.

Обязательно к прочтению:

  • 40 инструментов с открытым исходным кодом, меняющих подход команд безопасности к защите стека
  • Время и стоимость сканирования прошивок, а также где команды запускают EMBA

Подпишитесь на ежемесячную рассылку Help Net Security без рекламы, чтобы быть в курсе самых важных инструментов кибербезопасности с открытым исходным кодом. Подписаться можно здесь!