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:
- Mit guten Fragen
- 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:
- Ü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.
- 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.
- 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.
- 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.
- 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.
- 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?