RedisSentry: защищаем python web-сервер от подбора пароля на примере django Максимов Лев Викторович 9 Jul 2012.

Презентация:



Advertisements
Похожие презентации

Advertisements

Типовые расчёты Растворы

Тренировочное тестирование-2008 Ответы к заданиям КИМ Часть I.

Маршрутный лист «Числа до 100» ? ? ?
О СИТУАЦИИ НА РЫНКЕ ТРУДА И РЕАЛИЗАЦИИ РЕГИОНАЛЬНЫХ ПРОГРАММ ПО СНИЖЕНИЮ НАПРЯЖЕННОСТИ НА РЫНКЕ ТРУДА СУБЪЕКТОВ СЕВЕРО-КАВКАЗСКОГО ФЕДЕРАЛЬНОГО ОКРУГА.
Ребусы Свириденковой Лизы Ученицы 6 класса «А». 10.
Тема 11 Медицинская помощь и лечение (схема 1). Тема 11 Медицинская помощь и лечение (схема 2)
Урок повторения по теме: «Сила». Задание 1 Задание 2.
Michael Jackson
«Весна» Презентация для детей Выполнила: воспитатель мл.гр. Протасова О.Г. МКДОУ-детский сад «Лужок» 2014г. 1.

ЗРИТЕЛЬНЫЕ ИЛЛЮЗИИ ОПТИЧЕСКИЕ ОБМАНЫ 1. Зрительная иллюзия – не соответствующее действительности представление видимого явления или предмета из-за особенностей.
Школьная форма Презентация для родительского собрания.
1. Определить последовательность проезда перекрестка

Учебный курс Объектно-ориентированный анализ и программирование Лекция 4 Трансформация логической модели в программный код Лекции читает кандидат технических.
McDonalds Kalender 2009 January
Ефимова Е.Н. школа 840 Шестнадцатеричная система счисления Урок 3.
Транксрипт:

RedisSentry: защищаем python web-сервер от подбора пароля на примере django Максимов Лев Викторович 9 Jul 2012

2 ~7000 шт/час1 IP, 1 процесс

3 Способы борьбы с перебором пароля Captcha, (Сompletely Automated Public Turing test to tell Computers and Humans Apart) + отпугивает не особо заинтересованных атакующих отпугивает и обычних пользователей тоже + скрипт из пары строчек уже не сработает есть специализированные программы-распознаватели и люди-распознаватели Throttling, задержка ответа сервера + несколько снижает эффективность атаки может раздражать пользователя сложности реализации на синхронном сервере Блокировки, не допускает к аутентификации в течение некоторого времени + практически неощутимо для пользователя + более эффективно сдерживает атаки

4 Модули защиты от перебора пароля: redis… me 9 Apr 2012 – 3 May 2012 django-redissentry main dbIP & username (company) 30 Nov 2009 – 6 Mar 2011 django-brutebuster main dbusername Alex Kuhl 12 Jan 2011 – 3 Mar 2011 django-failedloginblocker memcachedIP Brian Jay Stanley 24 Jul 2011 – 18 Oct 2011 django-lockout main dbIP Josh VanderLinden 1 Oct May 2012 django-axes IP либо IP+username memcached Simon Wilson 7 Jan Sep 2009 ratelimitcache global либо IPmain db jensbreit 24 Sep 2008 – 24 Sep 2008 django snippet #1083 storageсчетчикиauthor first commit- last commit взлом твиттера Социальная сеть

5 Модули защиты от перебора пароля: способы интеграции storageсчетчикиспособ интеграции django snippet #1083 main databaseglobal либо IP decorator ratelimitcache memcachedIP либо IP+username decorator django-brutebuster main dbIP & username auth django-axes main dbIP login django-failedloginblocker main dbusername auth django-lockout memcachedIP auth django-redissentry redis… auth

