Distributed Intrusion Detection System

Author:Frank
Datum:22.08.2002
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.
Diese Seite beschreibt den Aufbau eines Distributed Intrusion Detection System unter Verwendung von Snort als IDS Sensor, MySQL als Datenbank und ACID als Monitor.
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
Snort1.8.7IDS Software für den Sensor.
Libpcap0.7.1Bibliothek die von Snort benutzt wird um die Frames vom Netzwerkinterface mitzulesen.
OpenSSH3.4p1Software zur "abhörsicheren" Administartion.
MySQL3.23.51SQL Datenbank. Auf dem Sensor werden die MySQL Biblotheken installiert damit er mit der eigentlichen Datenbank auf dem Management Server kommunizieren kann.
Apache Web Server1.3.26Bbenutzen wir als Secure WEB Server. Den benötigen wir zu Anzeige der Analyse Console.
PHP4.2.2OpenSource Sript Sprache, so ähnlich wie Perl. PHP wird ebenfalls für die Analyse Console benötigt.
mod_SSL2.8.10-1.3.26Notwendig 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.6eGanz einfach ausgedrückt ist benötigen wir das als Zertifikatsverwaltung für Apache uns Stunnel.
Stunnel3.22Ist 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.6b21Steht 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.
ADOdb2.3.1Ist eine PHP Bibliothek zur Abfrage von Datenbanken.
zlib1.1.3Ist eine freie Kompressionsbibliothek.

Nice to have Software

ACID hat eine experimentelle Funktion die es erlaubt sich die Alarmdaten grafisch darstellen zu lassen. Sieht nett aus. Wenn man das möchte braucht man zusätzlich noch einige Software. Aber das kompilieren ist, naja sagen wir mal nicht so einfach...
 
SoftwareVersionBeschreibung
PHPlot4.4.6Sammlung von PHP Scripte um ein Diagramm grafisch darzustellen.
GD1.8.4ANSI C Bibliothek zum dynamischen erzeugen von Bildern. Sie wird von PHPlot benutzt.
libpng1.2.4Grafikbibliothek für Bilder im PNG Format. Sie wird für GD benötigt.
jpeg6bGrafikbibliothek für Bilder im JPEG Format. Sie wird für GD benötigt.
FreeType22.1.2OpenSource TrueType Font Engine zum erzeugen von Text in Bildern. Sie wird von GD benutzt.

 Aufsetzen des Systems

Der erste Schritt ist das Aufsetzen und Absichern des Betriebssystemes. Wir benutzen Solaris 8. 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. Für das erfolgreiche Funktionieren von Stunnel braucht man den Patch 112438. Dabei handelt es sich um den "secuity random number generator". Falls der fehlt erhält man beim Starten von Stunnel die Fehlermeldung: SSLEAY_RAND_BYTES PRNG not seeded
Auf dem Management Server werden wir die benötigte Software übersetzen, deshalb brauchen wir dort einen compiler und die dazugehörigen Bibliotheken. Ich benutze die beiden Pakte gcc-3.1-sol8-sparc-local.gz und libgcc-3.1-sol8-sparc-local.gz von sunfreeware. Auch brauchen wir die Solaris Header Files (Pakte SUNWhea und SUNWsrh) und die Tools make und as (Beide in Pakt SUNWsprot).

 Management Server

