Distributed Intrusion Detection System

Author:Frank
Datum:13.01.2003 letztes Update 30.07.2003
Zusammenfassung:Intrusion Detection (Einbruchserkennung ist doch ein blödes Wort) ist immer wichtiger für die Verteidigungstrategie eines Netzwerkes. Einfach einen IDS Sensor im Netz zu plazieren ist zwar ganz nett, aber die aufgetretenden Alarme müssen auch ausgewertet werden. Das schreit natürlich nach einer Datenbank. Obwohl es Leute gibt die SQL für einfach halten, wäre es doch schöner eine Klickibunti Oberfläche zu haben um aufgetretende Alarme nach Zeitfenster und/oder IP Adressen zu sortieren. Roman Danyliw vom CERT ist offensichtlich auch der Meinung und hat eine Software "ACID" entwickelt die genau das kann.
In der aktuellen Version 0.9.6b23 Unterstütz ACID auch Daten von Snort 1.9. Die Konfiguration ist ein wenig anders als under den alten Versionen.
Reference:Die Grundlage für dieses Dokument bildet Using Snort For a Distributed Intrusion Detection System , Michael P. Brennan, 29.01.2002
Inhalt:

- Warum gerade Snort ?
- Hardware
- Notwendige Software
- Aufsetzen des Systems
- Management Server
- Remote Sensor
- Absichern
- Links

 Warum Snort ?

An diesem Punkt wird man sich fragen warum man denn Snort benutzen soll, wenn es so schöne und ausgeklügelte kommerzielle Software auf dem Markt zu kaufen gibt? Ganz einfach, weil die sehr teuer sind ! Meine persönliche Theorie ist das letztendlich ein IDS System immer die gleiche Summe Euro kostet. Man kann es kaufen oder selber bauen. Beim letzteren muss man sich halt intensiv damit auseinander setzen, man macht Fehler, erzeugt am Anfang unendlich viele Fehlalarme, aber man lernt zu verstehen was man da eigentlich macht. Bei Security Anwendungen sicherlich nicht verkehrt, wenn man weiss worum es geht ?

Snort ist ein OpenSource und steht unter "GNU GENERAL PUBLIC LICENSE". Es ist warscheinlich die beliebteste freie IDS Software und hat Shadow somit von 1. Platz vertreiben (ja, genau ich bin schon älter :-).
Snort kann

Es ist sehr einfach zu konfigurieren. Regeln sind sehr flexibel, einfach zu schreiben und schnell in die Regelbasis zu schieben. Wenn ein neuer Angriff bekannt wird dauert es nur kurze Zeit bis die entsprechende Regel zur Verfügung steht. Was auch gut ist das Snort eine "Roh- Analyse" der Frames macht, so das man es z.B. auch als "normalen" Netzwerksniffer benutzen.

 Hardware

Die Hardware Anforderungen hängen natürlich von der Größe des Netzwerkes und dem entsprechenden Traffic ab. Grundsätzlich benötigt man 3 verschieden Typen von Maschinen: In diesem Beispiel benutze ich Sun Sparc Systeme, es geht aber natürlich auch Linux Intel System und warscheinlich auch mit Windows Intel Systemen :-)
 
Für den Remote Sensor schreibt Michael das das absolute Minimun ein "Pentium 133 mit 32MB RAM und 2GB Festlatte" ist, eine handelsübliche Ultra5 sollte also ausreichen.
 
Auf dem Management Server läuft eine Datenbank, das erfordert Speicher, je mehr desto besser. Da hier auch alle Alarme gespeichert werden braucht man entsprechend Platz auf der Platte. Michael meint das das absolute Minimum bei einem "300MHz Celeron mit 64MB RAM" sein sollte, (damit macht das Arbeiten natürlich keinen Spaß :-)
 
Der Monitor braucht keine spezielle Hardware, das ist einfach nur ein Rechner mit einem WEB Browser der per SSL auf den Management Server verbindet.

 Notwendige Software