6 Особенности реализации /django-axes/ успешный вход сбрасывает счетчик: - 4*admin, 1*hacker, 4*admin, …

7 Уязвимости реализации (устранимые) storageсчетчики django snippet #1083 main databaseglobal либо IP ratelimitcache memcachedIP либо IP+username django-brutebuster main dbIP & username django-axes main dbIP django-failedloginblocker main dbusername django-lockout memcachedIP django-redissentry redis … сброс счетчика

8 Особенности реализации /main db/ скорость обработки отказа в аутентификации => DDOS /django-axes/ успешный вход сбрасывает счетчик: - 4*admin, 1*hacker, 4*admin, …

9 main db Уязвимости реализации (устранимые) … IP username IP IP & username IP либо IP+username global либо IP счетчики memcached ratelimitcache main db django snippet #1083 redis memcached storage django-axes django-redissentry django-lockout django-failedloginblocker django-brutebuster DDOS сброс счетчика main db DDOS

10 Особенности реализации /main db/ скорость обработки отказа в аутентификации => DDOS /django-axes/ успешный вход сбрасывает счетчик: - 4*admin, 1*hacker, 4*admin, … /username/ возможность неограниченного переполнения БД

11 username IP & username IP либо IP+username username IP & username IP либо IP+ username Уязвимости реализации (устранимые) … IP global либо IP счетчики memcached ratelimitcache main db django snippet #1083 redis memcached main db storage django-axes django-redissentry django-lockout django-failedloginblocker django-brutebuster DDOS overflow подмена заголовков сброс счетчика DDOS

12 1-to-1 1-to-m m-to-1 IP-адрес + USER_AGENT блок. только 1 браузер IP-адрес + X_FORWARDED_FOR ровно 1 сет.интерф. Архитектура модуля username заодно блок. владелец эккаунта (IP-address, username)1M x 1M = 1T IP-address; username 1M + 1M = 2M; подсеть, владелец IP-address; username; whitelist много счетчиков proxy, NAT =>блок. целая подсеть IP-address

13 Архитектура модуля IP-address: username (IP, username) IP-address; username IP-address; username; whitelist *10 77 ~10 6

14 Уязвимости архитектуры (неустранимые) 1-to-11-to-mm-to-1 django snippet #1083 global либо IP ++ ratelimitcache IP либо IP+username ++ django-brutebuster IP & username +±± django-axes IP ++– django-failedloginblocker username +-+ django-lockout IP ++± django-redissentry … +++

15 Цель работы Создание надежного модуля защиты от брутфорса, который можно было бы использовать в production. Подобрать набор фильтров, который бы одновременно: позволял защищать сервер от всех перечисленных видов атак не блокировал лишний раз пользователя только по той причине, что из-под его IP была атака и/или на его эккаунт была атака не допускал возможности переполнения базы данных счетчиков.

16 Блок-схема auth error

17 Блок-схема auth error ip blacklist ? ok no yes c++

18 Блок-схема auth username blacklistB ? ok no yes ip blacklistA ? no yes error c A ++ c B ++

19 Блок-схема auth error ok no yes c A ++ ip blacklistA ? no yes c B ++ ip, username whitelist ? no yes add to whitelist username blacklistB ?

20 Блок-схема auth error username blacklistB ? ok no yes c A ++ ip blacklistA ? no yes c B ++ ip whitelist ? no yes ip,username blacklistW ? yes auth ok error c W ++ add to whitelist no

21 Диаграмма состояний failed attempts 10 min block 5 failed attempts 30 min block 5 failed attempts 1 hour block 5 failed attempts 5 min block 5 failed attempts 23 hours block 5 failed attempts 23 hours block... Try again in 5 minutes

22 Диаграмма состояний failed attempts 10 min block 5 failed attempts 30 min block 5 failed attempts 1 hour block 5 failed attempts 5 min block 5 failed attempts 23 hours block 5 failed attempts 23 hours block... 9 blocked attempts 1 hour block 9 blocked attempts 1 hour block... из исходного состоянияиз заблокированного состояния

