Snort

Aus THM-Wiki
Wechseln zu: Navigation, Suche

Snort (www.snort.org) ) ist ein Intrusion Detection System (IDS), also eine Software zur Erkennung von Angriffen und Einbrüchen auf IP-Netzwerke. Es ist eine plattformunabhängige, kommandozeilenbasierte Open Source Software und mit über 3 Mio. Downloads und 150.000 aktiven Benutzern (Stand: Ende 2006) das weltweit am häufigsten eingesetzte IDS. Die aktuelle Production Release Version von Snort ist v.2.6.1.4 (Stand: 3. April 2007).


Einleitung

Snort wurde von 1998 von Martin Roesch entwickelt. Roesch wollte zunächst nur einen komfortablen Ersatz für tcpdump, da ihm die Syntax und das Ausgabeformat für seine Zwecke nicht aussagekräftig genug waren. Daher versuchte er Snort auf derselben Grundlage wie tcpdump zu entwickeln und zwar auf der Berkeley-Packetfilterbibliothek libpcap. Diese stellt heute die Grundlage der meisten Netzwerkanalysatoren dar und existiert inzwischen für eine Vielzahl von Betriebssystemen (Solaris, HP-UX, Win32, Linux, OpenBSD, FreeBSD …). Im Jahr 2001 gründete Roesch die Firma Sourcefire, welche die Entwicklung von Snort weiterführte und kommerziellen Support anbietet. Zu den kommerziellen Produkten von Sourcefire gehören u.a. eine grafische Management-Konsole und eine Fernwartungssuite.

Funktionen und Modi

Snort bietet drei verschiedene Funktionsmodi an. So ist es neben der Funktion als IDS auch in der Lage als reiner Sniffer oder als reiner Netzwerkprotokollant eingesetzt zu werden. Dieses Flexibilität beruht auf der inneren Struktur von Snort, da es zunächst lediglich eine Software ist, die mithilfe der libpcap-Bibliohthek in der Lage ist, Netzwerkpakete von einen Ethernet Interface aufzunehmen. Dazu sollte das Interface in den „Promiscuous-Mode“ geschaltet werden.

$ ifconfig -promisc eth0

In diesem Modus sammelt die Netzwerkkarte den gesamten Traffic des Netzsegments ein und nicht nur den Traffic, der an ihre MAC bzw. Broadcast-MAC-Adresse gerichtet ist. Damit Snort aber diesen Modus überhaupt sinnvoll nutzen kann, muss es entweder an einen Hub oder - bei einem Switch - an einen Mirror Port, der den gesamten Traffic des Switches spiegelt, angeschlossen werden. Wird Snort nun als Sniffer eingesetzt, parsed es die aufgenommenen IP-Pakete und zeigt diese im Klartext an. Neben dieser reinen Darstellung der Daten, können die Informationen auch geeignet protokolliert werden. So steht eine Protokollierung der Pakete in Binärform und in Klartextform zur Verfügung. Die Binärmodus-Protokollierung erfolgt in einem kompatiblen Format zu anderen Produkten wird tcpdump und ethereal; im Klartextmodus wird jedes einzelne Paket in einem Verzeichnis basierend auf der IP-Adresse eines der beiden beteiligten Rechner protokolliert.

Der IDS-Modus

Schließlich besteht natürlich die Möglichkeit, alle aufgenommenen Pakete zu inspizieren, d.h. die Funktion als IDS. Hierzu können Regelsätze definiert werden, die spezifische Aspekte des Paketes untersuchen. Die Detektionsfähigkeiten werden nicht vom Snortkern selbst zur Verfügung gestellt, sondern mithilfe von Plug-Ins implementiert. Dies erlaubt einen sehr modularen und zukünftig erweiterbaren Aufbau von Snort. Snort unterstützt inzwischen Detektions-Plug-Ins, Präprozessoren und Output-Plug-Ins. Die Detektions-Plug-Ins untersuchen unterschiedliche Bestandteile des Paketes. Einige Pakete liegen jedoch fragmentiert vor oder der Inhalt des TCP-Stromes muss zur Analyse zunächst zusammengesetzt werden. Hierzu existieren verschiedene Präprozessoren. Um letztendlich die Daten auszugeben, ist Snort in der Lage Klartextformate, Binärformate und Datenbanken zur Protokollierung zu nutzen.