Man muss das Rad ja nicht immer neu erfinden. Deshalb kommt für dieses System eine Vielzahl an OpenSource Software zum Einsatz. Ich benutze an dieser Stelle die Sourcen und übersetze sie selbst. Natürlich kann man auch fertige Pakete benutzen.
 
SoftwareVersionBeschreibung
Snort2.0.1IDS Software für den Sensor.
MySQL4.0.14SQL Datenbank für den Managementserver. Auf dem Sensor werden die MySQL Biblotheken installiert damit er mit der eigentlichen Datenbank auf dem Management Server kommunizieren kann.
Apache Web Server1.3.28Benutzen wir als Secure WEB Server. Den benötigen wir zu Anzeige der Analyse Console.
PHP4.3.2OpenSource Sript Sprache, so ähnlich wie Perl. PHP wird ebenfalls für die Analyse Console benötigt.
mod_SSL 2.8.15-1.3.28Notwendig für die Apache Konfiguration. Dadurch wird Apache in die Lage versetzt SSL Verschlüsselungn zu realisierren, welche für die sichere Kommunikation zwischen Management Server und Monitor wichtig ist.
OpenSSl0.9.7bGanz einfach ausgedrückt ist benötigen wir das als Zertifikatsverwaltung für Apache und Stunnel.
Stunnel4.04Ist ein generischer SSL proxy, um die Kommunikation von Klartextprotokollen wie z.B. SQL zwischen Sensor und Management zu Verschlüsseln.
A.C.I.D.0.9.6b23Steht für Analysis Console for Intrusion Detection. Sie wurde entwickelt von Roman Danyliw vom CERT. Es ist eine Sammlung von PHP Scripten die es erlauben in der Eventdatenbank nach allen erdenklichen Mustern (IP-Adressen, Zeitraum, Alarme etc.) zu suchen.
ADOdb3.7.0Ist eine PHP Bibliothek zur Abfrage von Datenbanken.
zlib1.1.4Ist eine freie Kompressionsbibliothek.
JpGraph1.12.1Ist eine Grafikbibliothek die es PHP erlaubt ohne viel PhP-Code Grafiken zu erstellen

 Aufsetzen des Systems

Der erste Schritt ist das Aufsetzen und Absichern des Betriebssystemes. Wir benutzen Solaris9. Auf dem Sensor reicht die Core-Gruppe auf dem Manager benötigen wir mindestens die EndUser-Gruppe. Auf dem Mangager unbedingt eine eigene (grosse :-) Partition für die Datenbank anlegen.
Auf dem Management Server werden wir die benötigte Software übersetzen, deshalb brauchen wir dort einen Compiler und die dazugehörigen Bibliotheken. Mit Solaris9 wir eine CD "Solaris Software Companion" mit ausgeliefert, auf der sich allerlei nützliche Tools befinden. So auch der Compiler gcc-2.95 (Paket SFWgcc).
Desweiteren brauchen wir das

 Management Server

