Система фильтрации спама Rspamd

Система Rspamd разрабатывается как основная система фильтрации спама в Рамблер-Почте. Однако же, изначально я планировал сделать систему, которая бы не уступала по возможностям, гибкости и качеству работы Spamassassin'а, однако была бы лишена основных его недостатков: чрезмерного использования регулярных выражений, слабой оптимизацией и общей задумчивостью работы, а также сравнительно неточной статистикой. Так созрела идея rspamd — системы, ядро которой было бы оптимизированно для фильтрации большого потока писем, которая была бы легко расширяема и использовала бы более совершенные алгоритмы статистики. Ядро rspamd написано на Си и использует событийную модель обработки сообщений (основанную на libevent). Расширяется rspamd путем написания плагинов и правил на языке lua. Сам проект с самого основания был Open Source (под BSD лицензией) и сейчас расположен на bitbucket.

Преамбула


На rspamd сильно повлияли такие проекты, как nginx, crm114 и, конечно же, spamassassin. От nginx rspamd взял модель обработки данных, а также принципы обработки различной информации — максимально используются наиболее оптимальные алгоритмы, такие как конечные автоматы, суффиксные деревья и прочее. В crm114, на мой взгляд, реализовано наибольшее количество разнообразных статистических алгоритмов и подходов, которые затем медленно внедряются и в другие системы. Например, rspamd для статистического анализа сообщений использует алгоритм анализа биграмм из слов, а не униграмм, как SA и многие другие спам-фильтры. Это позволяет оценивать вероятность (или же частоту) не просто слов, а спектра из сочетаний слов. С одной стороны это увеличивает размер статистики, а с другой — увеличивает ее точность. Но, конечно же, больше всего rspamd взял от SpamAssassin'а, послужившего прототипом и опорной точкой создания проекта. Идеология оценки сообщения на основании многих факторов — регулярных выражений, DNS блок-листов, различных списков, статистики, сигнатур, фишинга и прочего — взята именно из SpamAssassin'а. Кроме этого, оценка была расширена до понятия «метрика», что может позволить оценить сообщение по разным наборам правил.

Для кого предназначен Rspamd


Rspamd может подойти для систем различного масштаба, как крупных почтовых систем, так и небольших, обрабатывающих несколько писем в час. Первые найдут в rspamd такие возможности, как легкое горизонтальное масштабирование, master-slave синхронизацию статистики, встроенные команды для мониторинга работы, высокая скорость работы и возможность выдерживать резкие всплески загрузки (за счет отключения сложных проверок), а также гибкую расширяемую архитектуру. Для небольших систем rspamd вполне подойдет с настройками «из коробки». Также я планирую организовать раздачу статистики, чтобы пользователи могли поставить rspamd и иметь готовую систему для фильтрации спама. Rspamd умеет интегрироваться в различные MTA, а также работать в режиме SMTP прокси (более подробно об этом написано в данной статье документации).

Получение, установка и конфигурация системы


Rspamd сейчас работает только на Unix-like системах (проверялась работоспособность на различных видах Linux, FreeBSD и OpenSolaris). В FreeBSD rspamd есть в виде порта (mail/rspamd), обладатели остальных системы, к сожалению, будут вынуждены собирать rspamd из исходников. Этот процесс, как и начальная конфигурация, описан в "быстром старте". Конфигурация rspamd может осуществляться двумя способами: через xml файл и через lua. Первый способ предназначен для установки базовых параметров, например, так задаются веса и пороги срабатывания различных действий для сообщения:
<!-- Metrics section -->
<metric>
 <name>default</name>

 <required_score>14.0</required_score>
 <!-- Sample actions -->
 <action>reject</action>
 <action>greylist:4</action>
 <action>add_header:8</action>

 <!-- Weights for symbols -->

 <!-- Subject is missing inside message -->
 <symbol weight="2.00" description="Subject is missing inside message">MISSING_SUBJECT</symbol>
...

Второй способ применяется для написания правил и более «тонкой» настройке rspamd. Например, можно сделать функцию, которая выбирает «подходящие» файлы статистики для сообщения (в базовой поставке поставляется такая функция для подбора статистики по языку сообщения). Вот пример определения наличия пустого письма с картинкой в письме:
reconf['R_EMPTY_IMAGE'] = function (task)
	parts = task:get_text_parts()
	if parts then
		for _,part in ipairs(parts) do
			if part:is_empty() then
				images = task:get_images()
				if images then
					return true
				end
			end
		end
	end
	return false
end

Для обучения, проверки писем и мониторинга rspamd можно использовать консольный клиент rspamc.

Текущее состояние проекта


Не так давно я делал небольшое тестирование производительности rspamd и SA (проверял потоком в 30 одновременных соединений на примерно одинаковых правилах). Приблизительные результаты были таковы:

Rspamd:
rspamd stat

SpamAssassin:
spamassassin stat
Пользователи rspamd сейчас — это, помимо Рамблер-Почты, несколько крупных провайдеров. У проекта единственный разработчик, поэтому я заинтересован в новых пользователях для улучшения качества проекта и реализации новых идей. Кроме того, в последней версии (0.4.0) я приложил много усилий на стабилизацию, упрощение и улучшение качества своего проекта. Поэтому если кто-то будет получать меньше спама, благодаря rspamd, то я не зря писал код и эту статью.

Ссылки


  1. https://bitbucket.org/vstakhov/rspamd — Домашняя страница проекта
  2. https://bitbucket.org/vstakhov/rspamd/wiki/Quick_Start — Быстрый старт
  3. http://wiki.opennet.ru/Rspamd — Быстрый старт на русском языке
  4. https://bitbucket.org/vstakhov/rspamd/downloads/ — Загрузки
  5. https://bitbucket.org/vstakhov/rspamd/wiki/Documentation — Основная документация
  6. http://highsecure.ru/rspamd_statistics/ — Пример раздельной статистики для русского языка
Поделиться публикацией
Комментарии 33
    +2
    xml зачем?
      +3
      Дело в том, что rspamd разрабатывался с расчетом на автоматическое управление через веб-морду. Поэтому вещи, которые легко и часто меняются, настраиваются через xml, который с одной стороны более-менее удобно править руками, а с другой — легко распарсить и сгенерировать автоматически. Да, я знаю, что решение перевести конфигурацию с lex/yacc разбираемого формата, напоминающего конфиг bind, на xml было спорным. Однако, сейчас желающие могут настроить практически любые параметры из lua, оставив xml конфигурацию по умолчанию (настройки lua перекрывают настройки xml).
      0
      Как обучить систему? Ручками скормить ей набор спам писем?
        +2
        Да, либо создать собственную статистику «с нуля», либо скачать мои статфайлы и, взяв их за основу, дообучить собственным набором. Доработать систему автообучения у меня в ближайших планах — существующая система, взятая из SA, как показала практика, скорее зло, чем полезная фича. В планах создать более гибкую систему, чем обучение на основе баллов, которые набрало письмо. Скорее всего, это будет lua скрипт, в задачи которого войдет мониторинг различных параметров письма: баллов, символов, степени «доверия» к ip адресу отправителя, «полезность» письма для статистики (бесполезно обучать статистику слишком большими или слишком маленькими текстовыми данными).
          0
          а система автообучения зависит от конкретного пользователя — вот эти емайлы он пометил как хорошие, а эти убрал в спам?
            +2
            Нет, сейчас возможность per-user статистики (если я правильно Вас понял) не реализована. Сейчас есть только возможность загружать пользовательские настройки — число баллов, пороги срабатывания действий по письмам, «белые» и «черные» списки. Подробно об этом написано тут. Но если Вы всерьез решили использовать rspamd и единственное, чего Вам не хватает, — это per-user статистика, то я могу эту возможность реализовать в следующей версии, так как в текущую архитектуру статистики это вписывается без проблем.
        0
        Нельзя ли требования к версии glib2 уменьшить до 2.12, то на CentOS 5.x не заводится, а это достаточно большая доля серверов.
          +2
          В glib2.14 и glib2.16 были добавлены такие фичи, как обертка вокруг PCRE (GRegex), которая довольно часто используется в rspamd, библиотека хеширования (GCheckSum) и некоторые другие возможности. Встроить их в rspamd для совместимости не позволяет лицензия (LGPL несовместима с BSD). Но я подумаю, что можно сделать, — все эти зависимости достаточно легко реализовать с нуля.
            +1
            Даже проще сделать так: если glib версии меньше, чем 2.16, то компилировать нехватающие возможности отдельно и линковаться с ними динамически, не нарушая лицензионных требований.
              0
              Буду премного благодарен, и да… уберите генерацию spec файла в cmake :)
              был несказанно удивлен когда написав свой spec принялся делать rpmbuild и увидел, что cmake-ом Вы генерируете свой :)
                0
                Генерация собственных спеков никогда особо не использовалась, так как я решил, что намного лучше сконцентрироваться на стабильности, документировании и популяризации проекта, чем создание пакетов, которые никто не использует.
                  0
                  Я допилил сборку со старым glib и проверил ее на CentOS 5.5. Можете попробовать собрать tip репозитория, и если все будет нормально, то я сделаю новую версию.
            0
            Если на обучение подать набор спама с целого ряда аккаунтов, как это скажется на качестве фильтрации?
              0
              Ответить на этот вопрос довольно сложно — иногда даже человек с трудом может понять, спам это или же легитимная рассылка. Я сам обучаю систему спамом с разнообразных источников, предварительно удостоверившись в том, что это действительно спам, и результат мне кажется достаточно неплохим. Но нужно иметь в виду, что для стабильной работы статистики не стоит делать перекос в сторону спама — количество хама должно быть соизмеримым, чтобы статистика работала в обе стороны.
                0
                Извините, я неточно сформулировал вопрос.
                Предположим я пишу сервис, связанный с электронной почтой.
                Могу я «прикрутить» к сервису ваш демон. Это возможно?
                Если да, то тогда вот какой вопрос. Обслуживая сразу большое количество аккаунтов, качество фильтрации спама повысится, или снизится? Если сравнивать с качеством фильтрации одного аккаунта.
                  0
                  Прикрутить можно как угодно. Если это веб сервис, то, наверное, проще использовать rspamd в виде HTTP сервера, который выдает результат в виде json объекта (это настраивается в секции ), если почтовый — то проще использовать описанные в документации способы.
                  Если обучать статистику спамом с разных аккаунтов, то ее качество, безусловно, повысится, т.к. это даст больше разнообразных спам токенов, которые будут в дальнейшем оцениваться. Главное — обучать реальным спамом, а не тем, что считают «спамом» пользователи — практика показывает, что зачастую это диаметральные противоположности.
              0
              А если сравнивать с SA который запущен через amavisd?
                0
                Гм, я, конечно, не тестировал amavisd, но мне кажется, что он не решает основную проблему SA — отсутствия оптимизации и использование регулярных выражений в совсем неподходящих местах. Например, в SA для разбора Received заголовков в письме последовательно применяется примерно 20 регулярных выражений, соответствующих различным MTA.
                  0
                  а как это сделано в rspamd?
                    +2
                    Вначале письмо разбирается gmime, в котором парсинг построен на базе конечных автоматов. Далее конечным автоматом в rspamd разбираются Received заголовки, из которых извлекаются полезные для фильтров данные. Но дело даже не в конкретном случае, а в общем подходе — в SA очень мало думают об оптимизации.
                0
                В доке по интеграции с экзимом написано что нужно накатывать патч…
                Доделайте в портах фряхи это дело как опцию конфигурации порта
                  0
                  пропатчил екзим но так и не удалось заставить работать под фрей, порт сыроват.
                    0
                    А в чем заключается проблема? У нас на всем кластере ставится rspamd из этого порта.
                      0
                      экзим 4.76
                      первый вариант интеграции Using spam.c patch — экзим не мог разобрать ответы от rspamd
                      второй вариант Using local scan — отваливался по таймауту local_scan() function timed out — message temporarily rejected (size 14277)
                      третий вариант Using dlfunc — некомпилится со свежей версией.

                      при этом rspamd не умеет создавайть сам файлы статистики, пришлось ручками.
                        0
                        По поводу последнего вопроса — rspamd создает файлы статистики автоматически при обучении. При классификации их нет особого смысла создавать.

                        По поводу интеграции с exim, я думаю, лучше продолжить общение по электронной почте. Пожалуйста, опишите, какие в точности ошибки возникли при компиляции и дамп общения exim'а и rspamd при неверной работе. Заранее спасибо!

                        Я просто везде использую postfix, и у меня нет особо возможности проверять функционал rspamd с exim'ом.
                          0
                          логи выслал хабропочтой.
                          А вобще есть люди в теме кому удалось настроить работу экзима? Интересен вид интеграции. Как по мне, то наиболее удачный тот который
                          spamd_address = 127.0.0.1 11333
                          acl_smtp_data = acl_check_spam
                    0
                    Это не опция порта rspamd, это опция порта exim'а. Можно попросить мейнтейнера включить патч для работы с rspamd в OPTIONS.
                      0
                      Это не опция конфигурации порта rspamd, это должна быть опция конфигурации порта exim'а. Можно попробовать попросить мейнейнера включить патч rspamd в порт exim'а в виде опции.
                      0
                      попробуем… у меня минимум 1000 спам писем в день, среди 5000-10000 тысяч валидных из разных рассылок.
                      сейчас сделаю билд для exherbo. не поделитесь линком на патч для exim?
                        0
                        патч уже нашел
                        0
                        а можно ли систему доработать для определения спама в комментариях на сайте
                          0
                          Это и так присутствует. В настройке воркера можно сказать
                          <mime>no</mime>
                          и использовать http и json для общения (хотя для этого лучше использовать последнюю версию из hg, так как недавно я исправлял в этом месте некоторые проблемы).
                          0
                          А есть ли возможность подружить rspamd с amavisd? Если да, то как?

                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                          Самое читаемое