Dans le cours d'apprentissage automatique de Stanford, Andrew Ng a mentionné l'application du ML en informatique. Quelque temps plus tard, lorsque j'ai obtenu des DDoS de taille modérée (environ 20 000 bots) sur notre site, j'ai décidé de lutter contre ce problème en utilisant un simple classificateur de réseau neuronal.
J'ai écrit ce script python en environ 30 minutes:
https://github.com/SaveTheRbtz/junk/tree/master/neural_networks_vs_ddos
Il utilise pyBrain et prend en entrée 3 journaux nginx , deux d'entre eux pour former Neural Network:
- Avec de bonnes requêtes
- Avec les mauvais
Et un journal pour la classification
De mauvaises requêtes ..
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/" "-"
...et bien...
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"
... il construit un dictionnaire:
['__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']
Chaque entrée avec laquelle nous formons notre réseau / entrée que nous devons classer ...
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)"
... est converti en vecteur d'entités:
[False, False, False, False, True, False, False, True, True, False, False, False, False, False, False, False, False, True, True, False, False, False, False]
Après tout cela, il existe un moyen standard de diviser l'ensemble de données en ensembles de formation et de test, de former des réseaux de neurones et de sélectionner le meilleur. Après ce processus (qui peut prendre assez de temps en fonction de la taille de l'ensemble de données), nous pouvons enfin classer les journaux à l'aide d'un réseau formé.
Mais voici un certain nombre de problèmes avec cette approche:
- L'apprentissage automatique supervisé est un peu mal pour ce type de problème, car pour détecter les bots, je dois d'abord détecter les bots et former Neural Network avec ces données.
- Je ne prends pas en compte le comportement du client. Il est préférable de considérer le graphique des transitions de page en page pour chaque utilisateur.
- Je ne prends pas la localité des clients dans un compte. Si un ordinateur du réseau est infecté par un virus, il y a plus de chances que d'autres ordinateurs de ce réseau soient infectés.
- Je ne prends pas de données de géolocalisation dans un compte. Bien sûr, si vous exploitez un site en Russie, il y a peu de chances pour les clients du Brésil.
- Je ne sais pas si c'était la bonne façon d'utiliser le réseau neuronal et la classification pour résoudre un tel problème. Peut-être que j'étais mieux avec un système de détection d'anomalies.
- C'est mieux quand la méthode ML est "en ligne" (ou soi-disant "streaming") afin qu'elle puisse être entraînée à la volée.
Voici donc les questions:
que feriez-vous si vous étiez confronté au même problème de défense contre une attaque DDoS étant donné uniquement les journaux de serveur Web actuels (qui se composent de bons clients et de robots) et les données historiques (journaux du jour / de la semaine / du mois précédent) avec surtout de bons clients)?
Quelle approche de Machine Learning choisiriez-vous?
Quels algorithmes utiliseriez-vous?