Anwenden von maschinellem Lernen für die DDoS-Filterung

12

In Stanfords Maschinellem Lernkurs erwähnte Andrew Ng die Anwendung von ML in der IT. Einige Zeit später, als ich DDoS von mittlerer Größe (ca. 20.000 Bots) auf unserer Site bekam, entschied ich mich, mit einem einfachen Neural Network-Klassifikator dagegen anzukämpfen.

Ich habe dieses Python-Skript in ungefähr 30 Minuten geschrieben:
https://github.com/SaveTheRbtz/junk/tree/master/neural_networks_vs_ddos

Es verwendet pyBrain und dauert 3 nginx Protokolle als Eingang, zwei von ihnen Neural Network zu trainieren:

  1. Mit guten Fragen
  2. Mit schlechten

Und ein Protokoll zur Klassifizierung

Von schlechten Fragen ..

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/" "-"

...und gut...

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"

... es erstellt ein Wörterbuch:

['__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']

Jeder Eintrag, mit dem wir unser Netzwerk trainieren / Eintrag, den wir klassifizieren müssen ...

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)"

... wird in Feature-Vektor konvertiert:

[False, False, False, False, True, False, False, True, True, False, False, False, False, False, False, False, False, True, True, False, False, False, False]

Nach alledem gibt es einen Standardpfad zum Aufteilen des Datensatzes in Trainings- und Testsätze, zum Trainieren neuronaler Netze und zum Auswählen des besten. Nach diesem Vorgang (der abhängig von der Größe des Datensatzes ziemlich lange dauern kann) können wir die Protokolle mithilfe eines trainierten Netzwerks klassifizieren.

Aber hier sind einige Probleme mit diesem Ansatz:

  1. Überwachtes maschinelles Lernen ist für diese Art von Problem falsch, da ich zum Erkennen von Bots zuerst Bots erkennen und das neuronale Netzwerk mit diesen Daten trainieren muss.
  2. Ich beziehe das Verhalten des Kunden nicht in ein Konto ein. Es ist besser, die Übergänge von Seite zu Seite für jeden Benutzer grafisch darzustellen.
  3. Ich beziehe die Lokalität des Kunden nicht in ein Konto ein. Wenn ein Computer im Netzwerk mit einem Virus infiziert ist, besteht eine höhere Wahrscheinlichkeit, dass andere Computer in diesem Netzwerk infiziert sind.
  4. Ich beziehe keine Geolokalisierungsdaten in ein Konto ein. Wenn Sie eine Site in Russland betreiben, ist die Chance für Kunden aus Brasilien natürlich gering.
  5. Ich weiß nicht, ob es der richtige Weg war, ein neuronales Netzwerk und eine Klassifikation zur Lösung eines solchen Problems zu verwenden. Vielleicht war ich mit einem System zur Erkennung von Anomalien besser dran.
  6. Es ist besser, wenn die ML-Methode "online" (oder sogenanntes "Streaming") ist, damit sie im laufenden Betrieb trainiert werden kann.

Hier sind also die Fragen:
Was würden Sie tun, wenn Sie das gleiche Problem bei der Abwehr eines DDoS-Angriffs hätten, wenn nur aktuelle Webserver-Protokolle (die aus guten Clients und Bots bestehen) und historische Daten (Protokolle für den Vortag / die Woche / den Monat) vorliegen mit meist guten Kunden)?
Welchen Ansatz für maschinelles Lernen würden Sie wählen?
Welche Algorithmen würden Sie verwenden?

SaveTheRbtz
quelle

Antworten:

11

Wie wäre es mit Algorithmen zur Erkennung von Anomalien? Wie Sie Andrew Ngs Klasse erwähnen, haben Sie wahrscheinlich den Abschnitt "XV. ANOMALY DETECTION" auf ml-class.org gesehen , aber trotzdem.

Die Erkennung von Anomalien ist einer überwachten Klassifizierung in ähnlichen Szenarien überlegen, weil:

  • Normalerweise haben Sie sehr wenige Anomalien (dh zu wenig "positive" Beispiele)
  • Normalerweise haben Sie sehr unterschiedliche Arten von Anomalien
  • Zukünftige Anomalien sehen möglicherweise nicht mehr so ​​aus wie die, die Sie bisher hatten