Installation

Bei der Installation von Snort stehen unterschiedliche Möglichkeiten zur Verfügung. So ist Snort bereits von einigen Linux-Distributionen aufgenommen worden, so dass der Administrator lediglich das entsprechende Distributionspaket installieren muss. Enthält die Distribution keine Unterstützung für Snort oder soll Snort auf einer anderen Plattform installiert werden, kann der Download von vorkompilierten Binärpaketen von der Snort-Homepage erfolgen . Dort befinden sich unter http://www.snort.org/dl/binaries/RPMS auch RPM-Pakete für alle RPM-basierten Linux-Distributionen. Bei der Wahl der Installation eines RPM-Paketes ist es wichtig, dass die Abhängigkeiten erfüllt sind. Snort benötigt eine aktuelle Version der Bibliothek libpcap. Diese Bibliothek ist als RPM-Paket entweder ebenfalls in der Distribution enthalten oder kann von der tcpdump-Website heruntergeladen werden. Als letzte Möglichkeit besteht die Installation aus den Quellen. In manchen Fällen stellt die Installation eines RPM-Paketes nicht die ideale Installationsform dar. Zum einen mag das RPM-Paket der Distribution nicht den neuesten Stand der Snort-Entwicklung darstellen. Zum anderen besteht bei der Installation aus dem Quelltext die Möglichkeit, die Software gemäß den eigenen Wünschen zu konfigurieren und entsprechende Eigenschaften zu aktivieren. Damit die Übersetzung und die Installation von Snort gelingen kann, müssen einige andere Softwarepakete zuvor auf dem System installiert werden. Unabdingbar für die Übersetzung von Snort ist das Vorhandensein der Bibliothek libpcap. In Abhängigkeit von den aktivierten Eigenschaften werden einige weitere Produkte benötigt (siehe Tabelle)


Funktionalität Softwarepaket URL configure Option
XML (bis Snort 1.9) libxml2 xmlsoft.org --with-libxml2
XML (ab Snort 2.0) libair http://aircert.sourceforge.net --with-libair
XML OpenSSL www.openssl.org --with-openssl
SNMP Traps libsnmp net-snmp.sourceforge.net --with-snmp
WinPopUp (bis Snort 1.9) Samba www.samba.org --enable-smbalerts
FlexResp Libnet www.packetfactory.net/Projects/Libnet --enable-flexresp
ODBC-Log unixODBC www.unixODBC.org --with-odbc
MySQL-Log MySQL www.mysql.org --with-mysql
PostgreSQL-Log PostgreSQL www.postgresql.org --with-postgresql
Oracle-Log Oracle www.oracle.com --with-oracle

Um nun Snort zu übersetzen und zu installieren, muss es zunächst von der Snort-Homepage geladen werden. Danach wird es in ein sinnvolles Verzeichnis(hier: /usr/local/src) entpackt, konfiguriert und übersetzt.

$ cd /usr/local/src
$ wget http://www.snort.org/dl/snort-version.tar.gz
$ tar -xvzf snort-version.tar.gz
$ cd snort-version
$ ./configure --prefix=/usr --bindir=/usr/sbin --sysconfdir=/etc/snort \
--enable-flexresp --with-mysql
$ make
$ sudo make install

Die bei der Konfiguration zusätzlich angegebenen Optionen --prefix, --bindir und --sysconfdir definieren den Ort der Binär- und Konfigurationsdateien. Ein derartig konfiguriertes und übersetztes Snort-Binärprogramm ist in der Lage, eine Protokollierung in der MySQL Datenbank vorzunehmen. Alarmierungen können mithilfe von SNMP und Windows PopUp-Nachrichten durchgeführt werden. Zusätzlich ist Snort in der Lage, flexibel auf Verbindungen zu reagieren und diese sogar zu beenden (flexresp).

Anwendung

