У курсі машинного навчання Стенфорда Ендрю Нг згадав про застосування ML в ІТ. Через деякий час, коли я отримав DDoS середнього розміру (близько 20k ботів) на нашому сайті, я вирішив боротися з ним, використовуючи простий класифікатор 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-атаки з урахуванням лише поточних журналів веб-сервера (які складаються з хороших клієнтів та ботів) та історичних даних (журнали за попередній день / тиждень / місяць з переважно хорошими клієнтами)?
Який підхід машинного навчання ви б обрали.
Які алгоритми ви б використовували?