Содержание статьи
Очень часто, вместо того чтобы ставить в систему сложный АБФ, админы ограничиваются простым правилом: если количество неудачных запросов за определенный период превышает заданное значение, то надо заблокировать все запросы с этого IP на некоторое время или вывести капчу. Возможно, для каких-нибудь довольно простых сайтов такое решение действительно будет работать, но, когда речь заходит о проектах с большим числом пользователей, могут возникнуть проблемы.
Выставлять длительные блокировки по IP-адресам не будет хорошим решением: взломщик может этим воспользоваться и заблокировать авторизацию сразу для большого числа пользователей, просто меняя IP-адрес пакетов.
Использовать капчу — вариант не для всех: чем чаще ее показываешь, тем больше затрудняешь пользование сайтом. Поэтому на некоторые запросы, например в мобильных приложениях, ее могут просто не ставить. И, на мой взгляд, очень важно пресекать попытку брутфорса именно на этапе обращения к серверу авторизации.
Если решишь использовать у себя стороннее, продвинутое решение, то надо убедиться, что оно правильно сконфигурировано для работы именно с твоей системой. Если этого не сделать, результат может получиться не лучше, чем у простого правила с рейт-лимитами, а ресурсов для своего содержания такой АБФ будет требовать в разы больше.
Для АБФ очень важно найти компромисс между простотой, качеством и ограничениями, накладываемыми на удобство пользования.
Приведу пример одной типичной проблемы, с которой можно столкнуться при конфигурации. Рассмотрим следующее правило: если за определенное время t отношение числа успешных авторизаций к их общему числу меньше, чем q, а общее число запросов с этого IP больше, чем p, считаем, что с этого адреса идет брутфорс. Если посмотреть внимательнее, оно представляет собой простое дерево решений (рис. 1).
Здесь каждому IP-адресу соответствует точка на плоскости, а описанное выше правило будет разбивать саму плоскость таким образом, как показано на рис. 2.
Основанный на таком правиле АБФ будет отлавливать лишь тех пользователей, что попадут в правый нижний угол. Опытным путем можно определить границу решающих правил: находясь на ней, получится брутить более эффективно, чем внутри зеленой области.
Если быть более точным, то оптимально такое соотношение n_requests / success rate, которое попадает в вершины красной области (рис. 2). Чем ближе к этим вершинам будет работать брутфорсер, тем эффективнее получатся его результаты.
Поэтому при конфигурации такого АБФ параметром оптимизации будет центральная вершина квадрата. Ее расположение определяет работу всей системы. Если она окажется слишком низко, то мы дадим большую свободу брутфорсерам; если же слишком высоко, то вполне можем урезать нормальных пользователей. Такой трейдоф типичен для систем АБФ.
При неправильной настройке он практически не мешает брутить. Здесь, например, брутфорсер может использовать несколько своих аккаунтов для успешной авторизации, чтобы поднять свой success rate до нужного уровня, что в итоге позволит ему увеличить общее число запросов.
Конечной целью конфигурации системы АБФ будет построение такой разделяющей границы, которая пройдет как можно ближе к нормальным пользователям и при этом сделает саму попытку брутфорса как можно более бессмысленной (затратной по времени и ресурсам).
Если с этим примером все довольно просто, то как в общем случае понять, какие значения параметров оптимальны? Какой процент брутфорсеров пропускает система и сколько нормальных пользователей она блокирует? Если каждый день к тебе поступают несколько миллионов запросов, которые выливаются в сотни мегабайт логов, разобраться с этим вручную невозможно. Придется либо использовать готовое решение, либо писать свое, но полностью исключить участие человека в анализе будет непросто — в результате может получиться аналогичная система АБФ, может, чуть лучше или хуже.
Так как мало что сравнится по эффективности с ручным анализом, я предлагаю от него не отказываться, а сделать более удобным с помощью некоторых алгоритмов машинного обучения. Можно заставить программу выполнить большую часть вычислений, аналогичных тем, что проводит АБФ, выделить группы похожих между собой пользователей, а потом для каждой такой группы вручную расставить метки.
Если быть более точным, я предлагаю провести анализ в несколько этапов:
- собрать данные, доступные о пользователях системы за некоторый промежуток времени;
- провести кластеризацию пользователей на основе этих данных (выделить группы наиболее похожих по поведению пользователей);
- вручную определить, в какие кластеры попали брутфорсеры;
- сделать выводы на основе полученных результатов.
Есть несколько возможных вариантов использования этих результатов, но о них я расскажу позже, пока перейдем к первому этапу — сбору данных.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»