RedisSentry, Antibruteforce App for Django

  • 324 views
Uploaded on

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

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

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
324
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
2
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. RedisSentry: защищаем python web-серверот подбора пароля на примере django Максимов Лев Викторович 9 Jul 2012
  • 2. ~7000 шт/час 1 IP, 1 процесс 2
  • 3. Способы борьбы с перебором пароля• Captcha, (Сompletely Automated Public Turing test to tell Computers and Humans Apart) + отпугивает не особо заинтересованных атакующих − отпугивает и обычних пользователей тоже + скрипт из пары строчек уже не сработает − есть специализированные программы-распознаватели и люди-распознаватели• Throttling, задержка ответа сервера + несколько снижает эффективность атаки − может раздражать пользователя − сложности реализации на синхронном сервере• Блокировки, не допускает к аутентификации в течение некоторого времени + практически неощутимо для пользователя + более эффективно сдерживает атаки 3
  • 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. Модули защиты от перебора пароля: способы интеграции 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. Особенности реализации• /django-axes/ успешный вход сбрасывает счетчик: - 4*admin, 1*hacker, 4*admin, … 6
  • 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. Особенности реализации • /django-axes/ успешный вход сбрасывает счетчик: - 4*admin, 1*hacker, 4*admin, …• /main db/ скорость обработки отказа в аутентификации => DDOS 8
  • 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. Особенности реализации • /django-axes/ успешный вход сбрасывает счетчик: - 4*admin, 1*hacker, 4*admin, …• /main db/ скорость обработки отказа в аутентификации => DDOS • /username/ возможность неограниченного переполнения БД 10
  • 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. Архитектура модуля 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. Архитектура модуля • 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. Уязвимости архитектуры (неустранимые) 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. Цель работы Создание надежного модуля защиты от брутфорса, который можно было бы использовать в production.Подобрать набор фильтров, который бы одновременно: − позволял защищать сервер от всех перечисленных видов атак − не блокировал лишний раз пользователя только по той причине,что из-под его IP была атака и/или на его эккаунт была атака − не допускал возможности переполнения базы данных счетчиков. 15
  • 16. Блок-схема errorauth 16
  • 17. Блок-схема yesip ∈ blacklist ? no error auth c++ ok 17
  • 18. Блок-схема yes ip ∈ blacklistA ? no yesusername ∈ blacklistB ? no error auth cA++ cB++ ok 18
  • 19. Блок-схема ip, username ∈ whitelist ? no yes yes ip ∈ blacklistA ? no yes username ∈ blacklistB ? no error auth cA++ cB++ ok add to whitelist 19
  • 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. Диаграмма состояний - 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. Диаграмма состояний - 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. Диаграмма состояний - 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. Счетчик 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. 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. Счетчики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
  • 28. Выбор инструментария• почему nosql а не sql? − в основном доступ key-value − скорость • почему redis, а не couchdb? − expire• почему redis, а не mongodb? − expire − лучшая устойчивость к перезагрузкам• почему redis, а не memcached? − удобные структуры данных − лучший контроль используемой памяти − масштабирование (шардинг) 28
  • 29. Техническая информация• Лицензия: MIT• Исходный код: - https://github.com/axil/redissentry-core - https://github.com/axil/django-redissentry• Тестовая инсталляция: - http://redissentry.alwaysdata.net 29
  • 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. Заключение• защита от атак: 1 IP-1 account; 1 IP-many accounts; many IP-1 account• «гуманность» блокировки за счёт whitelist’а• невозможность произвольного переполнения базы данных счетчиков• крайне высокая скорость отказа в допуске к авторизации• кумулятивное нарастание времени блокировки• мелкие know-how:- простейший скрипт с фикс. временем задержки блокируется на всё время его работы; - эффективное время блокировки для атакующего больше, чем для обычного пользователя; - обработка попыток авторизоваться из заблокированного состояния; 31
  • 32. Спасибо за внимание! RedisSentry: защищаем python web-сервер от подбора пароля на примере django Максимов Лев Викторович 32