RedisSentry:    защищаем python web-серверот подбора пароля на примере django           Максимов Лев Викторович           ...
~7000 шт/час   1 IP, 1 процесс               2
Способы борьбы с перебором пароля•   Captcha,   (Сompletely Automated Public Turing test to tell Computers and Humans Apar...
Модули защиты от перебора пароля:                              first commit-     author        storage          счетчики  ...
Модули защиты от перебора пароля:                     способы интеграции                              storage           сч...
Особенности реализации• /django-axes/ успешный вход сбрасывает счетчик:   - 4*admin, 1*hacker, 4*admin, …                 ...
Уязвимости реализации (устранимые)                                  storage           счетчикиdjango snippet #1083        ...
Особенности реализации  • /django-axes/ успешный вход сбрасывает счетчик:     - 4*admin, 1*hacker, 4*admin, …• /main db/ с...
Уязвимости реализации (устранимые)                                 storage               счетчикиdjango snippet #1083     ...
Особенности реализации  • /django-axes/ успешный вход сбрасывает счетчик:     - 4*admin, 1*hacker, 4*admin, …• /main db/ с...
Уязвимости реализации (устранимые)                                   storage                счетчикиdjango snippet #1083  ...
Архитектура модуля                                     1-to-1 1-to-m m-to-1 IP-address                                    ...
Архитектура модуля   • IP-address:                      • username                          • (IP,username)               ...
Уязвимости архитектуры (неустранимые)                                             1-to-1   1-to-m        m-to-1django snip...
Цель работы              Создание надежного модуля защиты от брутфорса,              который можно было бы использовать в ...
Блок-схема       errorauth               16
Блок-схема                           yesip ∈ blacklist ?         no                   error     auth                     c...
Блок-схема                          yes   ip ∈ blacklistA ?            no                              yesusername ∈ black...
Блок-схема                   ip, username ∈ whitelist ?                                    no                             ...
Блок-схема                                ip ∈ whitelist ?                                                   no           ...
Диаграмма состояний - 1                                           Try again in 5 minutes5 failed attempts                 ...
Диаграмма состояний - 2         из исходного состояния                из заблокированного состояния5 failed attempts      ...
Диаграмма состояний - 3 (RedisSentryPlus)     из исходного состояния                    из «явно» заблокированного состоян...
Счетчик whitelist’а• IP: 193.124.10.53           Username: somebody@somewhere.com             15 bytes                    ...
Hash-функции• 4 bytes hash-functions:      100k              300k  - additive/xor/rot         98k/100k/35       313k/316k/...
Счетчикиbytes   development                   production               bytes 18      Ac:ip                          a.... ...
Админка          27
Выбор инструментария• почему nosql а не sql? − в основном доступ key-value − скорость • почему redis, а не couchdb?  − exp...
Техническая информация• Лицензия: MIT• Исходный код:  - https://github.com/axil/redissentry-core  - https://github.com/axi...
Установка и интеграция pip install django-redissentry• django:   MIDDLEWARE_CLASSES += redissentry.middleware.RequestMiddl...
Заключение• защита от атак: 1 IP-1 account; 1 IP-many accounts; many IP-1 account• «гуманность» блокировки за счёт whiteli...
Спасибо за внимание!     RedisSentry: защищаем python web-сервер         от подбора пароля на примере django              ...
Upcoming SlideShare
Loading in...5
×

RedisSentry, Antibruteforce App for Django

394

Published on

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

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
394
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

RedisSentry, Antibruteforce App for Django

  1. 1. RedisSentry: защищаем python web-серверот подбора пароля на примере django Максимов Лев Викторович 9 Jul 2012
  2. 2. ~7000 шт/час 1 IP, 1 процесс 2
  3. 3. Способы борьбы с перебором пароля• Captcha, (Сompletely Automated Public Turing test to tell Computers and Humans Apart) + отпугивает не особо заинтересованных атакующих − отпугивает и обычних пользователей тоже + скрипт из пары строчек уже не сработает − есть специализированные программы-распознаватели и люди-распознаватели• Throttling, задержка ответа сервера + несколько снижает эффективность атаки − может раздражать пользователя − сложности реализации на синхронном сервере• Блокировки, не допускает к аутентификации в течение некоторого времени + практически неощутимо для пользователя + более эффективно сдерживает атаки 3
  4. 4. Модули защиты от перебора пароля: first commit- author storage счетчики last commitdjango snippet #1083 24 Sep 2008 – jensbreit main db global либо IP 24 Sep 2008 взлом твиттера 7 Jan 2009 - Simon IP либоratelimitcache memcached 24 Sep 2009 Wilson IP+username 30 Nov 2009 –django-brutebuster (company) main db IP & username 6 Mar 2011 Социальная сеть 1 Oct 2010 - Joshdjango-axes main db IP 18 May 2012 VanderLinden 12 Jan 2011 –django-failedloginblocker Alex Kuhl main db username 3 Mar 2011 24 Jul 2011 – Brian Jaydjango-lockout Stanley memcached IP 18 Oct 2011django-redissentry 9 Apr 2012 – me redis … 3 May 2012 4
  5. 5. Модули защиты от перебора пароля: способы интеграции storage счетчики способ интеграцииdjango snippet #1083 main database global либо IP decoratorratelimitcache memcached IP либо IP+username decoratordjango-brutebuster main db IP & username authdjango-axes main db IP logindjango-failedloginblocker main db username authdjango-lockout memcached IP authdjango-redissentry redis … auth 5
  6. 6. Особенности реализации• /django-axes/ успешный вход сбрасывает счетчик: - 4*admin, 1*hacker, 4*admin, … 6
  7. 7. Уязвимости реализации (устранимые) storage счетчикиdjango snippet #1083 main database global либо IPratelimitcache memcached IP либо IP+usernamedjango-brutebuster main db IP & username сбросdjango-axes main db IP счетчикаdjango-failedloginblocker main db usernamedjango-lockout memcached IPdjango-redissentry redis … 7
  8. 8. Особенности реализации • /django-axes/ успешный вход сбрасывает счетчик: - 4*admin, 1*hacker, 4*admin, …• /main db/ скорость обработки отказа в аутентификации => DDOS 8
  9. 9. Уязвимости реализации (устранимые) storage счетчикиdjango snippet #1083 main db DDOS global либо IPratelimitcache memcached IP либо IP+username DDOSdjango-brutebuster main db IP & username сброс DDOSdjango-axes main db IP счетчика DDOSdjango-failedloginblocker main db usernamedjango-lockout memcached IPdjango-redissentry redis … 9
  10. 10. Особенности реализации • /django-axes/ успешный вход сбрасывает счетчик: - 4*admin, 1*hacker, 4*admin, …• /main db/ скорость обработки отказа в аутентификации => DDOS • /username/ возможность неограниченного переполнения БД 10
  11. 11. Уязвимости реализации (устранимые) storage счетчикиdjango snippet #1083 main db DDOS global либо IP overflowratelimitcache memcached IP либо IP+username DDOS overflowdjango-brutebuster main db IP & username сброс DDOSdjango-axes main db IP счетчика DDOS overflowdjango-failedloginblocker main db username подменаdjango-lockout заголовков memcached IPdjango-redissentry redis … 11
  12. 12. Архитектура модуля 1-to-1 1-to-m m-to-1 IP-address proxy, NAT =>блок. целая подсеть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 много счетчиков 12
  13. 13. Архитектура модуля • IP-address: • username • (IP,username) 1.2.3.4 1.2.3.4 1.2.3.4 6*1077joe@me.ru • IP-address; username • IP-address; username; whitelist 1.2.3.4 1.2.3.4 ~106 joe@me.ru joe@me.ru 13
  14. 14. Уязвимости архитектуры (неустранимые) 1-to-1 1-to-m m-to-1django snippet #1083 global либо IP + + IP либо + +ratelimitcache IP+usernamedjango-brutebuster IP & username + ± ±django-axes IP + + – + - +django-failedloginblocker usernamedjango-lockout IP + + ±django-redissentry … + + + 14
  15. 15. Цель работы Создание надежного модуля защиты от брутфорса, который можно было бы использовать в production.Подобрать набор фильтров, который бы одновременно: − позволял защищать сервер от всех перечисленных видов атак − не блокировал лишний раз пользователя только по той причине,что из-под его IP была атака и/или на его эккаунт была атака − не допускал возможности переполнения базы данных счетчиков. 15
  16. 16. Блок-схема errorauth 16
  17. 17. Блок-схема yesip ∈ blacklist ? no error auth c++ ok 17
  18. 18. Блок-схема yes ip ∈ blacklistA ? no yesusername ∈ blacklistB ? no error auth cA++ cB++ ok 18
  19. 19. Блок-схема ip, username ∈ whitelist ? no yes yes ip ∈ blacklistA ? no yes username ∈ blacklistB ? no error auth cA++ cB++ ok add to whitelist 19
  20. 20. Блок-схема ip ∈ whitelist ? no yes yes ip ∈ blacklistA ? yes ip,username ∈ blacklistW ? no yes username ∈ blacklistB ? no no error error auth auth cW++ cA++ ok ok cB++ add to whitelist 20
  21. 21. Диаграмма состояний - 1 Try again in 5 minutes5 failed attempts 5 min block5 failed attempts 10 min block5 failed attempts 30 min block5 failed attempts 1 hour block5 failed attempts 23 hours block5 failed attempts 23 hours block ... 21
  22. 22. Диаграмма состояний - 2 из исходного состояния из заблокированного состояния5 failed attempts 5 min block5 failed attempts 10 min block 9 blocked attempts5 failed attempts 1 hour block 30 min block 9 blocked attempts5 failed attempts 1 hour block 1 hour block5 failed attempts ... 23 hours block5 failed attempts 23 hours block ... 22
  23. 23. Диаграмма состояний - 3 (RedisSentryPlus) из исходного состояния из «явно» заблокированного состояния5 failed attempts 5 min block 9 blocked attempts5 failed attempts 1 hour block 10 min block 9 blocked attempts5 failed attempts 3..23 hours block 30 min block5 failed attempts 1 hour block5 failed attempts 3..23 hours block из «неявно» заблокированного состояния5 failed attempts 3..23 hours block ... 3 blocked attempts 3..23 hours block 3 blocked attempts 3..23 hours block “Try again later” 23
  24. 24. Счетчик whitelist’а• IP: 193.124.10.53 Username: somebody@somewhere.com 15 bytes ~50 bytes 4*uchar 4 bytes user_id ~8 bytes /24 3 bytes hash(username): md5(username) 16 bytes ? 4 bytes 232 = 4*109 7*109 (1 Nov 2011) log26 232=6.8 24
  25. 25. Hash-функции• 4 bytes hash-functions: 100k 300k - additive/xor/rot 98k/100k/35 313k/316k/173 - elf/snx/djb 364/5/0 2166/57/13 - fnv/one-at-a-time 1/9 15/9 - superfasthash/lookup3 18/10 18/10 pip install pyhash - murmur3 0 5 - md5[:4] 1 9 1m 2m • 5 bytes hash-function: md5[:5] 0 4 14m • 6 bytes hash-function: md5[:6] 0 0 0 25
  26. 26. Счетчикиbytes development production bytes 18 Ac:ip a.... 5 ip 18 Ab:ip A.... 5 53 Bc:username b.... 5 hash(username) 53 Bb:username B.... 5 68 Wc:ip:username c....... 8 ip hash(username) 68 Wb:ip:username C....... 8 26
  27. 27. Админка 27
  28. 28. Выбор инструментария• почему nosql а не sql? − в основном доступ key-value − скорость • почему redis, а не couchdb? − expire• почему redis, а не mongodb? − expire − лучшая устойчивость к перезагрузкам• почему redis, а не memcached? − удобные структуры данных − лучший контроль используемой памяти − масштабирование (шардинг) 28
  29. 29. Техническая информация• Лицензия: MIT• Исходный код: - https://github.com/axil/redissentry-core - https://github.com/axil/django-redissentry• Тестовая инсталляция: - http://redissentry.alwaysdata.net 29
  30. 30. Установка и интеграция pip install django-redissentry• django: MIDDLEWARE_CLASSES += redissentry.middleware.RequestMiddleware, INSTALLED_APPS += redissentry,• flask: 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 30
  31. 31. Заключение• защита от атак: 1 IP-1 account; 1 IP-many accounts; many IP-1 account• «гуманность» блокировки за счёт whitelist’а• невозможность произвольного переполнения базы данных счетчиков• крайне высокая скорость отказа в допуске к авторизации• кумулятивное нарастание времени блокировки• мелкие know-how:- простейший скрипт с фикс. временем задержки блокируется на всё время его работы; - эффективное время блокировки для атакующего больше, чем для обычного пользователя; - обработка попыток авторизоваться из заблокированного состояния; 31
  32. 32. Спасибо за внимание! RedisSentry: защищаем python web-сервер от подбора пароля на примере django Максимов Лев Викторович 32
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×