Im Folgenden soll Snort nur noch im IDS-Modus betrachtet werden, da dies die interessanteste Anwendung von Snort darstellt. Hierbei werden die Pakete entsprechend einem Regelsatz untersucht. Nur Pakete, welche von den Regeln herausgefiltert werden, werden auch protokolliert. Die Snort-Distribution enthält bereits umfangreiche Regelsätze, welche eingesetzt werden können. Für die meisten Anwendungen sind diese Regelsätze jedoch zu umfangreich und erzeugen auch zu viele falsch-positive Alarmmeldungen. Snort kann für den IDS-Modus mit folgenden Optionen gestartet werden:

snort -de -l /var/log/snort/ -h 192.168.111.0/24 -c rules.conf

Die Datei rules.conf wird nun beim Start eingelesen und sämtliche Pakete werden anschließend entsprechend der Regeln untersucht. Die Option –d ermöglich die Anzeige der Paketinhalte Wird kein Verzeichnis zur Protokollierung angegeben, so wird /var/log/snort als Standardwert angenommen. Die Protokollierung erfolgt in Klartext.

Snort bietet unterschiedliche Ausgabeformate im Intrusion Detection Modus an. Wenn durch den Benutzer keine Angaben zum zu verwendenden Modus gemacht wurden, so protokolliert Snort in Klartext und alarmiert ausführlich (»full alerts«). Insgesamt stehen sechs verschiedene Alarmierungsmethoden zur Verfügung:

-b.             Binär-Protokoll (libpcap-Format)
-N.             Keine Protokollierung
-A fast.        Schnellster Klartext-Modus, Zeitstempel, Alarmmeldung, IP-Adressen
-A full.        Standard-Modus, Zeitstempel, Alarmmeldung, Paket-Header
-A unsock.      Sendet Alarmmeldung an einen UNIX-Socket
-A console.     Sendet Alarmierungen an die Konsole
-A cmg.         Alarmierungen im CMG-Stil2
-A none         Schaltet Alarmierung ab
-s              Alarmiert via Syslogd
-M (bis v1.9.x) Sendet Alarmmeldung via WinPopUp an Windows-Rechner

Snort Rules

Die Regeln definieren nun die Eigenschaften der Pakete, die von Snort untersucht werden sollen. Die Syntax ist recht einfach und erlaubt die Inspektion der IP-Adressen, Ports und auch des Inhaltes des Pakets. Jede Regel muss in einer Zeile definiert werden Jede Regel besteht im Grunde aus zwei Teilen:

- Regelrumpf
- Regeloptionen

Ein Regelrumpf ist bei jeder Regel erforderlich. Die Optionen sind, wie der Name schon sagt, optional. Der Regelrumpf beschreibt die beiden Kommunikationspartner, das »Wer mit wem« der Verbindung. Die Optionen beschreiben den Inhalt, das »Was?«, der Kommunikation. Üblicherweise bestehen Regeln sowohl aus einem Rumpf als auch aus Optionen. In seltenen Fällen kann eine Regel lediglich aus einem Regelrumpf bestehen. Dies kommt zum Beispiel in so genannten Passregeln vor. Die- se missachten bestimmte Pakete vor der Anwendung der restlichen Regeln. Logregeln können alle Pakete eines bestimmtes Rechners protokollieren.

Der Regelrumpf

Aktion

Der Regelrumpf beginnt mit der Aktion. Diese Aktion definiert, wie Snort bei einer zutreffenden Regel reagieren soll. Snort bietet hierzu folgende Schlüsselwörter an:

- Alert.             Snort alarmiert und protokolliert das Paket. Die Alarmierung und Protokollierung
                     erfolgt entsprechend der gewählten Output-Plug-Ins. Bei der Standardeinstellung
                     werden lediglich die Header des Paketes in der Alert-Datei und
                     in dem entsprechenden Protokollverzeichnis protokolliert.
- Log.               Snort protokolliert das Paket lediglich. Es wird keine Alarmierung durchführen.
- Pass.              Snort betrachtet das Paket nicht weiter. So können Pakete ausgefiltert werden,
                     die ansonsten von späteren Regeln betroffen sein würden. 
- Activate.          Snort alarmiert und aktiviert weitere Regeln. Diese weiteren Regeln sind
                     bereits als »Dynamic« definiert, jedoch noch nicht aktiv. Sie werden dynamisch
                     durch diese Regel aktiviert.
