Применение машинного обучения для фильтрации DDoS

12

В курсе машинного обучения Стэнфорда Эндрю Нг упомянул применение ML в IT. Некоторое время спустя, когда я получил DDoS умеренного размера (около 20 тыс. Ботов) на нашем сайте, я решил бороться с ним, используя простой классификатор Neural Network.

Я написал этот скрипт на python примерно за 30 минут:
https://github.com/SaveTheRbtz/junk/tree/master/neural_networks_vs_ddos

Он использует pyBrain и принимает 3 входа nginx в качестве входных данных, два из них для обучения нейронной сети:

  1. С хорошими запросами
  2. С плохими

И один журнал для классификации

Из плохих запросов ..

0.0.0.0 - - [20/Dec/2011:20:00:08 +0400] "POST /forum/index.php HTTP/1.1" 503 107 "http://www.mozilla-europe.org/" "-"

...и хорошо...

0.0.0.0 - - [20/Dec/2011:15:00:03 +0400] "GET /forum/rss.php?topic=347425 HTTP/1.0" 200 1685 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9) Gecko/2008052906 Firefox/3.0"

... он создает словарь:

['__UA___OS_U', '__UA_EMPTY', '__REQ___METHOD_POST', '__REQ___HTTP_VER_HTTP/1.0', 
'__REQ___URL___NETLOC_', '__REQ___URL___PATH_/forum/rss.php', '__REQ___URL___PATH_/forum/index.php',
'__REQ___URL___SCHEME_', '__REQ___HTTP_VER_HTTP/1.1', '__UA___VER_Firefox/3.0',
'__REFER___NETLOC_www.mozilla-europe.org', '__UA___OS_Windows', '__UA___BASE_Mozilla/5.0',
'__CODE_503', '__UA___OS_pl', '__REFER___PATH_/', '__REFER___SCHEME_http', '__NO_REFER__',
'__REQ___METHOD_GET', '__UA___OS_Windows NT 5.1', '__UA___OS_rv:1.9',
'__REQ___URL___QS_topic', '__UA___VER_Gecko/2008052906']

Каждая запись, с которой мы обучаем нашу сеть / запись, которую мы должны классифицировать ...

0.0.0.0 - - [20/Dec/2011:20:00:01 +0400] "GET /forum/viewtopic.php?t=425550 HTTP/1.1" 502 107 "-" "BTWebClient/3000(25824)"

... преобразуется в вектор объектов:

[False, False, False, False, True, False, False, True, True, False, False, False, False, False, False, False, False, True, True, False, False, False, False]

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

Но вот ряд проблем с этим подходом:

  1. Управляемое машинное обучение в некотором роде неправильно для такого типа проблем, потому что для обнаружения ботов мне сначала нужно обнаружить ботов и обучить нейронную сеть с этими данными.
  2. Я не учитываю поведение клиента. Лучше рассмотреть график переходов между страницами для каждого пользователя.
  3. Я не принимаю клиентов в учетную запись. Если один компьютер в сети заражен каким-либо вирусом, есть больше шансов заражения других компьютеров в этой сети.
  4. Я не принимаю данные геолокации в аккаунт. Конечно, если вы работаете с сайтом в России, у клиентов из Бразилии мало шансов.
  5. Я не знаю, был ли это правильный способ использовать нейронную сеть и классификацию для решения такой проблемы. Может быть, мне было лучше с какой-то системой обнаружения аномалий.
  6. Лучше, когда метод ML «онлайн» (или так называемый «потоковый»), поэтому его можно обучать на лету.

Итак, вот вопросы:
Что бы вы сделали, если бы столкнулись с той же проблемой защиты от DDoS-атаки, учитывая только текущие журналы веб-сервера (состоящие из хороших клиентов и ботов) и исторические данные (журналы за предыдущий день / неделю / месяц) с в основном хорошими клиентами)?
Какой подход к машинному обучению вы бы выбрали?
Какие алгоритмы вы бы использовали?

SaveTheRbtz
источник

Ответы:

11

Как насчет алгоритмов обнаружения аномалий? Когда вы упомянули класс Эндрю Нга, вы, вероятно, видели раздел «XV. ОБНАРУЖЕНИЕ АНОМАЛИИ» на ml-class.org , но в любом случае.

Обнаружение аномалий будет превосходить контролируемую классификацию в сценариях, подобных вашему, потому что:

  • обычно у вас очень мало аномалий (т.е. слишком мало «положительных» примеров)
  • обычно у вас очень разные типы аномалий
  • будущие аномалии могут не иметь ничего общего с теми, которые у вас были до сих пор

Важным моментом в обнаружении аномалий является то, какие функции выбрать. Два общих совета здесь, чтобы выбрать функции с

  • Гауссово распределение (или искажать их так)

  • вероятность p (аномалия) несопоставима с p (нормальная) - скажем, аномальные значения очень велики, а нормальные очень малы (или наоборот).

Я не уверен, поможет ли геолокация вашему сценарию, но поведение клиента определенно будет иметь значение, хотя, вероятно, оно будет отличаться от приложения к приложению. Вы можете обнаружить, что соотношение GET / POST имеет значение. Или отношение размера ответа к количеству запросов. Или количество просмотров одной страницы. Если у вас есть такая информация в журналах - вы можете использовать данные для ретроспективного анализа с последующим внесением в черный список IP :)

andreister
источник
+1 за обнаружение аномалии. Я также добавил бы «количество попыток входа в систему за последние 5 минут» и «количество попыток входа в систему с ip X за последние 5 минут».
Нейрон
Основная проблема с обнаружением аномалий (как это было дано в классе ML) состоит в том, что вы не можете использовать его для огромного количества функций со сложными отношениями между ними - это слишком дорого в вычислительном отношении. В моем примере у меня 23 функции из 2 (!!) запросов даже без графов вызовов, геолокации и дополнительных nginxпеременных в журнале. И я не могу использовать PCA, потому что злоумышленники могут изменить поведение ботов.
SaveTheRbtz
@SaveTheRbtz - «вычислительно дорогой» - IIRC, обнаружение аномалий, представленное в классе ml, было просто оценкой плотности, поэтому вы просто умножили бы вероятности ваших функций, как в p (x1) * .. * p (xN), что, я поверьте, O (n), так что вы ищете O (logn) или что-то? Но в любом случае, это справедливый вопрос, и он заставил меня задуматься об автоматическом выборе функций - поэтому задал вопрос на machinelearning.stackexchange.com/questions/184
andreister
Просто чтобы быть более точным - я говорю о до 100 000 функций на 1 МБ файла журнала. PS. Хороший вопрос!
SaveTheRbtz
1

Это сложная проблема, вот несколько замечаний:

  • Этот документ может быть вам полезен - он опирается на контролируемые методы обучения (в контексте многоклассовой классификации) для выявления враждебной рекламы. Поскольку стратегии противостояния развиваются, авторы вынуждены полагаться на экспертов-людей, которые комментируют редкие «аномалии». Они используют методы ранжирования на основе SVM среди других.
  • Как отмечали другие, вы могли бы попробовать обнаружение аномалий / выбросов на основе неконтролируемого обучения, но для этого потребовалось бы много настроек, чтобы получить правильный баланс ложноположительных и ложноположительных результатов.
  • Очень важно иметь хороший набор функций - выбор методологии вторичен (т. Е. Простой метод, такой как наивный байесовский или логистическая регрессия, часто бывает достаточно при хорошем наборе функций)
Евгений
источник