Rspamd — это система фильтрации спама с открытым кодом, выполняющая оценку e-mail сообщений по множеству критериев, который возник как попытка адаптировать фильтрацию спама к современным реалиям и постоянно растущему потоку электронных писем, нуждающихся в обработке.
Тезисы - http://www.highload.ru/2015/abstracts/1892.html
1 of 173
More Related Content
Rspamd — высокопроизводительная система фильтрации спама / Стахов Всеволод (University of Cambridge / Mimecast
7. Какой бывает спам
Актуальные виды
• Мошеннические письма (scam):
• “Нигерийские” письма
• Фишинг (банки, соцсети)
8. Какой бывает спам
Актуальные виды
• Мошеннические письма (scam):
• “Нигерийские” письма
• Фишинг (банки, соцсети)
• Реклама:
9. Какой бывает спам
Актуальные виды
• Мошеннические письма (scam):
• “Нигерийские” письма
• Фишинг (банки, соцсети)
• Реклама:
• Традиционная текстовая
10. Какой бывает спам
Актуальные виды
• Мошеннические письма (scam):
• “Нигерийские” письма
• Фишинг (банки, соцсети)
• Реклама:
• Традиционная текстовая
• Картинки, сложный html и другие методы обфусикации
11. Какой бывает спам
Актуальные виды
• Мошеннические письма (scam):
• “Нигерийские” письма
• Фишинг (банки, соцсети)
• Реклама:
• Традиционная текстовая
• Картинки, сложный html и другие методы обфусикации
• Подделки под сообщения соцсетей
16. Методики борьбы
Принципы
• Политики (особенно эффективны против Scam’a)
• DNS списки (ip адреса, URL)
• SPF, DKIM, DMARC
• Репутация отправителя
17. Методики борьбы
Принципы
• Политики (особенно эффективны против Scam’a)
• DNS списки (ip адреса, URL)
• SPF, DKIM, DMARC
• Репутация отправителя
• Контент фильтрация (поиск заданных паттернов
в письмах)
18. Методики борьбы
Принципы
• Политики (особенно эффективны против Scam’a)
• DNS списки (ip адреса, URL)
• SPF, DKIM, DMARC
• Репутация отправителя
• Контент фильтрация (поиск заданных паттернов
в письмах)
• Статистический анализ (например, bayes)
21. Методики борьбы
Трудности
• Политики:
• Требуют сетевых запросов, которые могут долго выполняться
• Ложные срабатывания
• Контент фильтрация:
• Затратна в плане CPU
• Быстро устаревает
22. Методики борьбы
Трудности
• Политики:
• Требуют сетевых запросов, которые могут долго выполняться
• Ложные срабатывания
• Контент фильтрация:
• Затратна в плане CPU
• Быстро устаревает
• Статистический анализ:
• Неточен
• Сложно сканировать в многопользовательских системах
28. Особенности rspamd
• Нормализация текста (snowball stemmer)
• Конвертирование всех писем в utf-8
• Поддержка настроек пользователей
• Возможность создания нескольких метрик для писем
29. Особенности rspamd
• Нормализация текста (snowball stemmer)
• Конвертирование всех писем в utf-8
• Поддержка настроек пользователей
• Возможность создания нескольких метрик для писем
• Web интерфейс для управления
30. Особенности rspamd
• Нормализация текста (snowball stemmer)
• Конвертирование всех писем в utf-8
• Поддержка настроек пользователей
• Возможность создания нескольких метрик для писем
• Web интерфейс для управления
• Совместимость с правилами SpamAssassin’а
31. Особенности rspamd
• Нормализация текста (snowball stemmer)
• Конвертирование всех писем в utf-8
• Поддержка настроек пользователей
• Возможность создания нескольких метрик для писем
• Web интерфейс для управления
• Совместимость с правилами SpamAssassin’а
• OpenSource (BSD 2-clause)
36. Методы фильтрации
Политики
• Поддержка SPF, DKIM, DMARC
• Плагин DNSBL - работа с DNS блок-листами
• Плагин SURBL - работа с DNS листами URL
• Плагин репутации (IP, подсети, автономной сети
и страны)
37. Методы фильтрации
Политики
• Поддержка SPF, DKIM, DMARC
• Плагин DNSBL - работа с DNS блок-листами
• Плагин SURBL - работа с DNS листами URL
• Плагин репутации (IP, подсети, автономной сети
и страны)
• Универсальный плагин для обработки списков
49. Интеграция rspamd
milter
• rmilter + postfix/sendmail:
• поддерживает все возможности rspamd (например,
выборочный грейлистинг)
• умеет разделять входящие и исходящие потоки почты
50. Интеграция rspamd
milter
• rmilter + postfix/sendmail:
• поддерживает все возможности rspamd (например,
выборочный грейлистинг)
• умеет разделять входящие и исходящие потоки почты
• умеет хранить информацию об ответах на
собственные письма
51. Интеграция rspamd
milter
• rmilter + postfix/sendmail:
• поддерживает все возможности rspamd (например,
выборочный грейлистинг)
• умеет разделять входящие и исходящие потоки почты
• умеет хранить информацию об ответах на
собственные письма
• дополнительные проверки: clamav, dcc
52. Интеграция rspamd
milter
• rmilter + postfix/sendmail:
• поддерживает все возможности rspamd (например,
выборочный грейлистинг)
• умеет разделять входящие и исходящие потоки почты
• умеет хранить информацию об ответах на
собственные письма
• дополнительные проверки: clamav, dcc
• умеет подписывать исходящие письма (DKIM)
56. Интеграция rspamd
Другие способы
• exim - встроенная поддержка (с версии 4.86)
• haraka - встроенная поддержка
• любые MTA - LDA режим, когда клиент rspamd
проверяет письмо и вызывает через pipe LDA
для доставки письма (не работает грейлистинг)
60. Rspamd в двух словах
• Написан на plain C
• Использует неблокирующую (событийную)
модель обработки данных
61. Rspamd в двух словах
• Написан на plain C
• Использует неблокирующую (событийную)
модель обработки данных
• Плагины и правила написанны на языке Lua
63. Rspamd в двух словах
Приоритеты разработки
• Производительность и масштабируемость
64. Rspamd в двух словах
Приоритеты разработки
• Производительность и масштабируемость
• Качество фильтрации и расширяемость
65. Rspamd в двух словах
Приоритеты разработки
• Производительность и масштабируемость
• Качество фильтрации и расширяемость
• Портабельность и интеграция с MTA
66. Rspamd в двух словах
Приоритеты разработки
• Производительность и масштабируемость
• Качество фильтрации и расширяемость
• Портабельность и интеграция с MTA
• Безопасность
67. Rspamd в двух словах
Приоритеты разработки
• Производительность и масштабируемость
• Качество фильтрации и расширяемость
• Портабельность и интеграция с MTA
• Безопасность
• Простота, работа “из коробки” и документация
69. Событийная модель
Никогда не блокируется*
• Плюсы:
✅ Может обрабатывать сетевые запросы независимо
✅ Посылает все сетевые запросы одновременно
✅ Обрабатывает сразу много сообщений и хорошо сканируется
*почти никогда
70. Событийная модель
Никогда не блокируется*
• Плюсы:
✅ Может обрабатывать сетевые запросы независимо
✅ Посылает все сетевые запросы одновременно
✅ Обрабатывает сразу много сообщений и хорошо сканируется
• Cons:
📛 Очень сложная работа с callback’ами
⛔ Сложно ограничить потребление памяти
*почти никогда
74. Событийная модель
Несколько наблюдений
• Rspamd может генерировать множество
параллельных сетевых запросов:
time: 5540.8ms real, 2427.4ms virtual, dns req: 120543
75. Событийная модель
Несколько наблюдений
• Rspamd может генерировать множество
параллельных сетевых запросов:
time: 5540.8ms real, 2427.4ms virtual, dns req: 120543
• Для коротких сообщений (которые составляют
99% от всех сообщений) ожидание занимает в
сотни раз больше времени, чем обработка:
time: 996.140ms real, 22.000ms virtual,
76. Обработка сообщения в rspamd
RulesRules
Filters
RulesRules
Pre-filters
RulesRules
Post-filters
📩 Сообщение
📬 Результат
Ожидание
Ожидание
Ожидание зависимостей
80. Статистика в rspamd
• Использует цепи Маркова из статистических
токенов
• Использует метаданные в письме
(mime структуру, вложения, заголовки)
81. Статистика в rspamd
• Использует цепи Маркова из статистических
токенов
• Использует метаданные в письме
(mime структуру, вложения, заголовки)
• Статистические данные хранятся в sqlite3
82. Статистика в rspamd
• Использует цепи Маркова из статистических
токенов
• Использует метаданные в письме
(mime структуру, вложения, заголовки)
• Статистические данные хранятся в sqlite3
• Синхронизация: обучение всех серверов вместе
(есть защита от повторного обучения)
84. Пример работы статистики
Сложный случай - спам в картинках
Процентписем
0%
25%
50%
75%
100%
Spam Ham
8%5%
92%95%
Правильно распознано Не распознано
87. Нечеткие хеши
Общие данные
• Используются для поиска похожих писем
• Сочетают обычные хеши для вложений и
алгоритм шинглов для текста
88. Нечеткие хеши
Общие данные
• Используются для поиска похожих писем
• Сочетают обычные хеши для вложений и
алгоритм шинглов для текста
• Хранилище хешей - sqlite3
89. Нечеткие хеши
Общие данные
• Используются для поиска похожих писем
• Сочетают обычные хеши для вложений и
алгоритм шинглов для текста
• Хранилище хешей - sqlite3
• Синхронизация: обучение всех серверов вместе
(есть защита от повторного обучения)
90. Алгоритм шинглов
Quick brown fox jumps over lazy dog
w1 w2 w3
w2 w3 w4
w3 w4 w5
w4 w5 w6
w1 w2 w3
w2 w3 w4
w3 w4 w5
w4 w5 w6
N хешей
h1
h2
h3
h4
h1’
h2’
h3’
h4’
91. Алгоритм шинглов
h1 h2 h3
h1’ h2’ h3’
h1’’ h2’’ h3’’
h1’’’’’ h2’’’’ h3’’’’
…
…
…
…
…
min
min
min
min
…
N шингловN наборов хешей
95. Алгоритм шинглов
• Однозначный вероятностный алгоритм
• В качестве хеш-функции - siphash с разными
ключами
• Ключи генерируются при помощи
криптографической хеш-функции
96. Алгоритм шинглов
• Однозначный вероятностный алгоритм
• В качестве хеш-функции - siphash с разными
ключами
• Ключи генерируются при помощи
криптографической хеш-функции
• Размер окна - 3 слова, число хешей - 32
(больше - медленно)
100. Общие принципы
• Думать о производительности. Всегда.
• Если что-то можно не делать, то не делать это
101. Общие принципы
• Думать о производительности. Всегда.
• Если что-то можно не делать, то не делать это
• Если есть более оптимальное частное решение
задачи, то использовать его (ассемблерные
вставки, конечные автоматы)
102. Общие принципы
• Думать о производительности. Всегда.
• Если что-то можно не делать, то не делать это
• Если есть более оптимальное частное решение
задачи, то использовать его (ассемблерные
вставки, конечные автоматы)
• Если можно сделать примерно, но быстро, или
очень точно, но долго, то делать быстро
105. Оптимизация правил
Глобальная оптимизация
• Останавливать проверки, если письмо уже набрало
порог очков
• Обрабатывать правила с отрицательным весом в
первую очередь (для избежания ошибок второго рода)
106. Оптимизация правил
Глобальная оптимизация
• Останавливать проверки, если письмо уже набрало
порог очков
• Обрабатывать правила с отрицательным весом в
первую очередь (для избежания ошибок второго рода)
• Выполнять правила, которые можно выполнить
быстрее, в первую очередь:
• Учитывается среднее время выполнения, вес и
частота срабатывания
• Жадный алгоритм сортировки
108. Оптимизация правил
Локальные оптимизации
• Каждое правило оптимизируется при помощи
абстрактного синтаксического дерева (AST):
дало прирост в 3-4 раза для больших писем
109. Оптимизация правил
Локальные оптимизации
• Каждое правило оптимизируется при помощи
абстрактного синтаксического дерева (AST):
дало прирост в 3-4 раза для больших писем
• Элементы в дереве упорядочиваются по
аналогичному “жадному” алгоритму
110. Оптимизация правил
Локальные оптимизации
• Каждое правило оптимизируется при помощи
абстрактного синтаксического дерева (AST):
дало прирост в 3-4 раза для больших писем
• Элементы в дереве упорядочиваются по
аналогичному “жадному” алгоритму
• Регулярные выражения компилируются при
помощи PCRE JIT (+100-150% скорости)
111. Оптимизация правил
Локальные оптимизации
• Каждое правило оптимизируется при помощи
абстрактного синтаксического дерева (AST):
дало прирост в 3-4 раза для больших писем
• Элементы в дереве упорядочиваются по
аналогичному “жадному” алгоритму
• Регулярные выражения компилируются при
помощи PCRE JIT (+100-150% скорости)
• Код на Lua компилируется LuaJIT
115. Оптимизации библиотеки C
• Собственное API для ведения логов:
• умеет работать с syslog/file/console
• фильтрует повторяющиеся сообщения и сообщения с не-
ASCII символами
116. Оптимизации библиотеки C
• Собственное API для ведения логов:
• умеет работать с syslog/file/console
• фильтрует повторяющиеся сообщения и сообщения с не-
ASCII символами
• Собственная реализация printf:
• работает со структурами rspamd (строки фиксированной
длины, int*_t)
• не зависит от локалей
• не пытается вычислять требуемую длину буфера
118. Оптимизации библиотеки C
Строковые функции
• Оптимизированные функции работы с base32/
base64:
• работа с выровненными данными;
• оптимизация циклов для 64-х битных платформ
119. Оптимизации библиотеки C
Строковые функции
• Оптимизированные функции работы с base32/
base64:
• работа с выровненными данными;
• оптимизация циклов для 64-х битных платформ
• Реализация приведения текста к нижнему
регистру (ASCII и UTF8 версия)
120. Оптимизации библиотеки C
Строковые функции
• Оптимизированные функции работы с base32/
base64:
• работа с выровненными данными;
• оптимизация циклов для 64-х битных платформ
• Реализация приведения текста к нижнему
регистру (ASCII и UTF8 версия)
• Использование строк фиксированной длины
123. Оптимизации библиотеки C
• Быстрые хеш функции (xxhash и blake2)
• Быстрое шифрование (ассемблерные
реализации)
124. Оптимизации библиотеки C
• Быстрые хеш функции (xxhash и blake2)
• Быстрое шифрование (ассемблерные
реализации)
• Выравнивание данных
125. Оптимизации библиотеки C
• Быстрые хеш функции (xxhash и blake2)
• Быстрое шифрование (ассемблерные
реализации)
• Выравнивание данных
• Поддержка инструментов анализа
производительности и возможность оценки
скорости работы каждого правила
126. Хранение IP адресов
Несжатое radix дерево
IP1 IP2
01
01
01
01
Уровень на каждый бит: 32 уровня для IPv4
128 уровней для IPv6
131. Основные принципы
• Писать безопасный код на plain C трудно
• Основные угрозы:
• Взаимодействие с DNS
• Прослушивание трафика (шифровать надо все
данные, передаваемые по сети)
• Вредоносные сообщения
133. Примеры проблем
• В письме может содержаться очень много
данных для проверки в DNS (например, сотни
тысяч URL)
134. Примеры проблем
• В письме может содержаться очень много
данных для проверки в DNS (например, сотни
тысяч URL)
• SPF записи могут иметь бесконечную рекурсию
135. Примеры проблем
• В письме может содержаться очень много
данных для проверки в DNS (например, сотни
тысяч URL)
• SPF записи могут иметь бесконечную рекурсию
• Нужны лимиты на число запросов для одного
письма
140. Защита DNS
• Криптографический генератор DNS id
• Пул сокетов с постоянной ротацией
• Рандомизация портов для запросов
• Фильтрация входных данных (+ IDN
кодирование)
144. Шифрование трафика
• Безопасность -> скорость -> простота
• TLS сложно интегрировать в non-blocking IO
• TLS делает много ненужного, увеличивая CPU
load и latency
155. Анализ производительности
Почему HTTPCrypt работает быстро
• Более быстрая асимметричная криптография
(ECDH)
• Отсутствие подписи и ее проверки
(как требуется в TLS)
• Шифрование без промежуточного копирования
(на месте)
158. Анализ применимости
• HTTPCrypt применяется для работы с клиентами
сканера
• Есть проект JavaScript реализации для защиты Web
интерфейса
159. Анализ применимости
• HTTPCrypt применяется для работы с клиентами
сканера
• Есть проект JavaScript реализации для защиты Web
интерфейса
• Аналогичный метод применяется для работы с
хранилищем хешей
160. Анализ применимости
• HTTPCrypt применяется для работы с клиентами
сканера
• Есть проект JavaScript реализации для защиты Web
интерфейса
• Аналогичный метод применяется для работы с
хранилищем хешей
• Библиотека rdns, используемая для работы с DNS,
поддерживает DNSCurve, который позволяет
шифровать DNS запросы теми же конструкциями
164. Выводы
• Rspamd спроектирован, чтобы обеспечивать
высокую производительность
• Rspamd обладает большим набором правил и
плагинов, поставляемых “из коробки”
165. Выводы
• Rspamd спроектирован, чтобы обеспечивать
высокую производительность
• Rspamd обладает большим набором правил и
плагинов, поставляемых “из коробки”
• Весь трафик, отправляемый rspamd по сети,
можно шифровать
168. Администрирование rspamd
Основы
• Rspamd устанавливается из пакетов/портов для
большинства систем и работает “из коробки”
• Предоставляется сервис нечетких хешей,
обучаемый из honeypot’ов
• Web интерфейс для большинства повседневных
задач
170. Администрирование rspamd
Компоненты конфигурации
Глобальные опции
Настройки процессов
Настройки весов
Конфигурация плагинов
Опции статистики
• Основные правила, веса и другие
настройки используются по умолчанию
после установки
• rspamd.local.conf используется для
добавления опций
• rspamd.override.conf используется для
переопределения опций
• rspamd.local.lua содержит локальные
правила на языке lua
171. Администрирование rspamd
Обучение
• Для обучения статистики нужно примерно
равное количество примеров спама и хама
• Обучение статистики и хешей делается сразу
для всех серверов (защита от повторного
обучения)
• Утилитой rspamadm можно выполнять слияние
баз статистики и баз хешей
172. Администрирование rspamd
Правила регулярных выражений
-- Outlook versions that should be excluded from summary rule
local fmo_excl_o3416 = 'X-Mailer=/^Microsoft Outlook, Build 10.0.3416$/H'
local fmo_excl_oe3790 = 'X-Mailer=/^Microsoft Outlook Express 6.00.3790.3959$/H'
-- Summary rule for forged outlook
reconf['FORGED_MUA_OUTLOOK'] = string.format('(%s | %s) & !%s & !%s & !%s',
forged_oe, forged_outlook_dollars, fmo_excl_o3416, fmo_excl_oe3790, vista_msgid)
173. Администрирование rspamd
Правила на Lua
rspamd_config.R_EMPTY_IMAGE = function(task)
local tp = task:get_text_parts() -- get text parts in a message
for _,p in ipairs(tp) do -- iterate over text parts array using `ipairs`
if p:is_html() then -- if the current part is html part
local hc = p:get_html() -- we get HTML context
local len = p:get_length() -- and part's length
if len < 50 then -- if we have a part that has less than 50 bytes of text
local images = hc:get_images() -- then we check for HTML images
if images then -- if there are images
for _,i in ipairs(images) do -- then iterate over images in the part
if i['height'] + i['width'] >= 400 then -- if we have a large image
return true -- add symbol
end
end
end
end
end
end
end