23 Диаграмма состояний - 3 (RedisSentryPlus) 5 failed attempts 10 min block 5 failed attempts 30 min block 5 failed attempts 1 hour block 5 failed attempts 5 min block 5 failed attempts hours block 5 failed attempts hours block... 9 blocked attempts hours block 9 blocked attempts 1 hour block из исходного состоянияиз «явно» заблокированного состояния из «неявно» заблокированного состояния 3 blocked attempts hours block 3 blocked attempts hours block Try again later

24 Счетчик whitelistа IP: Username: 15 bytes ~50 bytes 4*uchar 4 bytes /24 3 bytes user_id ~8 bytes hash(username): md5(username) 16 bytes 2 32 = 4*10 9 7*10 9 (1 Nov 2011) ? 4 bytes log =6.8

25 Hash-функции 4 bytes hash-functions: - additive/xor/rot - elf/snx/djb - fnv/one-at-a-time - superfasthash/lookup3 - murmur3 - md5[:4] 300k 313k/316k/ /57/13 15/9 18/ k 98k/100k/35 364/5/0 1/9 18/ bytes hash-function: md5[:5] 1m 0 2m 4 pip install pyhash 6 bytes hash-function: md5[:6] 14m 0 00

26 Счетчики development production Ac: ip Ab: ip Bc: username Bb: username Wc: ip : username Wb: ip : username a.... A.... b.... B.... c C ip hash(username) ip hash(username) bytes

27 Админка

28 Выбор инструментария почему redis, а не couchdb? expire почему redis, а не mongodb? expire лучшая устойчивость к перезагрузкам почему redis, а не memcached? удобные структуры данных лучший контроль используемой памяти масштабирование (шардинг) почему nosql а не sql? в основном доступ key-value скорость

29 Техническая информация Лицензия: MIT Исходный код: Тестовая инсталляция: -

30 Установка и интеграция flask: django: MIDDLEWARE_CLASSES += 'redissentry.middleware.RequestMiddleware', INSTALLED_APPS += 'redissentry', protected_auth def protected_auth (username, password): sentry = RedisSentry(ip, username) ask msg = sentry. ask () if msg != : raise Exception(msg) auth result = auth (username, password) inform msg = sentry. inform (bool(result)) if msg != : raise Exception(msg) return result pip install django-redissentry

31 Заключение защита от атак: 1 IP-1 account; 1 IP-many accounts; many IP-1 account «гуманность» блокировки за счёт whitelistа невозможность произвольного переполнения базы данных счетчиков крайне высокая скорость отказа в допуске к авторизации кумулятивное нарастание времени блокировки мелкие know-how: - простейший скрипт с фикс. временем задержки блокируется на всё время его работы; - эффективное время блокировки для атакующего больше, чем для обычного пользователя; - обработка попыток авторизоваться из заблокированного состояния;

32 Спасибо за внимание! Максимов Лев Викторович RedisSentry: защищаем python web-сервер от подбора пароля на примере django

33 1-to-1 1-to-m m-to-1 IP-адрес + USER_AGENT блок. только 1 браузер IP-адрес + X_FORWARDED_FOR ровно 1 сет.интерф. Архитектура модуля username заодно блок. владелец эккаунта (IP-address, username)1M x 1M = 1T IP-address; username 1M + 1M = 2M; подсеть, владелец IP-address; username; whitelist много счетчиков proxy, NAT =>блок. целая подсеть IP-address

34 Уязвимости реализации (устранимые) storageсчетчики django snippet #1083 main dbglobal либо IP ratelimitcache memcached IP либо IP+ username django-brutebustermain db IP & username django-axesmain db IP django-failedloginblockermain dbusername django-lockout memcachedIP django-redissentry redis … DDOS overflow подмена заголовков сброс счетчика DDOS