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

Содержание

Слайд 2

~7000 шт/час

1 IP, 1 процесс

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

Слайд 3

Способы борьбы с перебором пароля

Captcha, (Сompletely Automated Public Turing test to tell

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

Слайд 4

Модули защиты от перебора пароля:

взлом твиттера

Социальная сеть

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

Слайд 5

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

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

Слайд 6

Особенности реализации

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

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

Слайд 7

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

сброс счетчика

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

Слайд 8

Особенности реализации

• /main db/ скорость обработки отказа в аутентификации => DDOS

• /django-axes/

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

Слайд 9

main db

main db

main db

main db

main db

main db

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


IP

username

IP

IP & username

IP либо

main db main db main db main db main db main db
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

Слайд 10

Особенности реализации

• /main db/ скорость обработки отказа в аутентификации => DDOS

• /django-axes/

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

• /username/ возможность неограниченного переполнения БД

Слайд 11

username

IP & username

IP либо IP+username

username

IP & username

IP либо IP+username

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


IP

IP

global либо

username IP & username IP либо IP+username username IP & username IP
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

Слайд 12

1-to-1 1-to-m m-to-1

Архитектура модуля

proxy, NAT =>блок. целая подсеть

IP-address

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

Слайд 13

Архитектура модуля

• IP-address:

1.2.3.4

joe@me.ru

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

Слайд 14

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

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

Слайд 15

Цель работы

Создание надежного модуля защиты от брутфорса, который можно было бы

Цель работы Создание надежного модуля защиты от брутфорса, который можно было бы
использовать в production.

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

Слайд 16

Блок-схема

auth

error

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

Слайд 17

Блок-схема

auth

error

ip ∈ blacklist ?

ok

no

yes

c++

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

Слайд 18

Блок-схема

auth

username ∈ blacklistB ?

ok

no

yes

ip ∈ blacklistA ?

no

yes

error

cA++

cB++

Блок-схема auth username ∈ blacklistB ? ok no yes ip ∈ blacklistA

Слайд 19

Блок-схема

auth

error

ok

no

yes

cA++

ip ∈ blacklistA ?

no

yes

cB++

ip, username ∈ whitelist ?

no

yes

add to
whitelist

username ∈ blacklistB

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

Слайд 20

Блок-схема

auth

error

username ∈ blacklistB ?

ok

no

yes

cA++

ip ∈ blacklistA ?

no

yes

cB++

ip ∈ whitelist ?

no

yes

ip,username ∈ blacklistW

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

yes

auth

ok

error

cW++

add to
whitelist

no

Слайд 21

Диаграмма состояний - 1

5 failed attempts

10 min block

5 failed attempts

30 min block

5

Диаграмма состояний - 1 5 failed attempts 10 min block 5 failed
failed attempts

1 hour block

5 failed attempts

5 min block

5 failed attempts

23 hours block

5 failed attempts

23 hours block

. . .

Слайд 22

Диаграмма состояний - 2

5 failed attempts

10 min block

5 failed attempts

30 min block

5

Диаграмма состояний - 2 5 failed attempts 10 min block 5 failed
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

Диаграмма состояний - 3 (RedisSentryPlus) 5 failed attempts 10 min block 5
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

Слайд 24

Счетчик whitelist’а

• IP: 193.124.10.53 Username: somebody@somewhere.com

15 bytes ~50 bytes

4*uchar 4 bytes

Счетчик whitelist’а • IP: 193.124.10.53 Username: somebody@somewhere.com 15 bytes ~50 bytes 4*uchar
/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

Слайд 25

Hash-функции

• 4 bytes hash-functions:
- additive/xor/rot
- elf/snx/djb
- fnv/one-at-a-time
- superfasthash/lookup3

Hash-функции • 4 bytes hash-functions: - additive/xor/rot - elf/snx/djb - fnv/one-at-a-time -
- 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

Слайд 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

Счетчики development production Ac:ip Ab:ip Bc:username Bb:username Wc:ip:username Wb:ip:username a.... A.... b....

Слайд 27

Админка

Админка

Слайд 28

Выбор инструментария

• почему redis, а не couchdb?
− expire

• почему redis, а

Выбор инструментария • почему redis, а не couchdb? − expire • почему
не mongodb?
− expire
− лучшая устойчивость к перезагрузкам

• почему redis, а не memcached?
− удобные структуры данных
− лучший контроль используемой памяти
− масштабирование (шардинг)

• почему nosql а не sql?
− в основном доступ key-value
− скорость

Слайд 29

Техническая информация

• Лицензия: MIT

• Исходный код:
- https://github.com/axil/redissentry-core
- https://github.com/axil/django-redissentry

• Тестовая

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

Слайд 30

Установка и интеграция

• flask:

• django:
MIDDLEWARE_CLASSES += 'redissentry.middleware.RequestMiddleware',
INSTALLED_APPS += 'redissentry',

def protected_auth(username,

Установка и интеграция • flask: • django: MIDDLEWARE_CLASSES += 'redissentry.middleware.RequestMiddleware', INSTALLED_APPS +=
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

Слайд 31

Заключение

• защита от атак: 1 IP-1 account; 1 IP-many accounts; many IP-1

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

Слайд 32

Спасибо за внимание!

Максимов Лев Викторович

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

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

Слайд 33

1-to-1 1-to-m m-to-1

Архитектура модуля

proxy, NAT =>блок. целая подсеть

IP-address

1-to-1 1-to-m m-to-1 Архитектура модуля proxy, NAT =>блок. целая подсеть IP-address
Имя файла: RedisSentry:-защищаем-python-web-сервер-от-подбора-пароля-на-примере-django.pptx
Количество просмотров: 161
Количество скачиваний: 0