[OpenBSD]

[Precedente: Packet Tagging] [Indice] [Successivo: Performance]

PF: Logging


Indice


Introduzione

Quando un pacchetto è loggato da PF, una copia dell'header del pacchetto è inviato all'interfaccia pflog(4) insieme ad altri dati tra i quali l'interfaccia dove il pacchetto sta transitando, l'azione presa da PF (passaggio o blocco), ecc. L'interfaccia pflog(4) consente ad applicazioni utente di ricevere i dati di log di PF dal kernel. Se PF e' abilitato all'avvio del sistema, il demone pflogd(8) viene avviato alla partenza. Per default pflogd(8) resta in ascolto sull'interfaccia pflog0 e scrive i dati di log nel file /var/log/pflog.

Logging dei Pacchetti

Per ottenere il log dei pacchetti che passano attraverso PF, occorre usare la keyword log nelle regole NAT/rdr e di filtraggio. Da notare che PF può loggare solo i pacchetti che vengono bloccati o passano; non si può specificare una regola solo per il log dei pacchetti.

La keyword log causa il log di tutti i pacchetti che soddisfano la regola. Nel caso di regole che creano stati, solo il primo pacchetto (che crea lo stato) sarà loggato.

Le opzioni che possono essere date con la keyword log sono:

all
vengono loggati tutti i pacchetti e non solo il primo. Utile in regole che creano stati.
to pflogN
Tutti i pacchetti per i quali c'e' una corrispondenza vengono loggati alla specifica interfaccia pflog(4). Per esempio, quando si usa spamlogd(8) tutto il traffico SMTP può essere loggato da PF a una interfaccia dedicata pflog(4). Il demone spamlogd(8) puo' quindi essere istruito per ascoltare su quell'interfaccia. Questo mantiene il logfile principale di PF pulito da traffico SMTP che altrimenti non sarebbe stato necessario loggare. Usare ifconfig(8) per creare le interfaccie pflog(4). L'interfaccia log di default pflog0 è creata automaticamente.
user
Causa il log delle informazioni standard dei pacchetti per i quali il mittente e il destinatario hanno user-id e group-id UNIX.

Le opzioni sono fornite in parentesi dopo la keyword log; opzioni multiple possono essere separate da virgola o spazio.

pass in log (all, to pflog1) on $ext_if inet proto tcp to $ext_if port 22 keep state

Lettura di un Log File

Il log file scritto da pflogd è in formato binario e non può essere letto da un editor di testo. Per vedere il log deve essere usato Tcpdump.

Per vedere il log file:

# tcpdump -n -e -ttt -r /var/log/pflog

Da notare che tcpdump(8) non consente l'analisi in tempo reale del file pflog. Per una visione in tempo reale dei log dei pacchetti si usa l'interfaccia pflog0:

# tcpdump -n -e -ttt -i pflog0

