Большинство пользователей до сих пор ставят себе на аккаунты простые пароли — комбинации даты рождения, имени любимого футболиста, клички питомца, не подозревая, что вся эта информация находится в открытом доступе. Используя ее, брутфорсер может значительно облегчить себе задачу угона аккаунтов. Чтобы этому противодействовать, вводят антибрутфорс (АБФ). Как оценить качество его работы? Как вычислить взломщика-брутфорсера и отделить его вредоносные запросы от легитимных? В этой статье я расскажу, каким образом эти задачи были решены у нас в компании.

Очень часто, вместо того чтобы ставить в систему сложный АБФ, админы ограничиваются простым правилом: если количество неудачных запросов за определенный период превышает заданное значение, то надо заблокировать все запросы с этого IP на некоторое время или вывести капчу. Возможно, для каких-нибудь довольно простых сайтов такое решение действительно будет работать, но, когда речь заходит о проектах с большим числом пользователей, могут возникнуть проблемы.

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

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

Если решишь использовать у себя стороннее, продвинутое решение, то надо убедиться, что оно правильно сконфигурировано для работы именно с твоей системой. Если этого не сделать, результат может получиться не лучше, чем у простого правила с рейт-лимитами, а ресурсов для своего содержания такой АБФ будет требовать в разы больше.

Для АБФ очень важно найти компромисс между простотой, качеством и ограничениями, накладываемыми на удобство пользования.

Приведу пример одной типичной проблемы, с которой можно столкнуться при конфигурации. Рассмотрим следующее правило: если за определенное время t отношение числа успешных авторизаций к их общему числу меньше, чем q, а общее число запросов с этого IP больше, чем p, считаем, что с этого адреса идет брутфорс. Если посмотреть внимательнее, оно представляет собой простое дерево решений (рис. 1).

Рис. 1. Дерево решений
Рис. 1. Дерево решений

Здесь каждому IP-адресу соответствует точка на плоскости, а описанное выше правило будет разбивать саму плоскость таким образом, как показано на рис. 2.

Рис. 2. Разбиение пространства признаков
Рис. 2. Разбиение пространства признаков

Основанный на таком правиле АБФ будет отлавливать лишь тех пользователей, что попадут в правый нижний угол. Опытным путем можно определить границу решающих правил: находясь на ней, получится брутить более эффективно, чем внутри зеленой области.

Если быть более точным, то оптимально такое соотношение n_requests / success rate, которое попадает в вершины красной области (рис. 2). Чем ближе к этим вершинам будет работать брутфорсер, тем эффективнее получатся его результаты.

Поэтому при конфигурации такого АБФ параметром оптимизации будет центральная вершина квадрата. Ее расположение определяет работу всей системы. Если она окажется слишком низко, то мы дадим большую свободу брутфорсерам; если же слишком высоко, то вполне можем урезать нормальных пользователей. Такой трейдоф типичен для систем АБФ.

При неправильной настройке он практически не мешает брутить. Здесь, например, брутфорсер может использовать несколько своих аккаунтов для успешной авторизации, чтобы поднять свой success rate до нужного уровня, что в итоге позволит ему увеличить общее число запросов.

Рис. 3. Выбор разделяющей границы
Рис. 3. Выбор разделяющей границы

Конечной целью конфигурации системы АБФ будет построение такой разделяющей границы, которая пройдет как можно ближе к нормальным пользователям и при этом сделает саму попытку брутфорса как можно более бессмысленной (затратной по времени и ресурсам).

Если с этим примером все довольно просто, то как в общем случае понять, какие значения параметров оптимальны? Какой процент брутфорсеров пропускает система и сколько нормальных пользователей она блокирует? Если каждый день к тебе поступают несколько миллионов запросов, которые выливаются в сотни мегабайт логов, разобраться с этим вручную невозможно. Придется либо использовать готовое решение, либо писать свое, но полностью исключить участие человека в анализе будет непросто — в результате может получиться аналогичная система АБФ, может, чуть лучше или хуже.

Так как мало что сравнится по эффективности с ручным анализом, я предлагаю от него не отказываться, а сделать более удобным с помощью некоторых алгоритмов машинного обучения. Можно заставить программу выполнить большую часть вычислений, аналогичных тем, что проводит АБФ, выделить группы похожих между собой пользователей, а потом для каждой такой группы вручную расставить метки.

Если быть более точным, я предлагаю провести анализ в несколько этапов:

  • собрать данные, доступные о пользователях системы за некоторый промежуток времени;
  • провести кластеризацию пользователей на основе этих данных (выделить группы наиболее похожих по поведению пользователей);
  • вручную определить, в какие кластеры попали брутфорсеры;
  • сделать выводы на основе полученных результатов.

Есть несколько возможных вариантов использования этих результатов, но о них я расскажу позже, пока перейдем к первому этапу — сбору данных.

Продолжение статьи доступно только подписчикам

Вариант 1. Оформи подписку на «Хакер», чтобы читать все статьи на сайте

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта, включая эту статью. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

Вариант 2. Купи одну статью

Заинтересовала статья, но нет возможности оплатить подписку? Тогда этот вариант для тебя! Обрати внимание: этот способ покупки доступен только для статей, опубликованных более двух месяцев назад.


3 комментария

Подпишитесь на ][, чтобы участвовать в обсуждении

Обсуждение этой статьи доступно только нашим подписчикам. Вы можете войти в свой аккаунт или зарегистрироваться и оплатить подписку, чтобы свободно участвовать в обсуждении.

Check Also

Конкурс хаков: пишем на PowerShell скрипт, который уведомляет о днях рождения пользователей Active Directory

В компаниях часто встречается задача уведомлять сотрудников о приближающихся днях рождения…