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 ? |
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 | 2.0.1 | IDS Software für den Sensor. |
MySQL | 4.0.14 | SQL 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 Server | 1.3.28 | Benutzen wir als Secure WEB Server. Den benötigen wir zu Anzeige der Analyse Console. |
PHP | 4.3.2 | OpenSource Sript Sprache, so ähnlich wie Perl. PHP wird ebenfalls für die Analyse Console benötigt. |
mod_SSL | 2.8.15-1.3.28 | 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.7b | Ganz einfach ausgedrückt ist benötigen wir das als Zertifikatsverwaltung für Apache und Stunnel. |
Stunnel | 4.04 | 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.6b23 | 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 | 3.7.0 | Ist eine PHP Bibliothek zur Abfrage von Datenbanken. |
zlib | 1.1.4 | Ist eine freie Kompressionsbibliothek. |
JpGraph | 1.12.1 | Ist eine Grafikbibliothek die es PHP erlaubt ohne viel PhP-Code Grafiken zu erstellen |
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/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:
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.
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_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 gtar zxf jpgraph-1.12.1.tar.gz ; mv jpgraph-1.12.1 jpgraph gtar zxf adodb370.tgz ; mv adodb370 adodbGut 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_dbNun 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 geheimFü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;
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' ;
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 *.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.
/ 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 installAuf 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.
manager# cd /usr/src/snort manager# ./configure --with-mysql=usr/local/mysql.client/ 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
sensor# mkdir -p /etc/snort sensor# 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# cd /install manager# tar xzf stunnel-4.04.tar.gz ; mv stunnel-4.01 stunnel ; cd stunnel manager# ./configure manager# make manager# make installAuf 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:3306Jetzt sollte man auf beiden Seiten mir /usr/local/sbin/stunnelden Tunnel starten können.
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