Registrare i log di Iptables in MySQL

Da Guide@Debianizzati.Org.
Vai alla navigazione Vai alla ricerca
Edit-clear-history.png Attenzione. Questa guida è da considerarsi abbandonata, per via del tempo trascorso dall'ultima verifica.

Potrà essere resa obsoleta, previa segnalazione sul forum, se nessuno si propone per l'adozione.


Debian-swirl.png Versioni Compatibili

Debian 5 "lenny"


Warning.png ATTENZIONE
La guida è in fase di verifica per il passaggio a ulogd2, almeno per Debian Jessie e successive; leggere qui per maggiori chiarimenti.



Introduzione

Lo scopo di questa guida è di mostrare come registrare le attività del firewall di Linux in un database MySQL.
Il target -j LOG di iptables viene utilizzato per salvare nel file di log di syslog un sommario testuale degli headers dei pacchetti intercettati.
Ma cosa occorre fare per registrare l’intero pacchetto, o una porzione particolare di esso, per eventuali esami futuri?
Contrariamente a quanto avviene con altri moduli firewall, c'è bisogno di un programma che gira in userspace, nella fattispecie ulogd, per poter trattare i pacchetti ottenuti. ulogd affianca o sostituisce il tradizionale metodo di logging bastato su syslogd con il più evoluto target ULOG, capace di loggare direttamente in userspace e gestire i log nei modi più svariati. Le informazioni risultano più schematiche e molto simili a quelle dei tradizionali log di sistema. In pratica i log vengono gestiti da un apposito programma che è in grado di elaborarli in modi diversi, da file di testo a database MySQL, il tutto in modo nativo senza usare filtri o script in perl come capitava con il tradizionale target LOG.

Installazione

L’installazione dei pacchetti necessari è veloce e semplice come al solito in Debian:

# apt-get install ulogd ulogd-mysql

Configurazione

Come prima cosa occorre creare un database vuoto, con gli opportuni privilegi, in cui registrare gli eventi ulogd. Potete creare il database utilizzando PhpMyAdmin o direttamente da linea di comando, in questo modo:

# mysql -u root -p
CREATE DATABASE ulogd;
GRANT ALL PRIVILEGES ON ulogd.* TO ‘ulogduser’@'localhost’ IDENTIFIED BY ‘Digitate_la_password_per_ulogd’ WITH GRANT OPTION;
quit

Come avrete notato, abbiamo creato un nuovo database, un nuovo utente e abbiamo attribuito a questo utente i permessi per leggere e scrivere sul database.
Le struttura delle tabelle per il database appena creato è scritta nel file /usr/share/doc/ulogd-mysql/mysql.table. Carichiamolo quindi nel database appena creato con:

# mysql -u ulogduser -p ulogd < /usr/share/doc/ulogd-mysql/mysql.table

Adesso possiamo procedere con la configurazione di ULOG editando il file /etc/ulogd.conf.
Nella sezione plugins va decommentata la riga:

plugin="/usr/lib/ulogd/ulogd_MYSQL.so"

per permettere la registrazione dei log su un db MySQL.
Impostiamo poi l’account per l’accesso al database:

[MYSQL]
table="ulog"
pass="password_per_ulogduser"
user="ulogduser"
db="ulogd"
host="localhost"

Arrivati a questo punto è sufficiente riavviare ulogd:

/etc/init.d/ulogd restart

Configurazione di iptables

Supponendo che il nostro PC abbia la scheda di rete eth0 connessa con un modem ADSL, possiamo impostare la seguente regola di iptables con il target ULOG:

# iptables -t nat -I POSTROUTING -s 192.168.1.0/24 -o eth0 -j ULOG

Tradotta in italiano la regola suona più o meno così: prendi tutto quello che proviene dalla LAN di classe C 192.168.1.0/24 e che esce dall’interfaccia eth0 verso Internet - e che quindi viene nattato -, e registralo su MySQL.



Un utilizzo leggermente più complesso potrebbe essere quello di richiedere al kernel di registrare tutti i pacchetti destinati per esempio all'indirizzo 8.8.8.8 (il server DNS di Google):

