Na kursie uczenia maszynowego Stanforda Andrew Ng wspomniał o stosowaniu ML w IT. Jakiś czas później, kiedy dostałem DDoS o średniej wielkości (około 20 tys. Botów) na naszej stronie, postanowiłem z nim walczyć za pomocą prostego klasyfikatora sieci neuronowej.
Napisałem ten skrypt Pythona w około 30 minut:
https://github.com/SaveTheRbtz/junk/tree/master/neural_networks_vs_ddos
Wykorzystuje pyBrain i pobiera 3 dzienniki nginx jako dane wejściowe, z których dwa służą do szkolenia sieci neuronowej:
- Z dobrymi zapytaniami
- Ze złymi
I jeden dziennik do klasyfikacji
Od złych zapytań ..
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/" "-"
...I dobrze...
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"
... konstruuje słownik:
['__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']
Każdy wpis, w którym szkolimy naszą sieć / wpis, który musimy sklasyfikować ...
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)"
... zostaje przekonwertowany na wektor cech:
[False, False, False, False, True, False, False, True, True, False, False, False, False, False, False, False, False, True, True, False, False, False, False]
Po tym wszystkim istnieje standardowa ścieżka podziału zestawu danych na zestawy szkoleniowe i testowe, szkolenia sieci neuronowych i wybranie najlepszego. Po tym procesie (który może zająć dość dużo czasu w zależności od rozmiaru zestawu danych) możemy w końcu sklasyfikować dzienniki za pomocą wyszkolonej sieci.
Ale oto kilka problemów z tym podejściem:
- Nadzorowane uczenie maszynowe jest trochę niewłaściwe dla tego rodzaju problemu, ponieważ aby wykryć boty , najpierw muszę wykryć boty i wyszkolić sieć neuronową z tymi danymi.
- Nie biorę zachowania klienta na konto. Lepiej jest rozważyć wykres przejścia między stronami dla każdego użytkownika.
- Nie biorę lokalizacji klientów na konto. Jeśli jeden komputer w sieci zostanie zainfekowany jakimś wirusem, istnieje większe prawdopodobieństwo, że inne komputery w tej sieci zostaną zainfekowane.
- Nie biorę danych geolokalizacyjnych na konto. Oczywiście, jeśli prowadzisz witrynę w Rosji, szanse klientów z Brazylii są niewielkie.
- Nie wiem, czy to właściwy sposób wykorzystania sieci neuronowej i klasyfikacji do rozwiązania takiego problemu. Być może lepiej mi było z jakimś systemem wykrywania anomalii.
- Lepiej jest, gdy metoda ML jest „online” (lub tak zwana „streaming”), aby można ją było trenować w locie.
Oto pytania:
co byś zrobił, gdybyś miał do czynienia z tym samym problemem obrony przed atakiem DDoS, biorąc pod uwagę tylko bieżące dzienniki serwera (składające się z dobrych klientów i botów) oraz dane historyczne (dzienniki z poprzedniego dnia / tygodnia / miesiąca) z przeważnie dobrymi klientami)?
Które podejście do uczenia maszynowego wybrałbyś?
Jakich algorytmów byś użył?