В курсе машинного обучения Стэнфорда Эндрю Нг упомянул применение ML в IT. Некоторое время спустя, когда я получил DDoS умеренного размера (около 20 тыс. Ботов) на нашем сайте, я решил бороться с ним, используя простой классификатор Neural Network.
Я написал этот скрипт на python примерно за 30 минут:
https://github.com/SaveTheRbtz/junk/tree/master/neural_networks_vs_ddos
Он использует pyBrain и принимает 3 входа nginx в качестве входных данных, два из них для обучения нейронной сети:
- С хорошими запросами
- С плохими
И один журнал для классификации
Из плохих запросов ..
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]
После всего этого существует стандартный путь разделения набора данных на обучающие и тестовые наборы, обучения нейронных сетей и выбора наилучшего. После этого процесса (который может занять довольно много времени в зависимости от размера набора данных) мы можем наконец классифицировать журналы, используя обученную сеть.
Но вот ряд проблем с этим подходом:
- Управляемое машинное обучение в некотором роде неправильно для такого типа проблем, потому что для обнаружения ботов мне сначала нужно обнаружить ботов и обучить нейронную сеть с этими данными.
- Я не учитываю поведение клиента. Лучше рассмотреть график переходов между страницами для каждого пользователя.
- Я не принимаю клиентов в учетную запись. Если один компьютер в сети заражен каким-либо вирусом, есть больше шансов заражения других компьютеров в этой сети.
- Я не принимаю данные геолокации в аккаунт. Конечно, если вы работаете с сайтом в России, у клиентов из Бразилии мало шансов.
- Я не знаю, был ли это правильный способ использовать нейронную сеть и классификацию для решения такой проблемы. Может быть, мне было лучше с какой-то системой обнаружения аномалий.
- Лучше, когда метод ML «онлайн» (или так называемый «потоковый»), поэтому его можно обучать на лету.
Итак, вот вопросы:
Что бы вы сделали, если бы столкнулись с той же проблемой защиты от DDoS-атаки, учитывая только текущие журналы веб-сервера (состоящие из хороших клиентов и ботов) и исторические данные (журналы за предыдущий день / неделю / месяц) с в основном хорошими клиентами)?
Какой подход к машинному обучению вы бы выбрали?
Какие алгоритмы вы бы использовали?