# iptables -I OUTPUT -d 8.8.8.8 -j ULOG –ulog-nlgroup 1 –ulog-cprange 20

Con questa regola di iptables sono state usati due parametri nuovi:

  • nlgroup è il parametro del kernel che permette di specificare il netlink group. Usando differenti valori di nlgroup numbers possiamo avviare più di una istanza di ulogd, ciascuna in ascolto su un differente netlink group;
  • cprange specifica quanti bytes catturare di ciascun pacchetto, in modo simile al parametro snap length (-s) di tcpdump. Anziché catturare l’intero pacchetto possiamo catturarne solo i primi 20 bytes.

Ora provochiamo la registrazione di un evento, effettuando ad esempio un ping verso l’host prescelto:

# ping -c 5 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
— 8.8.8.8 ping statistics —
5 packets transmitted, 100% received, 0 packet loss, time 3999ms

Nel nostro database MySQL ulogd dovrebbero essere state registrate delle nuove entry.



Come ultimo esempio, proviamo a catturare alcuni dei tentativi di intrusione o di semplice scansione più comuni che hanno come obiettivo le vulnerabilità di alcuni sistemi Windows. E' sufficiente impostare questa regola:

# FILTER=”-i eth0″; MSPORTS=”–destination-ports 135,137,138,139,445,47,1723″ PREFIX=”ms_intrusion”
# iptables -A INPUT $FILTER -m mutiport -p tcp $MSPORTS -j ULOG –ulog-nlgroup 1 –ulog-prefix $PREFIX

Ad ogni tentetivo di scansione dovreste ritrovarvi nel vostro database MySQL delle entry marcate con il prefisso scelto, per una facile identificazione.

Lettura delle informazioni raccolte

Registrare i log di iptables in un database MySQL significa ritrovarsi dopo qualche tempo con le tabelle del database popolate di record in cui i dati relativi all’indirizzo IP sorgente sono memorizzati come numeri interi. Ad esempio:

mysql> select Distinct(ip_saddr), tcp_dport from ulogd;
+------------+-----------+
| ip_saddr   | tcp_dport |
+------------+-----------+
| 2537620586 |       445 |
| 2537620586 |       139 |
| 2537649241 |       445 |
+------------+-----------+
3 rows in set (0.00 sec)

Per poter interpretare i risultati è conveniente effettuare una conversione di questi indirizzi da interi alla classica forma "dotted quad".
Lo script seguente in PHP effettua proprio questa conversione:

<?php
function int2ip($dec)
{
   // Necessario se dechex(ip sotto forma di intero)
   // è più grande di 7fffffff
   if($dec > 2147483648)
   {
      $result = dechex($dec - 2147483648);
      $part1 = dechex($dec / 268435456);
      $part2 = substr($result,-7);
      $hex = $part1.str_pad($part2, 7, "0000000", STR_PAD_LEFT);
   }
   else
   {
      $hex =dechex($dec);
   }
   // Spezza la cifra esadecimale in un quartetto di interi.
   $part1 = hexdec( substr($hex, 0, 2) );
   $part2 = hexdec( substr($hex, 2, 2) );
   $part3 = hexdec( substr($hex, 4, 2) );
   $part4 = hexdec( substr($hex, 6, 2) );
   //
   // Ricombina il quartetto di interi nel formato stringa
   // di un indirizzo ip.
   $ip = sprintf("%s.%s.%s.%s", $part1, $part2, $part3, $part4);
   return($ip);
}
$res_ip=int2ip($argv[1]);
print $res_ip;
?>

Potete utilizzare lo script semplicemente da linea di comando:

# php int2ip.php 2537649241
151.65.116.89

oppure inserire questo script in una pagina da raggiungere via browser, per visualizzare in formato HTML le entry del database ulogd e, magari, per introdurre anche funzioni di ricerca e di filtro.

Credits

Questa guida si basa anche su informazioni raccolte in questi siti:




Guida scritta da: Ferdybassi 15:23, 7 mar 2010 (CET) Swirl-auth20.png Debianized 20%
Estesa da:
Verificata da:

Verificare ed estendere la guida | Cos'è una guida Debianized