Ok, los geht mit der Installorgie. Ich habe dafür ein Verzeichniss /usr/src wo alle Sourcen im tar.gz Format liegen. Wir fangen mal mit zlib an:
gtar zxf zlib-1.1.4.tar.gz ; mv zlib-1.1.4 zlib ; cd zlib
./configure
make
make install
cd ..
Jetzt sollten wir gleich das Enviroment anpassen und sowohl den Binarie-Such-Pfad (PATH) als auch den Biblotheken-Such-Pfad (LD_LIBRARY_PATH) um die Verzeichnisse von zlib, und das was noch kommt, erweitern:
export PATH=$PATH:/usr/local/bin:/usr/sfw/bin:/usr/ccs/bin:/usr/xpg4/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
Der nächste Schritt ist OpenSSL. Openssl verlang für die Übersetzung übrigens das perl installiert ist. Da sollte man mit perl -v mal testen, bevor man wie üblich weitermachen kann:
gtar zxf openssl-0.9.7b.tar.gz ; mv openssl-0.9.7b openssl ; cd openssl
./config
make
make install
cd ..
Jetzt ist die Datenbank dran. MySQL braucht ein paar Daten der benutzten Apache Version. Deshalb Apache erst entpacken und kurz konfigurieren. Bei dieser ersten Apache Konfiguration wird nur das spätere Zielverzeichnis angegeben. Ausserdem braucht die Datenbank einen eigenen User. Das Zielverzeichniss (--prefix) ist per default /usr/local/mysql. Ist also ganz brauchbar und muss somit nicht extra mit angegeben werden. Allerdings sollte man seine Datenbank auf eine eigene Partition legen. Des halb der Schalter (--localstatedir).
groupadd mysql
useradd -g mysql mysql
gtar zxf apache_1.3.28.tar.gz ; mv apache_1.3.28 apache ; cd apache
./configure --prefix=/usr/local/www 
cd ..
gtar zxf mysql-4.0.14.tar.gz ; mv mysql-4.0.14 mysql ; cd mysql
./configure --with-apache=../apache --localstatedir=/home/daten/snortdb
make
make install
cd ..
Als nächste Software kommt modssl dran. Diese wird nur konfiguriert. "make + make install" gibt es in diesem Schritt nicht, das passiert in einem Schritt bei Apache Übersetzung.
tar zxf mod_ssl-2.8.12-1.3.28.tar.gz ; mv mod_ssl-2.8.12-1.3.28 modssl ; cd modssl
./configure --with-apache=../apache
cd ..
Wie am Anfang schon erwähnt, kann man Alarme zusammenfassen und grafisch darstellen. Das sieht auf jeden Fall nett aus, ob es in der Praxis irgendwelchen Nutzen, möchte ich bezweifeln.
Egal auf jeden Fall brauchen wir ein paar zusätzliche Files dazu. Die notwendigen Pakte von SUN (SUNWxx) sollten eigentlich schon bei der Installation mitgekommen sein, aber besser ist mal nachsehen... Weiter gehts mit php. Das Angeben des Konfigfiles (with-config-file) spart nachher einiges suchen.
tar zxf php-4.3.0.tar.gz ; mv php-4.3.0 php ; cd php
CPPFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib ./configure \
--with-mysql=../mysql \ 
--with-apache=../apache \
--with-jpeg-dir=/usr/sfw \
--with-png-dir=/usr/sfw \
--with-freetype2=/usr/sfw \
--with-gd \
--with-zlib \
--with-config-file=/etc/php \
--enable-track-vars
make 
make install
cd ..
Nun endlich kommen zur Konfiguration des WEB Servers. Der Schritt "make certificate TYPE=custom" generiert gleich die Zertifikate sowie eine eigene CA.
cd ../apache 
SSL_BASE=../openssl ./configure \
--activate-module=src/modules/php4/libphp4.a \
--enable-module=ssl \
--enable-shared=ssl \
--prefix=/usr/local/www \
--enable-rule=EAPI \
make 
make certificate TYPE=custom 
make install
cd ..
Um PHP Konfigurieren zu können sollte man die entsprechende config Datei php.ini von /install/php-4.2.2/pear/tests/php.ini nach /etc/php kopieren. Es ist auch ganz nützlich wenn man in dieser Datei gleich die beiden folgenden Punkte einschaltet:
display_errors = On
error_reporting  =  E_ALL & ~E_NOTICE
Ausserdem muss man Apache noch sagen, das er PHP sprechen soll. Dazu ist in der Konfigurationsdatei /usr/local/www/conf/httpd.conf folgende beiden Zeilen einzutragen.
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
Nun sollte sich der WEB Server starten lassen.
cd /usr/local/www/bin
apachectl start
Mit dem WEB Browser sollte man sich nun auf Port 80 verbinden können. Um zu sehen ob PHP auch richtig konfiguriert ist, schreiben wir eine PHP Datei und legen die unter dem Docroot /usr/local/www/htdocs ab. Die Datei hat folgenden Inhalt:
 <?
