Registrare i log di Iptables in MySQL: differenze tra le versioni

modificata compatibilità con box temporaneo, rimossa dalle guide da controllare
(modificata compatibilità con box temporaneo, rimossa dalle guide da controllare)
 
(16 versioni intermedie di 5 utenti non mostrate)
Riga 1: Riga 1:
{{Versioni compatibili|Lenny}}
{{Warningbox|La guida è in fase di verifica per il passaggio a '''ulogd2''', almeno per Debian [[Jessie]] e successive; leggere [[{{TALKPAGENAME}}|qui]] per maggiori chiarimenti.}}
==Introduzione==
==Introduzione==
Lo scopo di questa guida è di mostrare come registrare le attività del firewall di Linux in un database MySQL.<br/>
Lo scopo di questa guida è di mostrare come registrare le attività del firewall di Linux in un database MySQL.<br/>
Riga 7: Riga 13:
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.
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==
==Installazione==
L’installazione dei pacchetti necessari è velcoe e semplice come al solito in Debian:
L’installazione dei pacchetti necessari è veloce e semplice come al solito in Debian:
<pre>
<pre>
# apt-get install ulogd ulogd-mysql
# apt-get install ulogd ulogd-mysql
</pre>
</pre>
==Configurazione==
==Configurazione==
Come prima cosa occorre creare un database vuoto, con gli opportuni privilegi, in cui registrare gli eventi <code>ulogd</code>. Potete creare il database utilizzando PhpMyAdmin o direttamente da linea di comando, in questo modo:
Come prima cosa occorre creare un database vuoto, con gli opportuni privilegi, in cui registrare gli eventi <code>ulogd</code>. Potete creare il database utilizzando PhpMyAdmin o direttamente da linea di comando, in questo modo:
Riga 43: Riga 50:
/etc/init.d/ulogd restart
/etc/init.d/ulogd restart
</pre>
</pre>
==Configurazione di iptables==
Supponendo che il nostro PC abbia la scheda di rete <code>eth0</code> connessa con un modem ADSL, possiamo impostare la seguente regola di iptables con il target ULOG:
<pre>
# iptables -t nat -I POSTROUTING -s 192.168.1.0/24 -o eth0 -j ULOG
</pre>
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.
<br/><br/>
----
<br/>
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):
<pre>
# iptables -I OUTPUT -d 8.8.8.8 -j ULOG –ulog-nlgroup 1 –ulog-cprange 20
</pre>
Con questa regola di <code>iptables</code> sono state usati due parametri nuovi:
* <code>nlgroup</code> è il parametro del kernel che permette di specificare il  <code>netlink group</code>. Usando differenti valori di <code>nlgroup numbers</code> possiamo avviare più di una istanza di <code>ulogd</code>, ciascuna in ascolto su un differente <code>netlink group</code>;
* <code>cprange</code> specifica quanti bytes catturare di ciascun pacchetto, in modo simile al parametro <code>snap length (-s)</code> di <code>tcpdump</code>. 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:
<pre>
# 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
</pre>
Nel nostro database MySQL <code>ulogd</code> dovrebbero essere state registrate delle nuove entry.
<br/><br/>
----
<br/>
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:
<pre>
# 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
</pre>
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 <code>iptables</code> 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:
<pre>
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)
</pre>
Per poter interpretare i risultati è conveniente effettuare una conversione di questi indirizzi da interi alla classica forma "dotted quad".<br/>
Lo script seguente in PHP effettua proprio questa conversione:
<pre>
<?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;
?>
</pre>
Potete utilizzare lo script semplicemente da linea di comando:
<pre>
# php int2ip.php 2537649241
151.65.116.89
</pre>
oppure inserire questo script in una pagina da raggiungere via browser, per visualizzare in formato HTML le entry del database <code>ulogd</code> e, magari, per introdurre anche funzioni di ricerca e di filtro.
==Credits==
Questa guida si basa anche su informazioni raccolte in questi siti:
* http://www.wikipedia.org
* http://www.voipandhack.it/
* http://ideafactory.it/
{{Autori
|Autore = [[Utente:Ferdybassi|Ferdybassi]] 15:23, 7 mar 2010 (CET)
}}
[[Categoria:Database server]] [[Categoria:Firewall]]
3 581

contributi