'

RedisSentry: защищаем python web-сервер от подбора пароля на примере django

Понравилась презентация – покажи это...





Слайд 0

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


Слайд 1

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


Слайд 2

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


Слайд 3

4 Модули защиты от перебора пароля: взлом твиттера Социальная сеть


Слайд 4

5 Модули защиты от перебора пароля: способы интеграции


Слайд 5

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


Слайд 6

7 Уязвимости реализации (устранимые) сброс счетчика


Слайд 7

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


Слайд 8

9 main db main db main db main db main db 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 DDOS DDOS сброс счетчика main db DDOS


Слайд 9

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


Слайд 10

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


Слайд 11

12 1-to-1 1-to-m m-to-1 Архитектура модуля proxy, NAT =>блок. целая подсеть IP-address


Слайд 12

13 Архитектура модуля • IP-address: 1.2.3.4 joe@me.ru


Слайд 13

14 Уязвимости архитектуры (неустранимые)


Слайд 14

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


Слайд 15

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


Слайд 16

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


Слайд 17

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


Слайд 18

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


Слайд 19

20 Блок-схема auth error username ? blacklistB ? ok no yes cA++ ip ? blacklistA ? no yes cB++ ip ? whitelist ? no yes ip,username ? blacklistW ? yes auth ok error cW++ add to whitelist no


Слайд 20

21 Диаграмма состояний - 1 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 23 hours block 5 failed attempts 23 hours block . . .


Слайд 21

22 Диаграмма состояний - 2 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 23 hours block 5 failed attempts 23 hours block . . . 9 blocked attempts 1 hour block 9 blocked attempts 1 hour block . . . из исходного состояния из заблокированного состояния


Слайд 22

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 9 blocked attempts 3..23 hours block 9 blocked attempts 1 hour block из исходного состояния из «явно» заблокированного состояния из «неявно» заблокированного состояния 3 blocked attempts 3..23 hours block 3 blocked attempts 3..23 hours block


Слайд 23

24 Счетчик whitelist’а • IP: 193.124.10.53 Username: somebody@somewhere.com 15 bytes ~50 bytes 4*uchar 4 bytes /24 3 bytes user_id ~8 bytes hash(username): md5(username) 16 bytes 232 = 4*109 7*109 (1 Nov 2011) ? 4 bytes log26 232=6.8


Слайд 24

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/173 2166/57/13 15/9 18/10 5 9 100k 98k/100k/35 364/5/0 1/9 18/10 0 1


Слайд 25

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) 18 18 53 53 68 68 5 5 5 5 8 8 bytes bytes


Слайд 26

27 Админка


Слайд 27

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


Слайд 28

29 Техническая информация • Лицензия: MIT • Исходный код: - https://github.com/axil/redissentry-core - https://github.com/axil/django-redissentry • Тестовая инсталляция: - http://redissentry.alwaysdata.net


Слайд 29

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


Слайд 30

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


Слайд 31

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


Слайд 32

33 1-to-1 1-to-m m-to-1 Архитектура модуля proxy, NAT =>блок. целая подсеть IP-address


Слайд 33

34 Уязвимости реализации (устранимые) DDOS DDOS DDOS overflow overflow overflow подмена заголовков сброс счетчика DDOS


×

HTML:





Ссылка: