Come creare un Firewall LOG Analysis tool con ACID Hal
Come creare un Firewall LOG Analysis tool con ACID Table of Contents 0) PREAMBOLO...1 0.1) Ma che bella idea...1 1) INTRODUZIONE...2 1.1) Perche' mettere in piedi un server del genere?...2 1.2) Creare un server sicuro...2 1.3) Requisiti:...2 2) Installazione pacchetti e configurazioni preliminari...3 2.1) IPTABLES...3 2.2) SYSLOG...3 2.3) PHP...3 2.4) APACHE...3 2.5) SNORT...4 2.6) LOGSNORTER...4 2.7) MYSQL...4 2.8) ADODB + JPGRAPH + PHPLOT + ACID...5 2.9) GD...5 3) Configurazione e integrazione pacchetti...6 4) Test del sistema...8 5) Tuning finale del sistema...9 5.1) Configurazione finale ACID...9 5.2) Configurazione della rotazione dei log...9 5.3) Aggiornamento automatico del Database...10 5.4) Rendere attivo il sistema ad ogni riavvio...10 6) Riferimenti e Links...11 i
0) PREAMBOLO 0.1) Ma che bella idea... Ciao a tutti, questo piccolo preambolo per ringraziare l'autore del documento originale, Anthony Shearer, che ha pubblicato il suo documento sul sito di GIAC 0) PREAMBOLO 1
1) INTRODUZIONE 1.1) Perche' mettere in piedi un server del genere? Gli attacchi o i tentativi di attacchi sono innumerevoli quando un host e' attivo sulla rete (sia internet che intranet). In questi casi puo' risultare utile avere un tool che ci permetta di analizzare in modo rapido e profittevole i log dei nostri Firewall. In questo ducumento verra' visto come implementare tale sistema per iptables, ma con alcune considerazioni sara' possibile utilizzarlo anche per altri firewall. 1.2) Creare un server sicuro Rimuovere i servizi non necessari dal file /etc/services lasciare solo: porta 80/tcp Apache porta 22/tcp Sshd porta 514/udp Syslogd Far funzionare musql in locale Disabilitare le funzionalita' di rete aggiungendo la seguente opzione nel file /etc/my.cnf [mysqld] skip networking Creare un firewall con delle regole che permetta solamente: SYSLOG in ingresso HTTP in ingresso SMTP in uscita Eventualmente SSH solo da alcuni host per la gestione del sistema 1.3) Requisiti: Iptables propriamente configurato Mysql Apache Web Server Perl Perl DBI Module PHP con supporto Mysql Logsnorter GD ( per abilitare le funzioni grafiche di ACID ) Snort Acid 1) INTRODUZIONE 2
2) Installazione pacchetti e configurazioni preliminari 2.1) IPTABLES La configurazione di Iptables prescinde da questo documento, ma possiamo comunque delineare le linee guida per effettuare una corretta configurazione. compilare il kernel con tutti i moduli net filter ed installare il nuovo kernel testare iptables > iptables L v A questo punto possono essere configurate/customizzate le regole di iptables; su redhat tale operazione di effettua editando il file /etc/sysconfig/iptables. Le regole principali sono: Settare le policy di default a DROP mettere come ultima regola un statement che logga. ES: A INPUT j LOG log level 1 O comunque prima di una regola esplicita di DROPPING. Per testare le regole restartare il servizio /etc/init.d/iptables restart Potete anche aggiungere le regole a caldo utilizzando direttamente iptables ma personalmente credo sia piu' pulito fare le modifiche nel file /etc/sysconfig/iptables per tenere traccia di tutte le aggiunte/modifiche. Iptables di default logga ad una syslog facility "Kernel" con una priorita' "Info" a quanto pare non modificabile. Questo implica che nel log file da noi prescelto vengano inseriti anche messaggi non inerenti iptables. Questo non e' comunque problematico perche' le regole di parsing di logsnorter sono precise e puntuali. 2.2) SYSLOG Syslog e' il sistema di logging comuenemente usato su redhat; sara' necessario abilitare syslogd a ricevere i messaggi da altri host in rete ( opzione r ). Edita il file /etc/sysconfig/syslog > vi /etc/sysconfig/syslog SYSLOGD_OPTIONS=" r m 0" Editare il file /etc/syslog.conf per loggare le info del firewall su un file separato mantenendo le precedenti configurazioni. > vi /etc/syslog.conf # Log firewall probes from remote servers kern.info /var/log/probes Restartare il processo > /etc/init.d/syslogd restart 2.3) PHP Pacchetti necessari: php php mysql 2.4) APACHE Pacchetti necessari: httpd Editare il file /etc/httpd/conf/httpd.conf aggiungendo/modificando le seguenti linee: > vi /etc/httpd/conf/httpd.conf 2) Installazione pacchetti e configurazioni preliminari 3
DirectoryIndex index.html index.html.var index.php # PHP CONGIGURATION AddType application/x httpd php source.phps AddType application/x httpd php.php.php4.phtml Per permettere un corretta integrazione con php. Restartare il servizio: > /etc/init.d/httpd restart Per testare che apache e php funzionano correttamente e' sufficiente create il seguente file sotto la document root di apache: > vi test.php <? echo("<h1>php and Apache Works!<h1>?> <html> <head><title>php Test Page<title>lt;head> <body> <? phpinfo();?> </body> E richiamarlo dal browser. 2.5) SNORT DL dei pacchetti: cd /home/depot/ wget http://www.snort.org/dl/snort 2.0.5.tar.gz cd /home/src/ tar zxvf../depot/snort 2.0.5.tar.gz 2.6) LOGSNORTER DL dei pacchetti: cd /home/depot/ wget http://www.snort.org/dl/contrib/other_logs/logsnorter 0.2.tar.gz cd../src/ tar zxvf../depot/logsnorter 0.2.tar.gz mkdir /usr/local/logsnorter cp /home/src/logsnorter 0.2 /usr/local/logsnorter/logsnorter chmod 711 /usr/local/logsnorter/logsnorter 2.7) MYSQL Pacchetti necessari: mysql mysql server perl DBD MySQL Come creare un Firewall LOG Analysis tool con ACID L'installazione e la configurazione del nostro database puo' essere diversa a seconda della distribuzione che si utilizza. Mettiamo comunque in evidenza le configurazioni necessarie per ogni distro per poi' vedere i passi su una RedHat9. Creare user/group di mysql: > groupadd mysql > useradd g mysql mysql > mysql_install_db # Si dovrebbe ottenere un output del tipo: # Preparing db table # Preparing host table 2.5) SNORT 4
Come creare un Firewall LOG Analysis tool con ACID # Preparing user table # Preparing func table # Preparing tables_priv table # Preparing columns_priv table # Installing all prepared tables # 040510 16:17:01 /usr/libexec/mysqld: Shutdown Complete > /usr/bin/safe_mysqld &# or use /etc/init.d/mysqld > /usr/bin/mysqladmin u root h mplinu password 'root' # Mettere una password piu' sicura al posto di root 2.8) ADODB + JPGRAPH + PHPLOT + ACID > cd /home/depot/ > wget http://phplens.com/lens/dl/adodb404.tgz > wget http://members.chello.se/jpgraph/jpgdownloads/jpgraph 1.14.tar.gz > wget http://ftp1.sourceforge.net/phplot/phplot 4.4.6.tar.gz > wget http://www.andrew.cmu.edu/~rdanyliw/snort/acid 0.9.6b23.tar.gz > cd /var/www/html/ > tar zxvf /home/depot/adodb404.tgz > tar zxvf /home/depot/jpgraph 1.14.tar.gz > tar zxvf /home/depot/phplot 4.4.6.tar.gz > tar zxvf /home/depot/acid 0.9.6b23.tar.gz 2.9) GD Pacchetti necessari: gd 2.8) ADODB + JPGRAPH + PHPLOT + ACID 5
3) Configurazione e integrazione pacchetti A questo punto bisogna creare un'istanza: > mysqladmin p create probes # Inserire la password prima specificata Adesso bisogna creare lo schema necessario all'immagazzinamento dei dati; a tale scopo si utilizza uno script incluso nella distribuzione di snort. > cd /home/src/snort 2.0.5/contrib/ > mysql p probes < create_mysql Verificare che le tabelle siano state create: > echo "show tables;" mysql p probes # Si dovrebbe ottenere un output del tipo: # Tables_in_probes # data # detail # encoding # event # icmphdr # iphdr # opt # reference # reference_system # schema # sensor # sig_class # sig_reference # signature # tcphdr # udphdr E' una buona idea far girare il log parser con un utente non priviligiato in modo che un eventuale hacker che trovi un exploit nel tool rimanga confinato ad un utente con permessi minimi. > useradd logsnorter > passwd logsnorter Modificare il file /etc/passwd per non permettere l'accesso all'utente logsnorter: logsnorter:x:1000:1000::/home/logsnorter:/sbin/nologin Edita il file /etc/logsnorter.conf per configurare l'accesso ad DB: > vi /etc/logsnorter.conf $db_server='localhost'; $db_usercode='logsnorter'; $db_database='probes'; $db_password='logsnorter'; > chmod 600 /etc/logsnorter.conf > chown logsnorter.root /etc/logsnorter.conf Assegnare le Grant all'utente logsnorter per permettere l'interimento dei dati da parte del "Log Parsing tools" logsnorter > mysql p probes grant insert on probes.data to logsnorter@localhost identified by 'password'; grant select on probes.detail to logsnorter@localhost; grant select on probes.encoding to logsnorter@localhost; grant select,insert on probes.event to logsnorter@localhost; grant insert on probes.icmphdr to logsnorter@localhost; 3) Configurazione e integrazione pacchetti 6
grant insert on probes.iphdr to logsnorter@localhost; grant insert on probes.opt to logsnorter@localhost; grant insert on probes.reference to logsnorter@localhost; grant select,insert on probes.reference_system to logsnorter@localhost; grant select on probes.schema to logsnorter@localhost; grant select,insert on probes.sensor to logsnorter@localhost; grant select,insert on probes.sig_class to logsnorter@localhost; grant select,insert on probes.sig_reference to logsnorter@localhost; grant select,insert on probes.signature to logsnorter@localhost; grant insert on probes.tcphdr to logsnorter@localhost; grant insert on probes.udphdr to logsnorter@localhost; exit > touch /var/log/probes > chown logsnorter.root /var/log/probes > chmod 420 /var/log/probes Come creare un Firewall LOG Analysis tool con ACID > useradd acid > groupadd acid > passwd acid Modificare il file /etc/passwd per non permettere l'accesso all'utente acid: acid:x:1001:1001::/home/acid:/sbin/nologin > cd /var/www/html/acid/ Editare il file di configurazione di acid in modo da farlo puntare ad DB: vi acid_conf.php $DBlib_path = "/var/www/html/adodb"; $DBtype = "mysql"; $alert_dbname = "probes"; $alert_host = "localhost"; $alert_user = "acid"; $alert_password = "password"; $ChartLib_path = "/var/www/html/jpgraph 1.13/src"; $chart_file_format = "png"; $event_cache_auto_update = 0; E' necessario configurare questo file in modo da avere una corrispondenza con pacchetti installati sul proprio sistema; una nota sull'ultimo paramentro: esso controlla l'autoupdate del DB ogni volta che la pagina e' acceduta. Questo potrebbe inficiare sulle performance del sistema; si sceglie quindi di disabilitare tale opzione ed effettuare un aggiornamento in background mediante cron ( Vedi Tuning finale del sistema ). Assegnare le Grant all'utente acid per permettere l'analisi dei dati da parte dell'"analisys Consult for Intrusion Database" ACID. > mysql p probes grant all privileges on probes.* to acid@localhost identified by 'password' exit 3) Configurazione e integrazione pacchetti 7
4) Test del sistema Assicurati che il DB e' online; > ps elf grep mysql Assicurati che gli accessi siano autorizzati > mysql u logsnorter probes ppassword > mysql u acid probes ppassword Lanciare logsnoter come utente logsnorter in foreground per analizzare eventuali problemi: > sudo u logsnorter /usr/local/logsnorter/logsnorter t T /var/log/probes In questo modo eventuali problemi saranno mostrati in STD output; solitamente si verificano problemi di riconoscimento delle linee di log. Se questo dovesse accadere sara' necessario modificare manualmente logsnorter per fargli "parsare" correttamente le linee. A questo punto potete simulare degli accessi non autorizzati al vostro sistema e controllare che vengano inseriti i relativi record sul DB. 4) Test del sistema 8
5) Tuning finale del sistema 5.1) Configurazione finale ACID Terminare la configurazione di ACID accedendo alla webpage: http://localhost/acid/ e seguendo le istruzioni Rimuovere tutti le grant per riassegnare solo quelle necessarie: > mysql p probes revoke all on probes.* grant select,insert,delete on probes.acid_ag_alert to logsnorter@localhost; grant select,insert,update,delete on probes.acid_event to logsnorter@localhost; grant select,insert,update,delete on probes.acid_ip_cache to logsnorter@localhost; grant select,insert,delete on probes.data to logsnorter@localhost; grant s elect on probes.detail to logsnorter@localhost; grant select on probes.encoding to logsnorter@localhost; grant select,insert,delete on probes.event to logsnorter@localhost; grant select,insert,delete on probes.icmphdr to logsnorter@localhost; grant select,insert,delete on probes.iphdr to logsnorter@localhost; grant select,insert,delete on probes.opt to logsnorter@localhost; grant select,insert,upd ate,delete on probes.reference to logsnorter@localhost; grant select,insert,upda te,delete on probes.reference_system to logsnorter@localhost; grant select on probes.schema to logsnorter@localhost; grant select,insert on probes.sensor to logsnorter@localhost; grant select,insert,update,delete on probes.sig_class to logsnorter@localhost; grant select,insert,update,delete on probes.sig_reference to logsnorter@localhost; grant select,insert on probes.signature to logsnorter@localhost; grant select,insert,delete on probes.tcphdr to logsnorter@localhost; grant select,insert,delete on probes.udphdr to logsnorter@localhost; exit 5.2) Configurazione della rotazione dei log Configuriamo il demone logrotate in modo da conservare per un anno i nostri log; editiamo quindi il file /etc/logrotate.conf ed aggiungiamo le seguenti linee: /var/log/probes { prerotate /usr/bin/killall logsnorter 0.2 endscript rotate 12 monthly compress create 420 logsnorter root postrotate sudo b u logsnorter /usr/local/logsnorter/logsnorter 0.2 t T /var/log/probes >> /var/log/logsnorter.txt endscript } Testiamo le nostre modifiche senza in realta' fare nulla: > logrotate d /etc/logrotate.conf 5) Tuning finale del sistema 9
Come creare un Firewall LOG Analysis tool con ACID 5.3) Aggiornamento automatico del Database Per migliorare le performance del nostro sistema si e' scelto di non far fare gli aggiornamente del db ad ogni accesso pagina ma ogni 5 minuti. Per far questo si simula l'accesso alla pagina di aggiornamento e si "cronizza" > su root > crontab e 0,5,10,15,20,25,30,35,40,45,50,55 * * * * lynx accept_all_cookies dump http://localhost/acid/acid_maintenance.php?submit=update+alert+cache > /dev/null 0,5,10,15,20,25,30,35,40,45,50,55 * * * * lynx accept_all_cookies dump http://localhost/acid/acid_maintenance.php?submit=update+ip+cache > /dev/null 5.4) Rendere attivo il sistema ad ogni riavvio A questo punto dopo aver eseguito tutti i nostri test possiamo rendere permanente lo startup di logsnorter; inserire la seguente riga di comando: sudo b u logsnorter /usr/local/logsnorter/logsnorter 0.2 t T /var/log/probes >> /var/log/logsnorter.txt in un file eseguito allo startup, ad esempio /etc/rc.local 5.3) Aggiornamento automatico del Database 10
6) Riferimenti e Links Main Reference http://www.giac.org/practical/gsec/anthony_shearer_gsec.pdf man iptables man sudo man syslogd Regular Expression http://sitescooper.org/tao_regexps.html Mysql Documentation http://dev.mysql.com/doc/mysql/en/index.html 6) Riferimenti e Links 11