Pull to refresh

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

Spamming and anti-spamming
Sandbox
Система 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/ — Пример раздельной статистики для русского языка
Tags:
Hubs:
Total votes 49: ↑48 and ↓1 +47
Views 18K
Comments 33
Comments Comments 33

Posts