Ok, los geht mit der Installorgie. Ich habe dafür ein Verzeichniss /install wo alle Sourcen im gz Format liegen. Wir fangen mal mit zlib an:
tar zxf zlib-1.3.3.tar.gz ; mv zlib-1.3.3 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
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:
tar zxf openssl-0.9.6e.tar.gz ; mv openssl-0.9.6e openssl ; cd openssl
./configure
make
make install
cd ..
Jetzt ist die Datenbank dran. MySQL braucht ein par 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.
groupadd mysql
useradd -g mysql mysql
tar zxf apache_1.3.26.tar.gz ; mv apache_1.3.26 apache ; cd apache
./configure --prefix=/usr/local/www
cd ..
tar zxf mysql-3.23.51.tar.gz ; mv mysql-3.23.51 mysql ; cd mysql
./configure --with-apache=../apache
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.10-1.3.26.tar.gz ; mv mod_ssl-2.8.10-1.3.26 modssl ; cd modssl
./configure --with-apache=../apache
cd ..
An dieser Stelle sollte man sich entscheiden. Braucht man eine grafische Alarmanzeige oder nicht? Bis jetzt ging ja alles noch einfach, aber die erfolgreiche Übersetzung von GD ist einfach schrecklich!
Ok, zunächst brauchen wir die Freetype Schriften. Die soll nach /usr/local installiert werden.
tar zxf freetype-1.3.1.tar.gz ; mv freetype-1.3.1 freetyp ; cd freetyp
./configure --prefix=/usr/local
make
make install
cd ..
Auch die jpeg Biliothek soll unter /usr/local installiert werden. Genau genommen liegt die dann unter /usr/local/lib.
tar zxf jpegsrc.v6b.tar.gz ; mv jpeg-6b jpeg ; cd jpeg
./configure -prefix=/usr/local --enable-shared --enable-static
make 
make test
make install
cd ..
Jetzt die zweite Grafikbibliothek. Hier fehlt ein "configure" und ein "make install" Script
tar zxf libpng-1.2.4.tar.gz ; mv libpng-1.2.4 libpng ; cd libpng
make -f scripts/makefile.solaris CC=gcc ZLIBLIB=../zlib ZLIBINC=../zlib
cp libpng* /usr/local/lib
cd ..
Nun haben wir endlich alles um GD zu übersetzen.
tar zxf gd-1.8.4.tar.gz ; mv gd-1.8.4 gd ; cd gd
make INCLUDEDIRS="-I. -I../zlib -I../libpng -I../jpeg -I../freetyp" \ 
LIBDIRS="-L../zlib -L../libpng -L../jpeg -L../freetyp" \ 
LIBS="-lgd -lpng -lz -lm -ljpeg"
make install
cd ..
Weiter gehts mit php. Die Option "with-mysql" benutzt die von PHP mitgebrachten MySQL Header Datein. Eigentlich sollte man mit with-mysql=../mysql übersetzen; das führt aber bei mir zu einem Abbruch des Kompilers. Das Angeben des Konfigfiles (with-config-file) spart nachher einiges suchen.
tar zxf php-4.2.2.tar.gz ; mv php-4.2.2 php ; cd php
./configure \ 
--with-mysql \ 
--with-apache=../apache \ 
--with-jpeg-dir=/usr/local/lib \ 
--with-png-dir=/usr/local/lib \ 
--with-gd \ 
--with-zlib \ 
--with-config-file-path=/etc \ 
--enable-bcmath \ 
--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 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 phplot und adodb "installieren". Die beiden Datei werden nur in das Docroot entpackt.
cd /usr/local/www/htdocs
tar zxf phplot-4.4.6.tar.gz ; mv phplot-4.4.6 php
tar zxf adodb221.tgz ; mv adodb221 adodb
Um zu Testen ob phplot korrekt arbeitet, könnte man im Brower die URL auf die Datei http://localhost:80/phplot/examples/test_setup.php zeigen lassen. Na geht nicht, stimmts. In diesem Script ist nämlich ein Fehler. Es versucht zuerst ein GIF Image zu erstellen, wir aber diese Funktion nicht in GD einkompiliert haben bricht es ab. Dieser ganze Abschnitt zur Erstellung eines GIF muss also raus, dann sollten zwei Bilder zu sehen sein. Mit der Datei http://localhost:80/phplot/examples/create_chart.php sieht das dann etwas schöner aus.
 
