31
Как мы используем Tarantool в Wallarm Александр Головко, [email protected] Tarantool Meetup, 28.01.2016

Александр Головко - Как мы используем Tarantool в Wallarm

Embed Size (px)

Citation preview

Page 1: Александр Головко - Как мы используем Tarantool в Wallarm

Как мы используем Tarantool в Wallarm

Александр Головко, [email protected] Meetup, 28.01.2016

Page 2: Александр Головко - Как мы используем Tarantool в Wallarm

whoami

Александр Головко

CTO в Wallarm

[email protected]

Page 3: Александр Головко - Как мы используем Tarantool в Wallarm

Что такое Wallarm

● Решение для защиты от взлома● Защищает QIWI, Юлмарт, и многие другие интернет-

компанииMail.ru — НЕТ!, можете ломать

● У клиентов — большие нагрузки, частые выкатки кода, большая инфраструктура, много атак

● За прошлый мы обработали 500+ млр. запросов ● И задектировали 150 миллионов вредоносных

запросов

Page 4: Александр Головко - Как мы используем Tarantool в Wallarm

Как все начиналось

● Мы умели ломать сайты (проводить аудиты информационой безопасности)

● Мы умели обходить WAF’ы● Поняли, что исправить WAF’ы нельзя● Нам стало больно, обидно и холодно :)● Мы решили делать что-то, отличное от WAF

Page 5: Александр Головко - Как мы используем Tarantool в Wallarm

Задача

● Непрерывный мониторинг безопасности ● Анализировать трафик локально● Выявлять уязвимости локально и из облака● Хранить в облаке статистику и атаки

Page 6: Александр Головко - Как мы используем Tarantool в Wallarm

Непростые требования

● Не мешать нормальной работе приложения (минимум оверхедов)

● Не требовать абсолютного доверия (не отдавать нам трафик)

● Не портить приложение (не инжектить HTML/JS)● Автоматически подстраиваться под защищамое

приложение● Бесконечно масштабироваться● Ставиться легко и просто без своих железок

Page 7: Александр Головко - Как мы используем Tarantool в Wallarm

Зоны ответственности

● Клиентские ноды видят весь трафик(установлены в инфраструктуре клиента как reverse-proxy)

● Облако видит только зловредов и статистику

Page 8: Александр Головко - Как мы используем Tarantool в Wallarm
Page 9: Александр Головко - Как мы используем Tarantool в Wallarm

Nginx

Плюсы:

● Мы знаем команду Nginx, а они нас :)● Стандарт де-факто● Сам по себе он быстр и стабилен

Минусы:

● Хардкор

Page 10: Александр Головко - Как мы используем Tarantool в Wallarm

Дилемма

● Надо гарантированно проверять все запросы● При нехватке ресурсов жертвовать некритичным

функционалом● Быть устойчивым к сбоям● А при чем тут Тарантул-то? Есть же nginx-lua (прямо

как у CloudFlare)

Page 11: Александр Головко - Как мы используем Tarantool в Wallarm

Мудрость жизни

● Если хочешь успевать больше:○ не тупи

○ не отвлекайся

● Надо разделить процесс на две части○ первичная обработка (синхронная, nginx!)

○ постобработка (асинхронная, tarantool?!)

Page 12: Александр Головко - Как мы используем Tarantool в Wallarm

А еще...

● Атаки бывают не только Input Validation● Поведенческие атаки

○ Bruteforce/Dirbusting

○ Fuzzers

○ Fraud

● Хотим то не знаю что, тогда не знаю когда○ обучение — сбор статистики

○ обучалка в любой момент может захотеть собрать что-то, что

раньше даже не планировалось собирать (кол-во запросов с

пустым HOST в полнолуние)

Page 13: Александр Головко - Как мы используем Tarantool в Wallarm

Первичная обработка

● Блокировка до получения проблем● IV может создать проблемы с одного запроса● По сутиподсчет метрик о каждом запросе

Page 14: Александр Головко - Как мы используем Tarantool в Wallarm

Постобработка

● Ошибки выгрузки данных в облако● Bruteforce и другие поведенческие атаки можно

выявить только постфактум● Какой еще будет анализ поведения — неизвестно● По сути — сбор статистики● Вывод — нам надо какую-то БД

Page 15: Александр Головко - Как мы используем Tarantool в Wallarm

Выбор БД

