Application de l'apprentissage automatique pour le filtrage DDoS

12

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:

  1. Avec de bonnes requêtes
  2. 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:

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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?

SaveTheRbtz
la source

Réponses:

11

Que diriez-vous des algorithmes de détection d'anomalies? Comme vous mentionnez la classe d'Andrew Ng, vous avez probablement vu la section "XV. ANOMALY DETECTION" sur ml-class.org , mais de toute façon.

La détection d'anomalies sera supérieure à une classification supervisée dans des scénarios similaires au vôtre car:

  • normalement, vous avez très peu d'anomalies (c.-à-d. trop peu d'exemples «positifs»)
  • vous avez normalement des types d'anomalies très différents
  • les anomalies futures pourraient ne pas ressembler à celles que vous avez eues jusqu'à présent

Un point important dans la détection des anomalies est les fonctionnalités à choisir. Deux conseils courants ici sont de choisir des fonctionnalités avec

  • Distribution gaussienne (ou les déformer pour être comme ça)

  • la probabilité p (anomalie) soit incomparable à p (normale) - disons, les valeurs anormales étant très grandes tandis que les valeurs normales sont très petites (ou vice versa).

Je ne sais pas si la géolocalisation serait utile pour votre scénario, mais le comportement du client importerait certainement - bien qu'il diffère probablement d'une application à l'autre. Vous pouvez constater qu'un rapport GET / POST est important. Ou un rapport entre la taille de la réponse et le nombre de demandes. Ou nombre de visites d'une seule page. Si vous avez ces informations dans les journaux - vous pouvez certainement utiliser les données pour une analyse rétrospective, suivie d'une liste noire IP :)

andreister
la source
+1 pour la détection des anomalies. J'ajouterais également "nombre de tentatives de connexion au cours des 5 dernières minutes" et "nombre de tentatives de connexion à partir d'ip X au cours des 5 dernières minutes".
neurone
Le principal problème avec la détection d'anomalies (comme cela a été donné dans la classe ML) est que vous ne pouvez pas l'utiliser pour une énorme quantité de fonctionnalités avec des relations complexes entre elles - c'est trop cher en termes de calcul. Dans mon exemple, j'ai 23 fonctionnalités sur 2 (!!) requêtes même sans call-graph, géolocalisation et nginxvariables supplémentaires dans le journal. Et je ne peux pas utiliser PCA car les attaquants peuvent changer le comportement des bots.
SaveTheRbtz
@SaveTheRbtz re "computationally cost" - IIRC, la détection d'anomalies telle que présentée dans la classe ml n'était qu'une estimation de la densité de sorte que vous multipliez simplement les probabilités de vos caractéristiques comme dans p (x1) * .. * p (xN) qui, je crois, est O (n) alors cherchez-vous O (logn) ou quelque chose? Mais de toute façon, c'est une question juste et cela m'a fait penser à la sélection automatique des fonctionnalités - alors j'ai
andreister
Pour être plus précis, je parle de jusqu'à 100 000 fonctionnalités par 1 Mo de fichier journal. PS. Bonne question!
SaveTheRbtz
1

C'est un problème difficile, voici quelques observations:

  • Cet article pourrait vous être utile - il s'appuie sur les techniques d'apprentissage supervisé (dans le contexte de la classification multi-classes) pour détecter les publicités contradictoires. Les stratégies contradictoires évoluant, les auteurs doivent s'appuyer sur des experts humains qui annotent de rares "anomalies". Ils utilisent entre autres des techniques de classement basées sur SVM.
  • Comme indiqué par d'autres, vous pouvez essayer la détection d'anomalies / de valeurs aberrantes basée sur l'apprentissage non supervisé, mais cela nécessiterait beaucoup de réglages pour obtenir le bon équilibre entre les faux positifs et les faux négatifs.
  • Il est très important d'avoir un bon ensemble de fonctionnalités - le choix de la méthodologie est secondaire (c'est-à-dire qu'une technique simple comme Naive Bayes ou la régression logistique est souvent suffisante étant donné un bon ensemble de fonctionnalités)
Yevgeny
la source