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

В релизе представлена конечная точка /checkv3, которая заменяет HTTP-заголовки структурированными JSON или msgpack для передачи метаданных. Новый эндпоинт использует multipart/form-data для запросов и multipart/mixed для ответов, поддерживает сжатие zstd для каждой части, включает опциональную часть для переписанных сообщений и применяет поэлементную запись writev с нулевым копированием для вывода ответов. Администраторы могут активировать новый протокол с помощью флагов rspamc --protocol-v3 или rspamc --msgpack.
Предыдущий протокол остаётся доступным.
Ранее Rspamd зависела от внешней библиотеки libfasttext на C++. Версия 4 устраняет эту зависимость, заменяя её встроенным решением на основе mmap, которое загружает данные модели в общую память для всех рабочих процессов. Это изменение убирает копии данных модели в куче для каждого воркера, что, по оценкам проекта, экономит от 500 МБ до 7 ГБ оперативной памяти в развёртываниях с несколькими воркерами, в зависимости от размера модели. Существующие файлы моделей .bin и .ftz продолжают работать без изменений.
Опция сборки ENABLE_FASTTEXT удалена; поддержка Fasttext теперь всегда встроена. Сборщикам пакетов необходимо удалить зависимость от внешней библиотеки libfasttext.
Ранее сохранённый нечёткий хэш нёс только один флаг. Версия 4 позволяет одному дайджесту одновременно содержать до восьми флагов, так что несколько правил обнаружения могут независимо срабатывать на один и тот же хэш без дублирования записи в хранилище. Логика обновления Redis была переписана на Lua с использованием EVALSHA и восстановлением NOSCRIPT.
Релиз также вводит символ HTML_FUZZY_PHISHING. Он активируется, когда HTML-шаблон совпадает с известным фишинговым шаблоном, но встроенные домены различаются, что нацелено на фишинговые кампании, повторно использующие структуру шаблона, заменяя только ссылки.
Сетевой протокол переходит на эпоху 12 и сохраняет обратную совместимость. Флаг с наибольшим значением занимает основной слот.
Rspamd применял Jump Hash для консистентного хеширования при работе с шардированными байесовскими хранилищами. В версии 4 его заменили на Ring Hash (Ketama) с виртуальными узлами. При использовании Ring Hash при отказе одного из узлов перераспределяется лишь примерно 1/n ключей, а при восстановлении узла ключи возвращаются на свои исходные шарды.
Это изменение является критическим для администраторов, использующих байесовскую фильтрацию на пользователя с шардированным Redis. После обновления существующие данные окажутся на неверных шардах. Проект требует от администраторов выполнить команду rspamadm statistics_dump migrate перед обновлением. Развёртывания с одним сервером не затрагиваются.
Воркеры теперь могут обслуживать HTTPS напрямую, без обратного прокси перед ними. SSL определяется автоматически из конфигурации сокета привязки. Предыдущая опция воркера ssl = true удалена; администраторам следует убрать её из конфигураций и добавить суффикс ssl к строкам привязки.
Балансировка нагрузки для прокси-апстримов по умолчанию меняется с простого циклического перебора на метод токенов. Алгоритм принимает настраиваемые параметры max_tokens, scale и base_cost для обработки всплесков трафика. Администраторы, желающие вернуть циклический перебор, могут удалить ключ token_bucket из конфигурации прокси-апстрима.
Файлы конфигурации теперь предварительно обрабатываются движком шаблонов 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.

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

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