La seguente guida ha lo scopo di introdurre ulogd, sistema di logging che può sostituire il classico syslogd, per registrare i log del nostro firewall. Si avrà così un passaggio dal classico target LOG di iptables al più evoluto target ULOG che lavora in userspace e permette quindi, tramite un programma in continuo ascolto, di gestire tali informazioni nella maniera più disparata. Verrà quindi mostrato come associare ulog al potente DBMS MySQL in modo tale da creare una apposita tabella contenente tutti i log relativi al nostro firewall. Non è difficile capire i vantaggi che si possono ottenere con questa magnifica combinazione. Immaginate di voler sapere quanti tentativi di accesso avete avuto negli ultimi due mesi su una determinata porta. Se utilizzate syslogd dovrete praticamente controllare ogni riga di log all'interno del file /var/log/syslog, cercare la porta e vedere se corrisponde: un lavoro lungo e sicuramente poco pratico. Avendo invece i log all'interno di un database si può raggiungere il nostro scopo con una semplice istruzione SQL. Si avrà così una visione più chiara e dettagliata, senza contare il tempo risparmiato nella ricerca. Verranno utilizzate interfacce grafiche sia per ulog che per MySQL, per migliorare ulteriormente il nostro lavoro. Questa guida non ha lo scopo di specificare le potenzialità di iptables (la componente firewall standard di Linux sin dall' introduzione dei kernel 2.4), per la quale si rimanda alla consultazione di siti come www.netfilter.org.
Non si parlerà nemmeno del linguaggio SQL, ormai famosissimo e di una praticità e semplicità estrema. Si farà una breve introduzione ad Apache con il semplice scopo di rendere operativo il webserver.
Iptables mette a disposizione il logging come feature per debugging e analisi del traffico. A noi interessa l'analisi di tutto il traffico che viene “droppato” dal nostro firewall. Il log generato da iptables può essere utile sia per verificare le funzionalità delle regole inserite sia per generare un log che verrà analizzato da tools per creare statistiche e report, fonte di informazioni indispensabile per scoprire ad esempio di essere il bersaglio di un attacco. Come strumento d'analisi utilizzeremo ulogphp, tool userfriendly scritto in php capace di fornire un'ottima interfaccia al nostro database MySQL. Esistono anche altri progetti ma, tra quelli visti, lo reputo uno dei migliori. Il logging viene abilitato tramite target ULOG per loggare in user space e LOG in kernel space. Noi utilizzeremo ovviamente ulog. E' buona norma loggare tutto ciò che viene negato, quindi se si segue la policy "Nego tutto e lascio passare solo ciò che mi serve" (che prenderemo in esame), le regole di logging dovranno essere inserite alla fine della catena.
Le nostre regole di iptables relative ai log saranno quindi:
iptables A INPUT i ppp0 p tcp m state state NEW dport 0:65535 j ULOG ulognlgroup 1 ulogprefix "badif" iptables A INPUT i ppp0 p udp m state state NEW dport 0:65535 j ULOG ulognlgroup 1 ulogprefix "badif"
La prima riga logga tutti i pacchetti che sfruttano il protocollo tcp (p tcp) e che hanno il flag SYN settato ad 1 (m state –state NEW) su un range di porte che va da 0 a 65535 ( dport 0:65535). La seconda è identica alla prima solo che è relativa al protocollo udp (p udp). Il flag –ulogprefix “badif” serve per loggare i “bad” packet. Dal README di ulog php:
to log bad packet you can use iptables A FORWARD j ULOG ulognlgroup 1 ulogprefix "badif"
Queste due regole si sostituiscono alle tradizionali:
iptables A INPUT i ppp0 p tcp m state state NEW dport 0:1024 j LOG logprefix="BLOCCATO TCP: " iptables A INPUT i ppp0 p udp m state state NEW dport 0:1024 j LOG logprefix="BLOCCATO UDP: "
La policy in input è, come ho già detto, di scartare di default qualsiasi pacchetto che non corrisponda ad una determinata serie di regole che dovrete inserire nel vostro script firewall.
Per utilizzare ulog occorre includere il supporto nel kernel. Tutte le mie esperienze sono basate su kernel della serie 2.6.x. Nella sezione Netfilter Configuration occorre selezionare l'opzione:
'''CONFIG_IP_NF_TARGET_ULOG'''
Il modulo relativo è ipt_ULOG che potete trovare (se l'avete incluso come modulo nel kernel) sotto /lib/modules/2.6.11.8/kernel/net/ipv4/netfilter/. Nel caso in cui non sia presente potete provare a dare un:
# grep i 'ulog' /boot/config
dove al posto di “config” dovete mettere il nome del vostro config. Il comando esamina all'interno di tale file se è presente qualche opzione con la stringa
“ulog”. L'output sarà qualcosa del genere: CONFIG_IP_NF_TARGET_ULOG=m CONFIG_BRIDGE_EBT_ULOG=m
In questo caso potete vedere che avete CONFIG_IP_NF_TARGET_ULOG abilitato come modulo, quindi vi basterà lanciare un:
# modprobe ipt_ULOG per attivarlo.
Se l'output del comando grep è No such file or directory, significa che non avete abilitato ulog. Dovrete quindi abilitarlo ricompilando il kernel.
Preleviamo il pacchetto da: ftp://ftp.netfilter.org/pub/ulogd/ Al momento l'ultima versione è la 1.23.Una volta scaricato il pacchetto ulogd-1.23.tar.bz2 eseguiremo le seguenti istruzioni:
# tar xjvf ulogd1.23.tar.bz (per decomprimere un pacchetto non occorre essere root) # cd ulogd1.23 # ./configure –withmysql=/var/lib/mysql # make && make install
L'istruzione # ./configure –withmysql=/var/lib/mysql abilita il supporto per Mysql in modo tale da poter riportare le informazione reperite da ulogd nel nostro database. Per una lista di tutte le possibili opzioni basta dare un:
# ./configure –help
Ora ulogd è installato nel nostro sistema e non ci resta che configurarlo editando il file: /usr/local/etc/ulogd.conf. All'interno di questo file occorre porre attenzione alle seguenti righe:
# netlink multicast group nlgroup=1 nlgroup deve avere lo stesso valore anche nelle regole di iptables. (the same as the iptables ulognlgroup param) # logfile per i messaggi di stato logfile="/var/log/ulogd.log" # output plugins. plugin="/usr/local/lib/ulogd/ulogd_LOGEMU.so" #plugin="/usr/local/lib/ulogd/ulogd_OPRINT.so" plugin="/usr/local/lib/ulogd/ulogd_MYSQL.so" #plugin="/usr/local/lib/ulogd/ulogd_PGSQL.so" #plugin="/usr/local/lib/ulogd/ulogd_SQLITE3.so" #plugin="/usr/local/lib/ulogd/ulogd_PCAP.so"
All'interno di output plugins occorre abilitare il plugin relativo a MySQl come nell'esempio sopra mostrato. Come potete vedere ulog può lavorare appoggiandosi a diversi sistemi tra i quali spiccano PGSQL e SQLITE3. Ora non ci resta che abilitare MySQL:
[MYSQL] table="ulog" pass="vostra password" user="user" db="ulogd" host="localhost"
Qui vanno modificati i dati relativi all'utente (con relativa password) che può accedere al database “ulogd” presente in MySQL. Modificando tale file con gli oppurtuni valori permetteremo ad ulogd di accedere al nostro database inserendo i dati relativi ai log di iptables. Ancora noi non possediamo alcun database perciò, per il momento, limitatevi ad esaminare il file senza fare alcuna modifica. Una volta installato e configurato MySQL, andremo a modificare la sezione “user” e “password” con i nostri dati.
L'installazione di MySQL non è complessa. Se avete fatto un'installazione “full” della vostra Slackware potete tranquillamente saltare questa parte e recarvi subito alla configurazione, in quanto avete già il DBMS installato. In caso contrario potete operare in due modi differenti:
1. scaricare il pacchetto precompilato da www.linuxpackages.net e installarlo con un:
# installpkg nomePacchetto.tgz
2. compilarlo con la solita terna ./configure, make && make install.
Adesso che MySQL è installato e attivo, la prima cosa da fare è quella di impostare una password per l'utente root, ovvero l'utente che è in grado di compiere tutte le operazioni su MySQL, compresa quella di fermare il server. MySQL permette l'accesso ai dati contenuti nei database esclusivamente agli utenti autorizzati, per questo è importante creare da subito degli utenti che abbiano delle possibilità di azione limitate per evitare seri problemi di sicurezza. Appena installato, MySQL ha un utente "root" che può accedere senza inserire alcuna password, in grado di compiere qualsiasi azione sul server. Quindi la prima cosa da fare adesso è quella di assegnare una password a "root" in modo da evitare che chiunque possa entrare e fare danni senza incontrare alcun blocco. Attenzione perché quello che stiamo per fare è estremamente importante: MySQL è un server e in quanto tale esso permette l'accesso a chiunque si trovi nella stessa rete. Questo significa che se il server è collegato a Internet, CHIUNQUE potrà accedere al server! Naturalmente la possibilità di effettuare delle operazioni su di esso sarà vincolata al fatto di avere un nome utente e una password di accesso.
Inziamo avviando il server in background:
# msqld_safe &
Al caricamento del programma, riceveremo un messaggio che, dopo aver cercato di avviarlo, è costretto a chiuderlo, avvertendoci con un "mysql ended". In effetti il programma, se non trova già settati i suoi file di configurazione, non riesce a partire. Per eliminare il messaggio "mySQL ended" all'avvio del programma bisogna abilitarlo: si tratta della prima operazione da fare se si vuole adoperare questo database. È necessario in prima istanza scegliere uno dei quattro file /etc/my.huge.conf, /etc/my.large.conf, / etc/my.medium.conf, /etc/my.small.conf e copiarlo sempre in /etc rinominandolo / etc/my.conf. La scelta dipende dalle dimensioni che intendiamo attribuire al nostro database. Quindi bisogna lanciare in sequenza i seguenti comandi:
1) mysql_install_db, 2) cd /var/lib, 3) chown R mysql mysql/, 4) chgrp R mysql mysql/.
In tal modo mySQL viene attivato. Eccede dalla presenta trattazione l'uso di questo database (da Slackware for Dummies). Riavviamo il server con il comando precedente: noterete che l'errore e sparito. Ora assegnamo una password all'utente "root".
#mysqladmin u root password “miaPassword”
Per terminare il server MySQl basterà dare:
#mysqladmin u root p shutdown
Verrà richiesta la password e una volta inserita sarà terminato il server.
L'uso di un'interfaccia per MySql non è obbligatorio ma semplifica notevolmente il lavoro di gestione del DBMS ed è quindi caldamente consigliata. Io ho utilizzato PhpMyAdmin e quindi mi baserò su quest'ultima. PhpMyAdmin è un'interfaccia grafica scritta in php mediante la quale è possibile visualizzare il contenuto del nostro database, creare, modificare e cancellare intere tabelle o singoli record, fare un backup dei dati contenuti, visualizzare informazioni interessanti sul db ecc. Per poter utilizzare quest'ottimo progetto abbiamo bisogno di un:
webserver (apache nel nostro caso) • mysql • phpMyAdmin •
Partendo col presupposto che Apache sia già installato nel nostro sistema andiamo ad analizzare la sua configurazione e il suo funzionamento. Per analizzare il funzionamento ci sono due piccoli passi da fare. Il primo consiste nell'avvio del webserver tramite il comando:
# apachectl start
Ora, aprendo il nostro browser preferito, andiamo alla pagina: http://localhost Se qui compare la home page di apache signica che il webserver funziona. Il secondo passo invece consiste in una sorta di prova del nove. Andiamo in / var/www/htdocs/ (la nostra DocumentRoot) e creiamo un file info.php. Al suo interno digitiamo:
<? phpinfo() ?>
Salvate ed uscite. Ora digitate http://localhost/info.php e state a guardare cosa succede. Se tutto è andato liscio dovreste vedere una schermata con tante informazioni relative a php. E' probabile che la cosa non accada. In questo caso decommentate in / etc/apache/httpd.conf la riga: Include /etc/apache/mod_php.conf
Riavviate il server e ricontrollate la pagina.
Per fermare il nostro webserver basta digitare:
# apachectl stop
Prima di inziare il lavoro vero e proprio, vediamo superficialmente com'è strutturato PhpMyAdmin. Attiviamo Apache, il database MySql ed accediamo a PhpMyAdmin digitando l'URL corrispettivo...io ad esempio digito:
http://localhost/phpadmin/index.php
Ovviamente la cartella phpadmin deve essere presente nella nostra DocumentRoot. Ci troviamo di fronte ad una pagina composta da due frames; nella colonna di sinistra, sotto la scritta Home, ci sono i nomi di tutti i database creati; se è la prima volta che attivate MySql dovreste visualizzarne solo due: mysql e test (mysql non va assolutamente toccato visto che contiene dati importanti per il funzionamento del db). Nella pagina centrale ci sono le risorse principali; abbiamo, ad esempio, il form per creare un nuovo db; la scritta Utenti per impostare nuovi users; il collegamento per riavviare MySql ed una serie di link per visualizzare alcune informazioni statistiche; sono presenti, infine, interessanti collegamenti alla documentazione ufficiale. Creiamo un nuovo database chiamato ulogd. Si può ottenere lo stesso risultato digitando da linea di comando: Dopo esservi loggati all'interno di MySQL digitate:
SHOW DATABASES;
Questa istruzione dice al nostro DBMS di mostrare tutti i database esistenti. Avendo appena installato MySQL dovreste avere solo 2 database: mysql e test Il database mysql contiene i privilegi di accesso degli utenti. Il database "test" serve, invece, come db di prova. A noi occorre creare un database chiamato ulogd, come diceva il file di configurazione di ulog: db="ulogd" Digiteremo quindi: CREATE DATABASE ulogd; Come è facile intuire l'istruzione qui sopra crea un nuovo database chiamato "ulogd". Proviamo ora a ripetere il comando SHOW DATABASES... E' importante che ogni istruzione data a MySQL termini con il “;”. Creiamo un utente ulog con relativa password e diamogli i permessi per lavorare sul database ulogd. Non dategli i permessi relativi all'amministrazione: li possiede già root. Ora potete modificare /usr/local/etc/ulogd.conf con le opportune specifiche per MySQL.
[MYSQL] table="ulog" pass="vostra password" user="user" db="ulogd" host="localhost"
Esistono diversi progetti finalizzati alla creazione di un'interfaccia per ulogd. Quello da me provato è ulogphp. E' reperibile all'indirizzo: http://www.inl.fr/download/ulogphp1.0.1.tar.gz Questa è l'ultima versione al momento.
Una volta scaricato il pacchetto decomprimiamolo:
tar xfvz ulogphp1.0.1.tar.gz cd ulogphp1.0.1.tar.gz
All'interno di questa cartella esiste un file chiamato ulogd.mysqldump contenente tutta una serie di istruzioni sql finalizzate alla creazione di tabelle per il database ulogd. Ci basterà copiarle nella console di mysql e avremo un database pronto ad essere utilizzato. Terminiamo il tutto copiando la cartella ulogphp1.0.1 nella nostra DocumentRoot.
A questo punto non ci resta che testare il lavoro svolto fino ad ora. Avviamo il demone di MySQL:
#mysqld_safe &
Avviamo il demone relativo ad ulog:
#ulogd c /usr/local/etc/ulog Mon May 9 12:24:30 2005 <3> ulogd.c:309 registering interpreter `raw' Mon May 9 12:24:30 2005 <3> ulogd.c:309 registering interpreter `oob' Mon May 9 12:24:30 2005 <3> ulogd.c:309 registering interpreter `ip' Mon May 9 12:24:30 2005 <3> ulogd.c:309 registering interpreter `tcp' Mon May 9 12:24:30 2005 <3> ulogd.c:309 registering interpreter `icmp' Mon May 9 12:24:30 2005 <3> ulogd.c:309 registering interpreter `udp' Mon May 9 12:24:30 2005 <3> ulogd.c:309 registering interpreter `ahesp' Mon May 9 12:24:30 2005 <5> ulogd.c:364 registering output `syslogemu' Mon May 9 12:24:30 2005 <5> ulogd.c:364 registering output `mysql'
Dovrebbe apparire qualcosa del genere. Ora diamo un:
#tail f /var/log/ulogd.syslogemu
Questo file è relativo ai log catturati con il demone ulogd. Se il sistema logga, significa
che ulog funziona.
Perfetto, ora ci resta unicamente da verificare se i dati loggati vengono passati a MySQL.
Entriamo nella console di mysql.
# mysqladmin u root p mysql> use ulogd (gli diciamo che intendiamo lavorare sul database ulogd) mysql> select * from ulog; (semplice query che verifica la presenza di dati all'interno della tabella “ulog”).
A questo punto dovreste avere dei dati in output. In caso contrario avete commesso qualche errore. Come potete notare la cosa è veramente illegibile. Proprio per questo ci siamo appoggiati ad un'interfaccia grafica come ulogphp. Avviamo apache:
#apachectl start
Rechiamoci all'url: http://localhost/ulogphp1.0.1/index.php Questa è la nostra interfaccia grafica per ulogd. Il progetto è veramente ben fatto. La differenza rispetto al classico syslog è veramente notevole.
Per utilizzare ulog come sistema di logging occorre, come abbiamo visto, avere diversi demoni attivi. Avviarli ogni volta che ci si connette può diventare, a lungo termine, un'operazione veramente noiosa. Possiamo evitare questo operando in differenti maniere:
• avviandoli all'avvio in automatico (rc.local) • creare uno script
La scelta è soggettiva.
Questa guida è frutto di esperienze personali. L'autore non si assume responsabilità per eventuali problemi o danni derivati dall'uso dei programmi o dalle configurazioni citate in questo articolo. I marchi citati sono di propietà dei rispettivi propietari. Segnalo l'ottimo howto “Ulog con Iptables” su www.sistemistiindipendenti.org.
Non può mancare un ringraziamento a tutta la comunità Slackware, unica ed insostituibile.
Bart