[OpenBSD]

[Vorige: Pakketmarkering] [Inhoud] [Volgende: Prestatie]

PF: Loggen


Inhoudsopgave


Inleiding

Pakketten loggen gebeurt in PF door pflogd(8) dat luistert op de pflog0 interface en pakketten naar een logbestand schrijft (normaal gezien /var/log/pflog) in tcpdump(8) binair formaat. Filterregels die het log of log (all) sleutelwoord specificeren, worden op deze manier gelogd.

Pakketten Loggen

Om pakketten te loggen die langs PF gaan, moet het log sleutelwoord gebruikt worden binnen NAT/rdr en filterregels. Merk op dat PF alleen pakketten kan loggen die het blokkeert of doorlaat; u kan geen regel specificeren die alleen pakketten logt.

Het log sleutelwoord zorgt ervoor dat alle pakketten die overeenstemmen met een regel, gelogged worden. In het geval waar de regel een toestand aanmaakt, zal alleen het eerste pakket dat gezien wordt (datgene dat ervoor zorgt dat de toestand aangemaakt wordt) gelogged worden.

De opties die aan het log sleutelwoord gegeven kunnen worden, zijn:

all
Zorgt ervoor dat alle overeenstemmende pakketten, niet alleen het initiële pakket, gelogged worden. Nuttig voor regels die een toestand aanmaken.
user
Zorgt ervoor dat de UNIX user-id en group-id die eigenaar is van de socket vanwaar het pakket komt of waarvoor het bestemd is (welk van beide sockets lokaal is) gelogged worden samen met de standaard loginformatie.

Opties worden tussen haakjes meegegeven na het log sleutelwoord; meerdere opties kunnen gescheiden worden door een komma of spatie.

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

Log alle binnenkomende pakketten bestemd voor poort 22.

Een Logbestand Lezen

Het logbestand geschreven door pflogd is in binair formaat en kan niet gelezen worden met een tekstverwerker. Tcpdump moet gebruikt worden om de log te bekijken.

Om het logbestand te bekijken:

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

Merk op dat tcpdump(8) gebruiken om naar het pflog bestand te kijken, geen real-time display geeft. Een real-time display van gelogde pakketten wordt bekomen door de pflog0 interface te gebruiken:

# tcpdump -n -e -ttt -i pflog0

OPMERKING: Bij het onderzoeken van de logs, moet opgelet worden met tcpdump's uitgebreide ("verbose") protocoldecodering (geactiveerd via de -v commandolijnoptie). Tcpdump's protocol decoders hebben geen perfecte veiligheidshistoriek. Ten minste in theorie, zou een vertraagde aanval mogelijk kunnen zijn via de partiële pakket payloads geregistreerd door het log-device. Het is aanbevolen praktijk om de logbestanden van de firewallmachine af te halen om ze op deze manier te onderzoeken.

Bijkomende zorg moet ook besteed worden aan het beveiligen van toegang tot de logs. Standaard zal pflogd 96 bytes van het pakket registreren in het logbestand. Toegang tot de logs zou gedeeltelijke toegang tot gevoelige pakket payloads kunnen verschaffen (zoals telnet(1) of ftp(1) gebruikersnamen en wachtwoorden).

Log Uitvoer Filteren

Omdat pflogd in tcpdump binair formaat logt, kan het volledige bereik van tcpdump functionaliteiten gebruikt worden bij het nakijken van de logs. Om bijvoorbeeld alleen pakketten te zien die overeenstemmen met een bepaalde poort:
# tcpdump -n -e -ttt -r /var/log/pflog port 80

Dit kan verder verfijnd worden door het vertonen van pakketten te beperken tot een bepaalde combinatie van host en poort:

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

Dezelfde idee kan toegepast worden bij het lezen uit de pflog0 interface:

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

Merk op dat dit geen impact heeft op welke pakketten naar het pflogd bestand gelogd worden; de bovenstaande commando's tonen slechts pakketten terwijl ze gelogd worden.