NOTE: Quando si esaminano i log, particolare attenzione dovrebbe essere data al decoding verbouse di tcpdump (attivato da linea di comando con l'opzione -v). Il protocollo decoder di tcpdump non ha una storia perfetta per quanto riguarda la sicurezza. Almeno in teoria sarebbe possibile un attacco ritardato utilizzando i payload parziali dei pacchetti registrati dal dispositivo di logging. Si raccomanda di spostare i file di log dal firewall prima di esaminarli.

Ulteriore attenzione dovrebbe essere dedicata all'accesso sicuro ai log. Di default, pflogd registrerà 96 bytes del pacchetto nel log file. L'accesso ai log dovrebbe fornire un accesso parziale a pacchetti di dati sensibili (come telnet(1) o ftp(1) username e password).

Filtraggio degli output di log

Grazie ai log di pflogd, in formato binario, nel rivedere i log si possono utilizzare tutte le opzioni offerte da tcpdump. Per esempio, per vedere solo i pacchetti che hanno una corrispondenza con una determinata porta:
# tcpdump -n -e -ttt -r /var/log/pflog port 80

Si può limitare la visione dei pacchetti con una determinata combinazione di host e porta:

# tcpdump -n -e -ttt -r /var/log/pflog port 80 and host 192.168.1.3

La stessa cosa può essere fatta quando si legge dall'interfaccia pflog0:

# tcpdump -n -e -ttt -i pflog0 host 192.168.4.2

Da notare che ciò non ha impatto sui pacchetti loggati dal file di pflogd; il comando precedente visualizza solo i pacchetti quando vengono loggati.

Oltre all'utilizzo delle regole standard di filtraggio di tcpdump(8), il linguaggio di filtraggio del tcpdump di OpenBSD è stato esteso per la lettura dell'output di pflogd:

Esempio:

# tcpdump -n -e -ttt -i pflog0 inbound and action block and on wi0

Questo mostra il log, in tempo reale, dei pacchetti in ingresso che sono stati bloccati all'interfaccia wi0.

Logging dei pacchetti tramite Syslog

In molte occasioni è desiderabile avere i log del firewall disponibili in formato ASCII per inviarli,ad esempio, a un server remoto di logging. Tutto questo può essere ottenuto con un piccolo script per shell, qualche cambio nella configurazione dei file di OpenBSD, e il demone di logging syslogd(8). Syslogd effettua il logging in ASCII ed è inoltre in grado di collegarsi con un server remoto di logging.

Creare il seguente script:

/etc/pflogrotate

	#!/bin/sh
	PFLOG=/var/log/pflog
	FILE=/var/log/pflog5min.$(date "+%Y%m%d%H%M")
	kill -ALRM $(cat /var/run/pflogd.pid)
	if [ -r $PFLOG ] && [ $(stat -f %z $PFLOG) -gt 24 ]; then
	   mv $PFLOG $FILE
	   kill -HUP $(cat /var/run/pflogd.pid)
	   tcpdump -n -e -ttt -r $FILE | logger -t pf -p local0.info
	   rm $FILE
	fi

Editare il cron job di root:

# crontab -u root -e

Aggiungere le due seguenti righe

# rotate pf log file every 5 minutes
0-59/5 * * * * /bin/sh /etc/pflogrotate

Aggiungere la riga seguente a /etc/syslog.conf:

local0.info     /var/log/pflog.txt

Se inoltre si vuole loggare a un server remoto di logging, aggiungere la riga:

local0.info     @syslogger

Assicurarsi che l'host syslogger sia stato definito nel file hosts(5).

Creare il file /var/log/pflog.txt per permettere a syslog di loggare a quel file, e dargli gli stessi permessi di pflog.

# touch /var/log/pflog.txt
# chmod 600 /var/log/pflog.txt

Rendere evidenti i cambiamenti a syslogd facendolo ripartire:

# kill -HUP $(cat /var/run/syslog.pid)

Tutti i pacchetti loggati vengono inviati a /var/log/pflog.txt. Se viene aggiunta la seconda riga, vengono inviati anche all'host remoto di logging syslogger.

Lo script /etc/pflogrotate ora processa e quindi cancella /var/log/pflog cosi' la rotazione di pflog eseguita da newsyslog(8) non e' piu' necessaria e puo' essere disabilitata. Comunque, /var/log/pflog.txt sostituisce /var/log/pflog e la sua rotazione puo' essere attivata. Cambiare /etc/newsyslog.conf come segue:

    #/var/log/pflog       600    3    250    *    ZB /var/run/pflogd.pid
    /var/log/pflog.txt    600    7    *      24

PF ora loggera' in formato ASCII a /var/log/pflog.txt. Cosi' se configurato in /etc/syslog.conf, verra' loggato anche a un server remoto. Il logging non è immediato ma può richiedere anche 5-6 minuti (l'intervallo di cron job) prima che i pacchetti loggati siano nel file.

[Precedente: Packet Tagging] [Indice] [Successivo: Performance]


[back] www@openbsd.org
$OpenBSD: logging.html,v 1.2 2008/02/22 10:12:26 tobias Exp $