Repository 32bit  Forum
Repository 64bit  Wiki

Ulog e Iptables

Da Slacky.eu.


Indice

ULOG e IPTABLES

Introduzione

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.

Logging con IPTABLES

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   ulog­php,   tool   user­friendly   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 ­­ulog­nlgroup 1 ­­ulog­prefix "badif"
iptables ­A INPUT ­i ppp0 ­p udp ­m state ­­state NEW ­­dport 0:65535 ­j ULOG ­­ulog­nlgroup 1 ­­ulog­prefix "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   –ulog­prefix   “badif”   serve   per   loggare   i  “bad”   packet.   Dal README   di   ulog­ php:

to log bad packet you can use  iptables ­A FORWARD  ­j ULOG ­­ulog­nlgroup 1 ­­ulog­prefix "badif"

Queste due regole si sostituiscono alle tradizionali:

iptables ­A INPUT ­i ppp0 ­p tcp ­m state ­­state NEW ­­dport 0:1024 ­j LOG ­­log­prefix="BLOCCATO TCP: "
iptables ­A INPUT ­i ppp0 ­p udp ­m state ­­state NEW ­­dport 0:1024 ­j LOG ­­log­prefix="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.

 

Requisiti di sistema

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. 

Installazione e Configurazione di Ulog

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 ulogd­1.23.tar.bz (per decomprimere un pacchetto non occorre essere root)
# cd ulogd­1.23
# ./configure –with­mysql=/var/lib/mysql
# make && make install

L'istruzione  #   ./configure   –with­mysql=/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 ­­ulog­nlgroup 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.

Installazione e configurazione di MySQL

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.


Interfaccia per MySQL

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"

Interfaccia per ulogd

Esistono diversi progetti finalizzati alla creazione di un'interfaccia per ulogd. Quello da me provato è ulog­php. E' reperibile all'indirizzo: http://www.inl.fr/download/ulog­php­1.0.1.tar.gz Questa è l'ultima versione al momento.

Una volta scaricato il pacchetto decomprimiamolo:

tar xfvz ulog­php­1.0.1.tar.gz
cd ulog­php­1.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 ulog­php­1.0.1 nella nostra DocumentRoot.

STARTUP

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 ulog­php. Avviamo apache:


#apachectl start

Rechiamoci all'url: http://localhost/ulog­php­1.0.1/index.php Questa è la nostra interfaccia grafica per ulogd. Il progetto è veramente ben fatto.  La differenza rispetto al classico syslog è veramente notevole.

Tip 'n' Tricks

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.

Conclusioni

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.


Ringraziamenti

Non   può   mancare   un   ringraziamento   a   tutta   la   comunità   Slackware,   unica   ed insostituibile.

Bart
Strumenti personali
Namespace

Varianti