PHPINFO();
?>
Wenn man diese Datei mit dem Browser ansteuert kann man die PHP Konfiguration sehen. Im Abschnitt "GD" sollte mindestens folgendes zu sehen sein:
Wenn dass OK ist dann kann man jpgraph und adodb "installieren". Die beiden Datei werden nur in das Docroot entpackt.
cd /usr/local/www/htdocs
gtar zxf jpgraph-1.12.1.tar.gz ; mv jpgraph-1.12.1 jpgraph
gtar zxf adodb370.tgz ; mv adodb370 adodb
Gut der WEB Server läuft und zeigt bunte Bilder, kommt als nächstes die Datenbank dran. Dazu liegt im Installationsverzeichniss von mysql ein Installationsscript das man benutzen kann. Allerding muss man vorher das Verzeichniss dem User mysql überantworten.
mkdir -p /home/daten/snortdb
chown mysql:mysql /home/daten/snortdb
cd /install/mysql.server/scripts
./mysql_install_db
Nun kann man die DB mit /usr/local/mysql/bin/safe_mysqld & starten. Unmittelbar danach sollten wir einen User für die Datenbank anlegen.
mysqladmin -u root password geheim
Für ACID benötigen wir zwei Datenbanken, snortdb und archive. In die Erste schreiben die Sensoren alle Ihre Events. Diese Datenbank sollte man so klein wie möglich halten, oft nachsehen und Fehlalarme löschen. Alarme die man im Auge behalten möchte werden in die zweite Datenbank verschoben. Diese kann man dann für Lanzeitanalysen benutzen. Im Snort Sourceverzeichniss liegt ein Script (create_mysql) was die Datenbankstrukturen für Snort anlegt. Das für die ACID Tabellen (create_acid_tbls_mysql.sql) liegt im ACID Source Verzeichnis. Grundsätzlich sollte man drei SQL User definieren. Einen User Namens snort, der ausschließlich von den Sensoren benutzt wird um Alarme in die Datenbank zu schreiben. Einen weiteren Namens wichtig, der alles darf, und einen dritten Namens opi. Den User opi kann man zum gefahrlosen Anzeigen benutzen. Mehr dazu im Abschnitt ACID Konfiguration
cd /usr/src
gtar zxf snort-1.9.0.tar.gz ; mv snort-1.9.0 snort
gtar zxf acid-0.9.6b23.tar.gz ; mv acid-0.9.6b23 acid
mysql -u root -p
mysql> create database snortdb;
mysql> create database archive;
mysql> connect snortdb
mysql> source /usr/src/snort/contrib/create_mysql
mysql> source /usr/src/acid/create_acid_tbls_mysql.sql
mysql> connect archive
mysql> source /usr/src/snort/contrib/create_mysql
mysql> source /usr/src/acid/create_acid_tbls_mysql.sql
mysql> connect mysql
mysql> grant INSERT, SELECT on snortdb.* to snort@sensor;
mysql> grant CREATE, INSERT, SELECT, UPDATE, DELETE on snortdb.* to wichtig@localhost;
mysql> grant CREATE, INSERT, SELECT, UPDATE, DELETE on archive.* to wichtig@localhost;
mysql> grant CREATE, INSERT, SELECT, UPDATE on snortdb.* to opi@localhost;
mysql> grant CREATE, INSERT, SELECT, UPDATE on archiv.* to opi@localhost;
mysql> set password for 'snort'@'%'=password('geheim');
mysql> set password for 'wichtig'@'localhost'=password('geheim');
mysql> set password for 'wichtig'@'%'=password('geheim');
mysql> set password for 'opi'@'localhost'=password('geheim');
mysql> set password for 'opi'@'%'=password('geheim');
mysql> flush privileges;
mysql> exit;

Die meisten Probleme gibt es mit den Rechten für die einzelnen Datenbank. Wichtig zu wissen ist, das diese Rechte in zwei (!) Tabellen der Datenbank mysql gehalten werden: Mal ein paar Beispiele:
Der folgende Befehl erlaubt dem Benutzer snort vom Rechner sensor den grundsätzliche Zugriff auf die Datenbank. Er darf nur Daten hinzufügen Insert_priv. Sein Passwort wir auf geheim gesetzt
mysql> connect mysql
INSERT INTO user (Host, User, Password, Insert_priv)
    -> VALUES ('sensor', 'snort', password('geheim'), 'Y')
    -> ;