Ein wichtiger Punkt bei der Erkennung von Anomalien ist, welche Funktionen zur Auswahl stehen. Zwei gebräuchliche Ratschläge sind hier die Auswahl von Funktionen mit

  • Gaußsche Verteilung (oder verzerren Sie sie so)

  • Wahrscheinlichkeit p (Anomalie) ist unvergleichbar mit p (Normal) - sagen wir, dass anomale Werte sehr groß sind, während normale Werte sehr klein sind (oder umgekehrt).

Ich bin mir nicht sicher, ob die Geolokalisierung für Ihr Szenario hilfreich sein würde, aber das Client-Verhalten wäre auf jeden Fall von Bedeutung - obwohl es sich wahrscheinlich von Anwendung zu Anwendung unterscheiden würde. Möglicherweise stellen Sie fest, dass ein Verhältnis von GETs / POSTs wichtig ist. Oder ein Verhältnis der Antwortgröße zur Anzahl der Anfragen. Oder Anzahl einzelner Seitentreffer. Wenn Sie solche Informationen in Protokollen haben, können Sie die Daten definitiv für eine nachträgliche Analyse verwenden, gefolgt von einer IP-Sperrliste :)

andreister
quelle
+1 für die Erkennung von Anomalien. Ich würde auch "Anzahl der Anmeldeversuche in den letzten 5 Minuten" und "Anzahl der Anmeldeversuche von ip X in den letzten 5 Minuten" hinzufügen.
Neuron
Das Hauptproblem bei der Erkennung von Anomalien (wie es in der ML-Klasse angegeben wurde) ist, dass Sie sie nicht für eine enorme Anzahl von Funktionen mit komplexen Beziehungen zwischen ihnen verwenden können - sie sind zu rechenintensiv. In meinem Beispiel habe ich 23 Features von 2 (!!) Abfragen, auch ohne Call-Graph, Geolocation und zusätzliche nginxVariablen im Log. Und ich kann PCA nicht verwenden, da Angreifer das Verhalten von Bots ändern können.
SaveTheRbtz
@SaveTheRbtz re "rechenintensiv" - IIRC, Anomalieerkennung wie in ml-Klasse dargestellt war nur Dichteschätzung, so dass Sie nur die Wahrscheinlichkeiten Ihrer Merkmale wie in p (x1) multiplizieren würden * .. * p (xN), die ich Glauben Sie, ist O (n) so suchen Sie O (logn) oder etwas? Aber es ist eine faire Frage, die mich über die automatische Funktionsauswahl nachdenken ließ - also eine Frage an machinelearning.stackexchange.com/questions/184
andreister
Um genau zu sein - ich spreche von bis zu 100.000 Features pro 1 MB Protokolldatei. PS. Gute Frage!
SaveTheRbtz
1

Dies ist ein schwieriges Problem. Hier einige Beobachtungen:

  • Dieses Dokument kann hilfreich für Sie sein - es stützt sich auf die überwachten Lerntechniken (im Kontext der Klassifizierung mehrerer Klassen), um widersprüchliche Anzeigen zu erkennen. Da sich die gegnerischen Strategien weiterentwickeln, müssen sich die Autoren auf menschliche Experten verlassen, die seltene "Anomalien" kommentieren. Sie verwenden unter anderem SVM-basierte Ranking-Techniken.
  • Wie von anderen angemerkt, könnten Sie versuchen, Anomalien / Ausreißer zu erkennen, die auf nicht überwachtem Lernen basieren. Dies würde jedoch eine Menge Abstimmung erfordern, um das Gleichgewicht zwischen falsch-positiven und falsch-negativen Ergebnissen in Ordnung zu bringen.
  • Ein guter Funktionsumfang ist sehr wichtig - die Wahl der Methodik ist zweitrangig (dh eine einfache Technik wie Naive Bayes oder logistische Regression ist bei einem guten Funktionsumfang oft genug).
Jewgeni
quelle