Nel corso di Machine Learning di Stanford, Andrew Ng ha menzionato l'applicazione dell'ML in IT. Qualche tempo dopo, quando ho ottenuto DDoS di dimensioni moderate (circa 20k bot) sul nostro sito, ho deciso di lottare contro di esso usando un semplice classificatore di reti neurali.
Ho scritto questo script Python in circa 30 minuti:
https://github.com/SaveTheRbtz/junk/tree/master/neural_networks_vs_ddos
Utilizza pyBrain e accetta come input 3 log nginx , due dei quali per addestrare Neural Network:
- Con buone domande
- Con quelli cattivi
E un registro per la classificazione
Da cattive domande ..
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/" "-"
...e bene...
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"
... costruisce un dizionario:
['__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']
Ogni voce che formiamo la nostra rete con / voce che dobbiamo classificare ...
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)"
... viene convertito in feature-vector:
[False, False, False, False, True, False, False, True, True, False, False, False, False, False, False, False, False, True, True, False, False, False, False]
Dopo tutto ciò, esiste un percorso standard di suddivisione del set di dati in training e set di test, formazione delle reti neurali e selezione del migliore. Dopo questo processo (che può richiedere molto tempo a seconda della dimensione del set di dati) possiamo finalmente classificare i log usando una rete addestrata.
Ma qui ci sono una serie di problemi con questo approccio:
- L'apprendimento automatico supervisionato è un po 'sbagliato per quel tipo di problema, perché per rilevare i robot devo prima rilevare i robot e addestrare la rete neurale con quei dati.
- Non prendo il comportamento del cliente in un account. È meglio considerare il grafico delle transizioni da una pagina all'altra per ciascun utente.
- Non prendo la località dei clienti in un account. Se un computer in rete è infetto da alcuni virus, allora ci sono più possibilità che altri computer in quella rete siano infetti.
- Non prendo i dati di una geolocalizzazione in un account. Ovviamente se gestisci un sito in Russia, ci sono poche possibilità di clienti dal Brasile.
- Non so se fosse il modo giusto di utilizzare la rete neurale e la classificazione per risolvere tale problema. Forse sto meglio con un sistema di rilevamento delle anomalie.
- È meglio quando il metodo ML è "online" (o il cosiddetto "streaming") in modo che possa essere addestrato al volo.
Quindi ecco le domande:
cosa faresti se dovessi affrontare lo stesso problema di difesa da un attacco DDoS dato solo i registri del server web attuali (che consistono in buoni client e bot) e dati storici (registri per il giorno / settimana / mese precedente con clienti per lo più buoni)?
Quale approccio di Machine Learning sceglieresti.
Quali algoritmi useresti?