Bovenop het gebruik van de standaard tcpdump(8) filterregels, werd OpenBSD's tcpdump filtertaal uitgebreid voor het lezen van pflogd uitvoer:

Voorbeeld:

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

Dit toont de log, in real-time, van de inwaartse pakketten die geblokkeerd werden op de wi0 interface.

Pakketen Loggen Via Syslog

In vele situaties is het wenselijk om de firewall logs beschikbaar te hebben in ASCII formaat en/of ze naar een remote log-server te versturen. Dit kan allemaal bereikt worden met twee kleine shell scripts, enkele kleine veranderingen van de OpenBSD configuratiebestanden, en syslogd(8), de log-daemon. Syslogd logt in ASCII en kan ook loggen naar een remote log-server.

Eerst moeten we een gebruiker, pflogger, aanmaken met een /sbin/nologin shell. De gemakkelijkste manier om deze gebruiker aan te maken is met adduser(8).

Na het aanmaken van de gebruiker pflogger, maakt u de volgende twee scripts:

/etc/pflogrotate

	#!/bin/sh
	FILE=/home/pflogger/pflog5min.$(date "+%Y%m%d%H%M")
	kill -ALRM $(cat /var/run/pflogd.pid)
	if [ $(ls -l /var/log/pflog | cut -d " " -f 8) -gt 24 ]; then
	   mv /var/log/pflog $FILE
	   chown pflogger $FILE
	   kill -HUP $(cat /var/run/pflogd.pid)
	fi

/home/pflogger/pfl2sysl

	#!/bin/sh
	# feed rotated pflog file(s) to syslog
	# do not start if another instance of this script is already running
	pgrep pfl2sysl >/dev/null 2>&1
	if [ $? -ne 0 ] ; then
		for logfile in /home/pflogger/pflog5min* ; do
			if [ -f "$logfile" ] ; then
				tcpdump -n -e -ttt -r $logfile | logger -t pf -p local0.info
				rm $logfile
			fi
		done
	fi

Bewerk de cron job van root:

# crontab -u root -e

Voeg de volgende twee lijnen toe:

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

Maak een cron job aan voor de gebruiker pflogger:

# crontab -u pflogger -e

Voeg de volgende twee lijnen toe:

# feed rotated pflog file(s) to syslog
0-59/5 * * * * /bin/sh /home/pflogger/pfl2sysl

Voeg de volgende lijn toe aan /etc/syslog.conf:

local0.info     /var/log/pflog.txt

Indien u ook wil loggen naar een remote log-server, voeg dan deze lijn toe:

local0.info     @syslogger

Zorg ervoor dat de host syslogger gedefinieerd werd in het hosts(5) bestand.

Maak het bestand /var/log/pflog.txt aan om syslog toe te laten naar dat bestand te loggen.

# touch /var/log/pflog.txt

Laat syslogd de veranderingen opmerken door het te herstarten:

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

Alle gelogde pakketten worden nu naar /var/log/pflog.txt gestuurd. Als de tweede lijn toegevoegd wordt, worden ze ook naar de remote log-host syslogger gestuurd.

Het script /etc/pflogrotate verwerkt nu en verwijdert vervolgens /var/log/pflog zodat rotatie van pflog door newsyslog(8) niet langer nodig is en best wordt uitgeschakeld. /var/log/pflog.txt vervangt echter /var/log/pflog en rotatie ervan wordt best geactiveerd. Verander /etc/newsyslog.conf als volgt:

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

PF zal nu in ASCII loggen naar /var/log/pflog.txt. Als het zo geconfigureerd is in /etc/syslog.conf, zal het ook naar een remote server loggen. Het loggen is niet ogenblikkelijk maar het kan tot ongeveer 5-6 minuten (het cron job interval) duren voordat de gelogde pakketten in het bestand verschijnen.

[Vorige: Pakketmarkering] [Inhoud] [Volgende: Prestatie]


[terug] www@openbsd.org
$OpenBSD: logging.html,v 1.9 2006/05/01 09:48:11 jufi Exp $