- Dynamic.           Snort kann diese Regeln dynamisch anschalten. Der Anschaltvorgang
                     wird von »Activate«-Regeln ausgelöst. Anschließend arbeiten diese Regeln analog
                     zu den »Log«-Regeln.
- Eigene Definition. Es ist z.B. möglich, in Abhängigkeit von der Regel unterschiedliche Ausgabeformate
                     und -ziele zu wählen.

Protokollfeld

Anschließend an die Aktion folgt das Protokollfeld. Dieses Feld definiert das Protokoll, welches von dem Paket verwendet werden darf. Snort kennt bisher die folgenden Protokolle:

- IP
- ICMP
- TCP
- UDP

Weitere Protokolle können in der Zukunft hinzukommen.

Absender Adresse/Port

An das Protokoll schließt sich die Source IP-Adresse an. Diese IP-Adresse definiert die Herkunft des zu untersuchenden bösartigen Paketes. Die Adresse wird in der Classless Internet Domain Routing (CIDR) Notation angegeben, beispielsweise 192.168.0.0/8. Das bedeutet, dass die Netzmaske als Anzahl der von links durchgängig gesetzten Bits angegeben wird. Der Port definiert den Port, den der Absender verwendet hat, um das Paket zu versenden. Gültige Formate des Quell-Ports (wie auch des Ziel-Ports (Destination Port)sind:

- 80 – Angabe des einzelnen Ports
- !80 – Negation, alle Ports außer 80
- 33434:33690 - Port-Bereich
- :1023 – Alle Ports kleiner/einschließlich 1023
- 1024: – Alle Ports gr_ßer/einschließlich 1024
- any – Jeder Port

Verbindungsrichtung

Hier stehen zwei Möglichkeiten zur Auswahl. Entweder handelt es sich um eine unidirektionale (->) Regel, welche Pakete von links nach rechts untersucht, oder um eine bidirektionale (<>) Regel, bei der das Paket von links nach rechts wie auch umgekehrt gesendet werden kann. Hierbei werden dann Quell- Adresse/-Port und Ziel-Adresse/-Port ausgetauscht. Es folgt nun die Ziel-IP-Adresse und der -Port. Diese werden analog der Quell-IP-Adresse und dem Quell-Port definiert. Es gelten dieselben Einschränkungen bezüglich des Formates.

Regeloptionen

Die Regeloptionen erlauben nun eine weitere Spezifikation des Paketes. Sie definieren im Wesentlichen die Funktion des Paketes. Sie werden nur dann von Snort hinzugezogen, wenn der Regelrumpf mit dem Paket übereinstimmt. Die Optionen definieren nun weitere Eigenschaften des verwendeten Protokolls (z.B. TCP-Flaggen) als auch des eigentlichen Paketinhaltes (content). Zusätzlich besteht die Möglichkeit, eine Protokollmitteilung (msg:"" ) zu definieren, die bei Zutreffen der Regel zusätzlich protokolliert wird.

Beispiel für eine Regel mit Regeloption msg:

alert icmp 192.168.111.50 any <> 192.168.111.200 any (msg: "PING Paket, \ möglicher Erkundungsversuch";)


Checkliste/HowTo

Diese Checkliste soll zusammenfassend die wichtigsten Fragen klären, die bei der Installion und Verwendung von Snort auftreten können, bzw. als Indikatoren für mögliche Fehler dienen können.

- Installation aus Quellen oder vorkompiliertem Paket?
- Alle Abhängigkeiten aufgelöst?
- Snort an Hub, Mirror Port angeschlossen?
- Ethernet-Interface im Promiscuos-Mode?
- Regeln aktualisiert?
- Regeln mit aussagekräftigen Meldungen (Regeloption: msg) versehen?

Ein kompletter HowTo in englischer Sprache für Debian findet sich hier

Weblinks/Literatur

Weblinks

http://www.snort.org

http://snort.org/docs/setup_guides/deb-snort-howto.pdf

Literatur

Intrusion Detection und Prevention mit Snort 2 & Co. Einbrüche auf Linux-Servern erkennen und verhindern, Ralf Spenneberg, Addison-Wesley 2004