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 ? |
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
Software | Version | Beschreibung |
Snort | 1.8.7 | IDS Software für den Sensor. |
Libpcap | 0.7.1 | Bibliothek die von Snort benutzt wird um die Frames vom Netzwerkinterface mitzulesen. |
OpenSSH | 3.4p1 | Software zur "abhörsicheren" Administartion. |
MySQL | 3.23.51 | SQL Datenbank. Auf dem Sensor werden die MySQL Biblotheken installiert damit er mit der eigentlichen Datenbank auf dem Management Server kommunizieren kann. |
Apache Web Server | 1.3.26 | Bbenutzen wir als Secure WEB Server. Den benötigen wir zu Anzeige der Analyse Console. |
PHP | 4.2.2 | OpenSource Sript Sprache, so ähnlich wie Perl. PHP wird ebenfalls für die Analyse Console benötigt. |
mod_SSL | 2.8.10-1.3.26 | Notwendig 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. |
OpenSSl | 0.9.6e | Ganz einfach ausgedrückt ist benötigen wir das als Zertifikatsverwaltung für Apache uns Stunnel. |
Stunnel | 3.22 | Ist 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.6b21 | Steht 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. |
ADOdb | 2.3.1 | Ist eine PHP Bibliothek zur Abfrage von Datenbanken. |
zlib | 1.1.3 | Ist eine freie Kompressionsbibliothek. |
Software | Version | Beschreibung |
PHPlot | 4.4.6 | Sammlung von PHP Scripte um ein Diagramm grafisch darzustellen. |
GD | 1.8.4 | ANSI C Bibliothek zum dynamischen erzeugen von Bildern. Sie wird von PHPlot benutzt. |
libpng | 1.2.4 | Grafikbibliothek für Bilder im PNG Format. Sie wird für GD benötigt. |
jpeg | 6b | Grafikbibliothek für Bilder im JPEG Format. Sie wird für GD benötigt. |
FreeType2 | 2.1.2 | OpenSource TrueType Font Engine zum erzeugen von Text in Bildern. Sie wird von GD benutzt. |
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/libDer 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!
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_NOTICEAusserdem 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 .phpsNun sollte sich der WEB Server starten lassen
cd /usr/local/www/bin apachectl startMit 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:
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 adodbUm 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.
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/opiDanach 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.
/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 installAuf 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 installEs 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/snortJetzt 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:
output database: alert, mysql, host=192.168.1.1 dbname=snortdb user=snort password=geheim \ sensor_name=sensor1, encoding=asciiDie 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
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
manager# cd /install manager# tar xzf stunnel-3.22.tar.gz ; mv stunnel-3.22 stunnel ; cd stunnel manager# ./configure manager# make manager# make installAuf 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:3307Ob der Tunnel auch wirklich funktioniert kann man mit folgendem Test sehen:
sensor# telnet localhost 3306Wenn 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
<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