Im folgenden wird dem Benutzer wichtig vom lokalen Rechner deutlich mehr Rechte eingeräumt.
mysql> connect mysql
INSERT INTO user (Host, User, Password, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv) 
    ->  VALUES ('localhost', 'wichtig', password('geheim'), 'Y', 'Y', 'Y', 'Y', 'Y')
    -> ;
Und zum Schluss wird in der Datenbank db in jeder Tabelle die Rechte für den Rechner sensor definiert hat, noch zusätzlich das SELECT Recht gegeben.
UPDATE db set Select_priv = 'Y' where Host = 'sensor' ;

Die Installation von ACID ist ein simpler Kopiervorgang. Zuerst werden zwei Verzeichnisse im Docroot erzeugt:
mkdir -p /usr/local/www/htdocs/acid
mkdir -p /usr/local/www/htdocs/opi
Danach werden alle notwendigen Daten da reinkopiert und dann die Rechte entsprechend gesetzt.
cd /install/acid
cp *.php /usr/local/www/htdocs/acid
cp *.html /usr/local/www/htdocs/acid
cp *.css /usr/local/www/htdocs/acid
cp *.inc /usr/local/www/htdocs/acid
cp *.php /usr/local/www/htdocs/opi
cp *.html /usr/local/www/htdocs/opi
cp *.css /usr/local/www/htdocs/opi
cp *.inc /usr/local/www/htdocs/opi
chmod 755 /usr/local/www/htdocs/acid /usr/local/www/htdocs/opi
chmod 644 /usr/local/www/htdocs/acid/* /usr/local/www/htdocs/opi/*
Die Datei acid_conf.php ist die Konfigurationsdatei von Acid. Gemäß der Datenbankkonfiguration sollten folgende Einträge enthalten sein:
$DBlib_path = "../adodb"
$DBtype = "mysql"
$alert_dbname   = "snortdb";
$alert_host     = "localhost";
$alert_port     = "";
$alert_user     = "wichtig";
$alert_password = "geheim";
$ChartLib_path = "../jpgraph/src";
$chart_file_format = "png";
Nun können wir die Datei acid_main.php im Browser öffen. Was jetzt noch fehlt sind die Daten.

 Sensor

Auf dem Sensor ist nur die minimal notwendige Software installiert. Deshalb wird die für den IDS Sensor benötigte Software auf dem Manager kompiliert und dann einfach auf den Sensor kopiert. Da snort ja in eine Datenbank schreiben soll müssen wir zuert die Datenbank-Client-Unterstützung kompilieren.
/
manager# cd /usr/src
manager# mv mysql mysql.server
manager# gtar zxf mysql-4.0.14.tar.gz ; mv mysql-4.0.14 mysql ; cd mysql
manager# ./configure --without-server --prefix=/usr/local/mysql.client
manager# make
manager# make install
Auf dem Sensor braucht übrigens kein User mysql angelegt werden, da snort nur die Bibliotheken verwendet. Die Benutzten Bibliotheken liegen unter /usr/local/mysql.client/lib/mysql. Dieses Verzeichniss sollte vom Manager auf den Sensor kopiert werden.
Snort benötigt die libpcap Bibliothek die es erlaubt von der Netzwerkschnitstelle zu lesen. Dazu muss auf dem Manager und dem Sensor das Paket SFWlpcap installiert werden. Nun können wir snort übersetzen.
manager# cd /usr/src/snort
manager# ./configure --with-mysql=usr/local/mysql.client/
manager# make
manager# make install
Es wird nur eine einzige Datei erzeugt. Diese heisst snort und liegt unter /usr/local/bin. Diese Datei wird auf den Sensor kopiert. Jetzt brauchen wir ein Verzeichniss für die LOG- und Konfigurationsdaten
sensor# mkdir -p /etc/snort
sensor# mkdir -p /daten/log/snort
Jetzt brauchen wir einen aktuellen Regelsatzt . Die Datei einfach nach /etc/snort kopieren und dort entpacken tar zxf snortrules.tar.gz. Es entsteht ein Unterverzeichniss mit den Regeln. Daraus kopieren wir die Konfigurationsdatei snort.conf nach /etc/snort. Natürlich muss man das Teil noch anpassen. Zu Testen reicht es aber erst mal. Mit folgenden Aufruf kann man snort starten:
/usr/local/bin/snort -o -i eri1 -l /daten/log/snort -c /etc/snort/snort.conf
Sollte hier keine Fehlermeldung kommen, dann können wir Sort überreden in eine Datenbank zu schreiben. Das passiert durch folgende LOG-Regel:
output database: alert, mysql, host=192.168.1.1 dbname=snortdb user=snort password=geheim \
sensor_name=sensor1, encoding=ascii
Die IP Adresse (192.168.1.1) ist IP Adresse vom Manager. Der Sensor Name (sensor1) ist ein im IDS eindeutiger Name. So kann ACID unterscheiden von wo die LOG Daten kommen. Nach einem Restart von snort sollte der Sensor eigentlich in die Datenbank schreiben. In Acid sollte oben links der erste Sensor erscheinen. Wenn das der Fall ist dann kann man snort im Deamon Modus (-D) starten
/usr/local/bin/snort -D -o -i eri1 -l /daten/log/snort -c /etc/snort/snort.conf

 Absichern

So nun läuft unser "Distributed Intrusion Detection System" ja schon. Man das auch ein wenig sicherer machen.

STunnel

Snort sendet seine Daten im Klatext übers Netz um es in die Datenbank zu schreiben. Hier bietet sich stunnel an. Mit STunnel ist ein generische SSL verschlüselte Tunnel aufbauen.
manager# cd /install
manager# tar xzf stunnel-4.04.tar.gz ; mv stunnel-4.01 stunnel ; cd stunnel
manager# ./configure 
manager# make 
manager# make install
Auf den Sensor werden die beiden Dateien /usr/local/sbin/stunnel und /usr/local/lib/libstunnel.so kopiert. Danach kann/sollte man noch auf beiden Rechnern die Datei /usr/local/etc/stunnel/stunnel.conf anlegen.
sensor# cat /usr/local/etc/stunnel/stunnel.conf
#
pid = /usr/local/var/run/stunnel.pid
client = yes
#
[mysql]
accept = 127.0.0.1:3306
connect = 192.168.1.1:3307
sensor# cat /usr/local/etc/stunnel/stunnel.conf
#
pid = /usr/local/var/run/stunnel.pid
#
[mysql]
accept = 192.168.1.1:3307
connect = 127.0.0.1:3306
Jetzt sollte man auf beiden Seiten mir /usr/local/sbin/stunnelden Tunnel starten können.
Ob der Tunnel auch wirklich funktioniert kann man mit folgendem Test sehen:
sensor# telnet localhost 3306
Wenn auch Dieser erfolgreich war, dann sollten wir snort überreden den Tunnel zu benutzen:
output database: alert, mysql, host=127.0.0.1 dbname=snortdb user=snort password=geheim \
sensor_name=sensor1, encoding=ascii

Apache

Am Apache kann man auch eine Menge optimieren. Zuerst sollte er so konfiguriert werden, dass die Kommunikation ausschließlich über SSL erfolgt. Ausserdem sollte man für die beiden Benutzer ein Password vergeben, und die Passwortüberprüfung in der https.conf einschalten.
<DIRECTORY "/usr/local/www/htdocs/acid">
        AuthType Basic
        AuthName "IDS Login"
        AuthUserFile /usr/local/www/conf/.passwords
        Require user snort
        AllowOverride None
</DIRECTORY>
htpasswd -c /usr/local/www/conf/.passwords snort
htpasswd /usr/local/www/conf/.passwords opi

 Links