Хотел бы рассказать о достаточно простом статистическом методе защиты от DDoS, а именно я использовал критерий согласия Пирсона проверки простой гипотезы. Метод, на мой взгляд, простой и достаточно эффективный, позволяет «ловить» ботов, которые посылают запросы с интервалами, в соответствии с одним и тем же распределением.
Вначале приведу исходные данные — это log-файлы сервера в формате *.txt. Первоначальной целью был поиск пользователей, которые посылают слишком много запросов. Эту «проблему» я решил очень быстро, написав на c++ программу, которая объединяла пользователей в группы по минимальному интервалу между 3 ближайшими запросами. Почему именно 3, а не например 4, 5? Просто пришел к выводу, что 2 это не очень интересно, а данный критерий позволял получить поверхностную информацию. Но это было не столь интересно для меня.
Перейду к самому критерию. Не буду вдаваться в математику, но критерий согласия позволяет понять насколько одно распределение похоже на другое, при этом найти вероятность ошибки. В данном случае, за случайную величину я взял интервал между двумя запросами одного пользователя. Далее создал профиль среднестатистического пользователя, построив распределение абсолютно по всем интервалам. И начал сравнивать с профилями, построенными для каждого пользователя, с количеством запросов превышающих некоторый порог, лично для себя я его определил как 20 запросов. Таким образом были отсеяны все случайные пользователи или не особо активные. Результатом я остался недоволен, так как практически никто своим поведением не походил на «среднего».
И тут у меня возникла идея: можно создать «плохой» профиль и соответственно отсеять всех, кто на него похож. За таким профилем я далеко ходить не стал, а просто создал его искусственно, им стало равномерное распределение с границами 2 и 5 секунды. Т.е. фактически я нацеливался поймать всех, кто посылал запросы более менее равномерно с интервалами от 2 до 5 секунд, и о чудо, такие нашлись! В итоге я отловил нескольких людей, сканирующих сайт. Но понятно, что это не является основным результатом.
У некоторых может возникнуть вопрос: «а зачем все это надо?» И правда, самому искусственно придумывать «профили» возможных ботов — дело неблагодарное. Но данный метод позволяет начать «ловить» сразу после того как набирается на каждого некоторое пороговое значение для количества запросов. Кстати, критерий достаточно чувствителен и с достаточно малой вероятностью ошибки ловит ботов по собственному профилю уже на малом количестве запросов. Само собой это зависит от «сложности» распределения.
Данный метод очень прост, а также позволяет выявлять атаку в случае, если боты написаны «на коленке» и все поголовно посылают запросы пусть даже через случайные интервалы времени, но при этом с одним распределением.
Вначале приведу исходные данные — это log-файлы сервера в формате *.txt. Первоначальной целью был поиск пользователей, которые посылают слишком много запросов. Эту «проблему» я решил очень быстро, написав на c++ программу, которая объединяла пользователей в группы по минимальному интервалу между 3 ближайшими запросами. Почему именно 3, а не например 4, 5? Просто пришел к выводу, что 2 это не очень интересно, а данный критерий позволял получить поверхностную информацию. Но это было не столь интересно для меня.
Перейду к самому критерию. Не буду вдаваться в математику, но критерий согласия позволяет понять насколько одно распределение похоже на другое, при этом найти вероятность ошибки. В данном случае, за случайную величину я взял интервал между двумя запросами одного пользователя. Далее создал профиль среднестатистического пользователя, построив распределение абсолютно по всем интервалам. И начал сравнивать с профилями, построенными для каждого пользователя, с количеством запросов превышающих некоторый порог, лично для себя я его определил как 20 запросов. Таким образом были отсеяны все случайные пользователи или не особо активные. Результатом я остался недоволен, так как практически никто своим поведением не походил на «среднего».
И тут у меня возникла идея: можно создать «плохой» профиль и соответственно отсеять всех, кто на него похож. За таким профилем я далеко ходить не стал, а просто создал его искусственно, им стало равномерное распределение с границами 2 и 5 секунды. Т.е. фактически я нацеливался поймать всех, кто посылал запросы более менее равномерно с интервалами от 2 до 5 секунд, и о чудо, такие нашлись! В итоге я отловил нескольких людей, сканирующих сайт. Но понятно, что это не является основным результатом.
У некоторых может возникнуть вопрос: «а зачем все это надо?» И правда, самому искусственно придумывать «профили» возможных ботов — дело неблагодарное. Но данный метод позволяет начать «ловить» сразу после того как набирается на каждого некоторое пороговое значение для количества запросов. Кстати, критерий достаточно чувствителен и с достаточно малой вероятностью ошибки ловит ботов по собственному профилю уже на малом количестве запросов. Само собой это зависит от «сложности» распределения.
Данный метод очень прост, а также позволяет выявлять атаку в случае, если боты написаны «на коленке» и все поголовно посылают запросы пусть даже через случайные интервалы времени, но при этом с одним распределением.