Page 16: Александр Головко - Как мы используем Tarantool в Wallarm

Выбор БД

● Надо быть способным записать все, что проходит через Nginx

● В худшем случае - еще и все успеть выгрузить● Надо вести различную статистику запросов● Возможность делать произвольную аналитику● Память дешева, так что in-memory БД

Page 17: Александр Головко - Как мы используем Tarantool в Wallarm

Варианты

● Писать что-то свое специфиное● Взять какую-то встраиваемую БД● Взять какую-то из обычных БД

Page 18: Александр Головко - Как мы используем Tarantool в Wallarm

Подводящие мысли

● Идеал, если нам подходит что-то готовое● Популяция in-memory баз в 2013 невелика● Больше хранимок, меньше денормализации● OpenSource решение на C в почете

Page 19: Александр Головко - Как мы используем Tarantool в Wallarm

В итоге

● MySQL● Redis● Tarantool

Page 20: Александр Головко - Как мы используем Tarantool в Wallarm

Redis vs Tarantool

● Оба однопоточны● Оба можно скриптовать на LUA● По бенчмаркам индексы Tarantool быстрее● LuaJIT добавили в Redis только в 2014● Мы знаем команду Tarantool, а они наc. Прямо как

Nginx :)● Нам нравилась идея Application-сервера для LUA.● Secondary index облегчают денормализацию данных

Page 21: Александр Головко - Как мы используем Tarantool в Wallarm

Tarantool!

Page 22: Александр Головко - Как мы используем Tarantool в Wallarm

Как мы используем Tarantool

● nginx готовит сериализованный запрос● nginx вызывает tarantool-функцию для записи

запроса● в tarantool в этот момент считаются и сохраняются

дополнительные метрики● если tarantool не хватает свободной памяти, то

удаляется что-то из старых данных● внешние скрипты выгружают из tarantool часть

данных и что-то с ними делают.

Page 23: Александр Головко - Как мы используем Tarantool в Wallarm

Сейчас

● Статистика для брутов● Маркировка запросов по хидерам● Выгрузка вредоносных запросов● Сбор информации о структуре приложения

Page 24: Александр Головко - Как мы используем Tarantool в Wallarm

Tarantool 1.5 - раздражало

● Отвратительный вывод на экран в консоли● Необходимость набирать lua перед каждой командой● Обращение к спэйсам и индексам по номерам

Page 25: Александр Головко - Как мы используем Tarantool в Wallarm

Tarantool 1.5 - боль

● Ужасная статистика потребления памяти● Expirationd - отстой● Однопоточность

Page 26: Александр Головко - Как мы используем Tarantool в Wallarm

Tarantool 1.6 - боль

● Смена протокола● Нет триггера на нехватку памяти● Пришлось везде вставлять pcall()● Память иногда не очищалась после удаления данных● Последний такой баг закрыли только в 1.6.7

Page 27: Александр Головко - Как мы используем Tarantool в Wallarm

Tarantool 1.6 - косяки

● Были сегфолты● Смешной сегфолт в lua-yaml● Мы не дочитали доки на протокол и минорный апдейт

принес нам проблемы коннекта.

Page 28: Александр Головко - Как мы используем Tarantool в Wallarm

Tarantool 1.6 - плюшки

● Для нас стало заметно быстрее○ вместо 25к/сек записей стало 30к/сек

● Появились hash-функции (md5 и прочие) в стандартной поставке

● msgpack● Написание функций на C это огонь!● Sophia - можно теперь подумать на тему вынесения

части данных на диск

Page 29: Александр Головко - Как мы используем Tarantool в Wallarm

Итого

● Несмотря на все описанные сложности, Tarantool нам понравился

● Он позволил нам сэкономить значительное время при выходе на рынок

● Сейчас ноды с тарантлом работают в очень нагруженных проектах.○ Qrator - через них проходит порядка 500мбит трафика

○ Qiwi - несолько сотен инсталляций○ Обработано более 400 млрд запросов за 2015 год.

Page 30: Александр Головко - Как мы используем Tarantool в Wallarm

● Триггер на нехватку памяти● Ускориться за счет сишных хранимок● Начать использовать их nginx-коннектор● Поиграться с вынесением части данных в sophia

Будущее

Page 31: Александр Головко - Как мы используем Tarantool в Wallarm

Вопросы?

Алексадр Головко[email protected]