Gut der WEB Server läuft und zeigt bunte Bilder, kommt als nächstes die Datenbank dran. Die DB kann man /usr/local/mysql/bin/safe_mysqld & starten. 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. Es gibt zwei SQL User, snort und opi. Den User opi braucht man zum gefahrlosen Anzeigen. Mehr dazu im Abschnitt ACID Konfiguration
cd /install
tar zxf snort-1.8.7.tar.gz ; mv snort-1.8.7 snort
tar zxf acid-0.9.6b21.tar.gz ; mv acid-0.9.6b21 acid
mysql -u root
mysql> set password for 'root'@'localhost'=password('geheim');
mysql> create database snortdb;
mysql> connect snortdb
mysql> source /install/snort/contrib/create_mysql
mysql> source /install/acid/create_acid_tbls_mysql.sql
mysql> grant CREATE, INSERT, SELECT, UPDATE, DELETE on snort.* to snortdb;
mysql> grant CREATE, INSERT, SELECT, UPDATE, DELETE on snort.* to snortdb@localhost;
mysql> grant CREATE, INSERT, SELECT, UPDATE on snort.* to opi;
mysql> grant CREATE, INSERT, SELECT, UPDATE on snort.* to opi@localhost;
mysql> connect mysql
mysql> set password for 'snort'@'localhost'=password('geheim');
mysql> set password for 'snort'@'%'=password('geheim');
mysql> set password for 'opi'@'localhost'=password('geheim');
mysql> set password for 'opi'@'%'=password('geheim');
mysql> flush privileges;
mysql> exit;
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 *.php /usr/local/www/htdocs/opi
cp *.html /usr/local/www/htdocs/opi
cp *.css /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     = "snort";
$alert_password = "geheim";
$ChartLib_path = "../phplot";
$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.
/usr/local/bin
manager# cd /install
manager# mv mysql mysql.server
manager# tar zxf mysql-3.23.51.tar.gz ; mv mysql-3.23.51 mysql ; cd mysql
manager# ./configure --without-server --prefix=/opt/mysql
manager# make
manager# make install
Auf dem Sensor braucht übrigens kein User mysql angelegt werden, das snort nur die Bibliotheken verwendet. Nun können wir snort übersetzen.
manager# cd /install/snort
manager# ./configure --with-mysql=/opt/mysql
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
mkdir -p /etc/snort
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.

SSH

Dazu wird SSH installiert. Es braucht jetzt einen eigenen User (sshd) und ein leeres Startverzeichniss (/var/emty)
manager# useradd -g 65534 -d /usr/local/sbin/sshd -s /bin/false -c "Kommentar" sshd
manager# mkdir -p /var/empty 
manager# cd /install
manager# tar zxf openssh-3.4p1.tar.gz ; mv openssh-3.4p1 openssh ; cd openssh
manager# ./configure 
manager# make 
manager# make install
manager# cd ..
Auf dem Manager kann man sshd nun starten. Auf den Sensor müssen die SSH-Daten von /usr/local/etc, usr/local/bin, /usr/local/sbin, und /usr/local/libexec noch kopiert werden. Auch muss hier ein neuer Schlüssel erzeugt werden:
sensor1# ssh-keygen -t rsa -f /usr/local/etc/ssh_host_key
sensor1# ssh-keygen -t rsa -f /usr/local/etc/ssh_host_rsa_key
sensor1# ssh-keygen -t dsa -f /usr/local/etc/ssh_host_dsa_key

STunnel

Gut nun sendet aber snort seine Daten immer noch im Klatext übers Netz um es in die datenbank zu schreiben. Auch hier bietet sich eigentlich ssh an, um diese Datenkommunikation zu verschlüsseln. Aber irgentwie klappt das nicht bei mir. Aus diesem Grund benutze ich eine weiter Software - stunnel.
manager# cd /install
manager# tar xzf stunnel-3.22.tar.gz ; mv stunnel-3.22 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/stunnel.so kopiert. Jetzt sollte man auf beiden Seiten den Tunnel starten können.
manager# /usr/local/sbin/stunnel -p /usr/local/etc/stunnel.pem -d 3307 -r localhost:3306
sensor# /usr/local/sbin/stunnel -c -d localhost:3306 -r 192.168.1.1:3307
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