Einführung
Snort ist ein leistungsstarkes Open-Source-System zur Erkennung von Netzwerkeindringlingen (Network Intrusion Detection System, NIDS). Eines seiner wichtigsten Merkmale ist die flexible, regelbasierte Sprache, die es Sicherheitsexperten ermöglicht, Signaturen für bösartige Netzwerkaktivitäten zu definieren.
Regeln bilden die Brücke zwischen Theorie und Erkennung. Eine Sicherheitsüberlegung wie „Port-Scans sind verdächtig“ wird erst dann operativ nützlich, wenn sie in einer Form ausgedrückt wird, die die Engine gegen echten Datenverkehr auswerten kann. Das Erlernen der Regelsyntax vermittelt daher mehr als nur Snort selbst. Es lehrt, wie Verteidiger Verhalten in maschinenlesbare Logik übersetzen.
In diesem Lab lernen Sie die grundlegende Syntax und den Aufbau benutzerdefinierter Snort-Regeln kennen. Sie erstellen grundlegende Regeln, die Aktionen, Protokolle, IP-Adressen, Ports und Optionen definieren, um gezielt ICMP-Pings und anomale TCP-Verkehrsmuster zu erkennen und zu alarmieren. Am Ende dieses Labs werden Sie verstehen, wie man eigene Snort-Regeln erstellt, testet und validiert.
Die Regelsyntax und den Header verstehen
In diesem Schritt lernen Sie die grundlegende Struktur einer Snort-Regel kennen und erstellen eine Datei, in der Sie Ihre benutzerdefinierten Regeln speichern können.
Der Header ist im Grunde eine Definition des Geltungsbereichs. Er entscheidet, welcher Datenverkehr überhaupt eine weitere Untersuchung wert ist. Das ist wichtig, da eine effiziente Erkennung damit beginnt, die Menge der infrage kommenden Datenpakete so weit wie möglich einzugrenzen, bevor tiefere Inhaltsprüfungen angewendet werden. Breite Header sind einfacher zu schreiben, können aber auch mehr Rauschen erzeugen.
Eine Snort-Regel ist in zwei logische Hauptabschnitte unterteilt: den Regel-Header und die Regel-Optionen.
Der Regel-Header enthält die Aktion der Regel, das Protokoll, die Quell- und Ziel-IP-Adressen sowie die Quell- und Ziel-Ports. Er legt fest, wer mit wem kommuniziert und welches Protokoll verwendet wird. Die grundlegende Syntax sieht wie folgt aus:
[Action] [Protocol] [Source IP] [Source Port] -> [Destination IP] [Destination Port] (Options)
Hier ist eine Aufschlüsselung der Header-Komponenten:
- Action: Was Snort tun soll, wenn es ein Paket findet, das die Regelkriterien erfüllt (z. B.
alert,log,drop). - Protocol: Das Protokoll des Datenverkehrs (z. B.
tcp,udp,icmp,ip). - IP Addresses: Die Quell- und Ziel-IP-Adressen. Sie können
anyverwenden, um alle IP-Adressen abzugleichen. - Ports: Die Quell- und Ziel-Netzwerkports. Sie können
anyverwenden, um alle Ports abzugleichen. - Direction Operator: Das Symbol
->gibt die Richtung des Datenverkehrs an (von der Quelle zum Ziel). Sie können auch<>für bidirektionalen Datenverkehr verwenden.
Um mit dem Schreiben unserer eigenen Regeln zu beginnen, benötigen wir eine dedizierte Datei. Stellen Sie sicher, dass Sie sich in Ihrem Standard-Arbeitsverzeichnis (~/project) befinden, und erstellen Sie eine neue Datei namens local.rules.
Verwenden Sie den Befehl touch, um eine leere Datei zu erstellen:
touch ~/project/local.rules
Sie können überprüfen, ob die Datei erfolgreich erstellt wurde, indem Sie den Inhalt Ihres Verzeichnisses auflisten:
ls -l ~/project/local.rules
Sie sollten eine Ausgabe ähnlich dieser sehen, die bestätigt, dass die Datei existiert und derzeit leer ist:
-rw-r--r-- 1 labex labex 0 Jul 25 10:00 /home/labex/project/local.rules
Eine ICMP-Erkennungsregel schreiben
In diesem Schritt schreiben Sie Ihre erste Snort-Regel zur Erkennung von ICMP-Datenverkehr. ICMP (Internet Control Message Protocol) wird häufig von Netzwerk-Dienstprogrammen wie ping verwendet, um die Konnektivität zu überprüfen.
ICMP ist ein gutes Lehrbeispiel, da es einfach und leicht zu erkennen ist, aber es verdeutlicht auch einen wichtigen operativen Punkt: Nicht jede Erkennung bedeutet einen Angriff. Viele Netzwerke nutzen Ping auf legitime Weise. Die Aufgabe des Analysten besteht darin, das, was die Regel gefunden hat, mit dem Kontext der Umgebung zu kombinieren, bevor entschieden wird, ob das Ereignis harmlos oder verdächtig ist.
Wir schreiben eine Regel, die einen Alarm auslöst, wann immer irgendein ICMP-Paket von irgendeiner Quelle zu irgendeinem Ziel gesendet wird.
Öffnen Sie Ihre local.rules-Datei mit dem Texteditor nano:
nano ~/project/local.rules
Geben Sie die folgende Regel in den Editor ein:
alert icmp any any -> any any (msg:"ICMP Ping Detected"; sid:1000001; rev:1;)
Lassen Sie uns aufschlüsseln, was diese Regel bedeutet:
alert: Die auszuführende Aktion. Snort generiert einen Alarm.icmp: Das Protokoll, das wir überwachen.any any -> any any: Der Datenverkehr kann von jeder IP und jedem Port stammen und an jede IP und jeden Port gehen.(msg:"ICMP Ping Detected"; sid:1000001; rev:1;): Dies sind die Regel-Optionen.msgist die Alarmmeldung,sidist eine eindeutige Snort-ID (benutzerdefinierte Regeln müssen eine ID von 1.000.000 oder höher haben) undrevist die Revisionsnummer der Regel.
Nachdem Sie die Regel eingegeben haben, speichern Sie die Datei und beenden Sie nano, indem Sie Ctrl+O, Enter (um den Dateinamen zu bestätigen) und dann Ctrl+X drücken.
Lassen Sie uns nun testen, ob Snort unsere Regeldatei versteht. Snort verfügt über einen Testmodus (-T), der die Konfiguration und die Regeln auf Syntaxfehler überprüft, ohne die Erkennungs-Engine tatsächlich zu starten.
Führen Sie den folgenden Befehl aus, um Ihre Regeldatei zu testen:
sudo snort -T -c ~/project/local.rules
Sie werden eine Menge Ausgaben sehen, während Snort initialisiert. Suchen Sie am Ende der Ausgabe nach einer Erfolgsmeldung, die anzeigt, dass Snort die Konfiguration erfolgreich validiert hat:
Snort successfully validated the configuration!
Snort exiting
Wenn Sie diese Meldung sehen, ist Ihre ICMP-Regel syntaktisch korrekt.
Eine TCP-Port-Alarmregel schreiben
In diesem Schritt schreiben Sie eine Regel zur Erkennung von spezifischem TCP-Datenverkehr. Während ICMP keine Ports verwendet, tun dies TCP und UDP. Dies ermöglicht es uns, Regeln zu schreiben, die auf bestimmte Dienste abzielen, wie z. B. HTTP (Port 80) oder SSH (Port 22).
Ports geben Ihnen einen groben Anwendungskontext. Sie erzählen nicht die ganze Geschichte, aber sie sind oft die erste Annäherung, die Verteidiger verwenden, um Diensttypen zu unterscheiden. Eine Regel, die auf den Ziel-Port 80 abzielt, besagt im Wesentlichen: „Ich interessiere mich für Datenverkehr, der wahrscheinlich an einen Webdienst gerichtet ist.“
Wir schreiben eine Regel, die uns alarmiert, wann immer jemand versucht, eine Verbindung zu einem Webserver auf Port 80 herzustellen.
Öffnen Sie Ihre local.rules-Datei erneut mit nano:
nano ~/project/local.rules
Fügen Sie unter Ihrer bestehenden ICMP-Regel eine neue Zeile hinzu und geben Sie die folgende TCP-Regel ein:
alert tcp any any -> any 80 (msg:"HTTP Traffic to Port 80 Detected"; sid:1000002; rev:1;)
Lassen Sie uns den Header dieser neuen Regel analysieren:
alert tcp: Wir generieren einen Alarm für das TCP-Protokoll.any any: Die Quelle kann jede IP-Adresse und jeder Port sein.->: Der Datenverkehr fließt in Richtung des Ziels.any 80: Das Ziel kann jede IP-Adresse sein, aber der Ziel-Port muss 80 sein.
Beachten Sie, dass wir die sid auf 1000002 erhöht haben. Jede Snort-Regel muss eine eindeutige Snort-ID haben.
Speichern Sie die Datei (Ctrl+O, Enter) und beenden Sie nano (Ctrl+X).
Auch hier ist es eine gute Praxis, Ihre Regelsyntax zu testen, um sicherzustellen, dass keine Tippfehler vorliegen. Führen Sie den Snort-Testbefehl aus:
sudo snort -T -c ~/project/local.rules
Scrollen Sie zum Ende der Ausgabe, um zu bestätigen, dass Snort die Konfiguration erfolgreich validiert hat. Sie sollten nun zwei erfolgreich geladene Regeln haben.
Regel-Optionen einbeziehen (Msg, SID, Rev)
In diesem Schritt werden wir tiefer in den Abschnitt Regel-Optionen eintauchen. Der Optionen-Abschnitt ist in Klammern () eingeschlossen und enthält Schlüssel/Wert-Paare, die durch Semikolons ; getrennt sind.
Regel-Optionen sind der Bereich, in dem eine grobe Verkehrskategorie zu einem aussagekräftigen Alarm wird. Eine klare msg hilft einem Menschen, das Ereignis zu verstehen. Eine eindeutige sid ermöglicht es Systemen, nachzuverfolgen, welche Regel ausgelöst wurde. Ein rev-Wert ermöglicht es Teams, Erkennungsinhalte im Laufe der Zeit zu verwalten. Diese Felder unterstützen den Betrieb, nicht nur die Syntax.
Sie haben bereits die drei grundlegendsten Optionen verwendet. Die erste ist msg, die Nachricht, die in den Alarmprotokollen gedruckt wird und beschreibend sein sollte. Die zweite ist sid, was für Snort ID steht; von Benutzern geschriebene Regeln sollten eine SID größer als 1.000.000 haben. Die dritte ist rev, die die Revisionsnummer darstellt; jedes Mal, wenn Sie eine Regel ändern, sollten Sie diese Nummer erhöhen, um den Überblick über die Versionen zu behalten.
Lassen Sie uns eine Regel schreiben, um SSH-Verbindungsversuche (Port 22) zu erkennen, um die Verwendung dieser Optionen zu üben.
Öffnen Sie Ihre local.rules-Datei:
nano ~/project/local.rules
Fügen Sie die folgende Regel am Ende der Datei hinzu:
alert tcp any any -> any 22 (msg:"SSH Connection Attempt"; sid:1000003; rev:1;)
In dieser Regel haben wir eine grundlegende msg festgelegt und ihr eine neue eindeutige SID (1000003) zugewiesen.
Angenommen, wir entscheiden uns später, die Nachricht dieser Regel spezifischer zu gestalten. Wir würden die msg ändern und die rev auf 2 erhöhen. Lassen Sie uns das jetzt tun. Ändern Sie die SSH-Regel, die Sie gerade am Ende der Datei geschrieben haben, so dass sie wie folgt aussieht:
alert tcp any any -> any 22 (msg:"Possible SSH Brute Force Attempt"; sid:1000003; rev:2;)
Speichern Sie die Datei (Ctrl+O, Enter) und beenden Sie nano (Ctrl+X).
Führen Sie abschließend ein letztes Mal die Syntaxprüfung durch, um sicherzustellen, dass alle drei Ihrer Regeln perfekt formatiert sind:
sudo snort -T -c ~/project/local.rules
Suchen Sie nach der Erfolgsmeldung der Validierung. Sie haben nun erfolgreich mehrere benutzerdefinierte Snort-Regeln unter Verwendung von Headern und Optionen geschrieben und strukturiert.
Zusammenfassung
In diesem Lab haben Sie die grundlegenden Fähigkeiten erlernt, die zum Schreiben benutzerdefinierter Snort-Regeln erforderlich sind. Sie haben den Aufbau einer Regel untersucht und sie in Regel-Header und Regel-Optionen unterteilt. Sie haben erfolgreich Regeln geschrieben, um allgemeinen ICMP-Datenverkehr und spezifischen TCP-Port-Datenverkehr zu erkennen. Darüber hinaus haben Sie gelernt, wie man wesentliche Regel-Optionen wie msg, sid und rev verwendet, um Ihre Alarme beschreibend und eindeutig identifizierbar zu machen. Diese Fähigkeiten bilden die Grundlage für die Erstellung fortschrittlicher Signaturen zur Erkennung von Netzwerkeindringlingen.



