[OpenBSD]

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

PF: Loggen


Inhoudsopgave


Inleiding

Wanneer een pakket gelogd wordt door PF, wordt een kopie van de pakkethoofding naar de pflog(4) interface gestuurd samen met enkele bijkomende gegevens zoals de interface waar het pakket doorheen reisde, de actie die door PF werd genomen (doorlaten of blokkeren), enz. De pflog(4) interface laat user-space applicaties toe om PF's log-gegevens vanwege de kernel te ontvangen. Als PF ingeschakeld wordt wanneer het systeem gestart wordt, dan wordt de pflogd(8) daemon gestart. Standaard luistert pflogd(8) op de pflog0 interface en schrijft het alle gelogde gegevens naar het /var/log/pflog bestand.

Pakketten Loggen

Om pakketten te loggen die langs PF gaan, moet het log sleutelwoord worden gebruikt. Het log sleutelwoord zorgt ervoor dat alle pakketten die overeenstemmen met een regel, gelogd 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) gelogd 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, gelogd worden. Nuttig voor regels die een toestand aanmaken.
to pflogN
Zorgt ervoor dat alle overeenstemmende pakketten gelogd worden naar de gespecificeerde pflog(4) interface. Wanneer u bijvoorbeeld spamlogd(8) gebruikt, kan alle SMTP verkeer door PF gelogd worden naar een specifieke pflog(4) interface. De spamlogd(8) daemon kan dan verzocht worden om op die interface te luisteren. Dit houdt het primaire PF logbestand zuiver van SMTP verkeer dat anders niet gelogd zou moeten worden. Gebruik ifconfig(8) om pflog(4) interfaces aan te maken. De standaard log interface pflog0 wordt automatisch aangemaakt.
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) gelogd 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, to pflog1) on $ext_if inet proto tcp to $ext_if port 22 keep state

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 160 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 de 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 een kleine shell script, 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.

Maak het volgende script aan:

/etc/pflogrotate

	#!/bin/sh
	PFLOG=/var/log/pflog
	FILE=/var/log/pflog5min.$(date "+%Y%m%d%H%M")
	pkill -ALRM -u root -U root -t - -x pflogd
	if [ -r $PFLOG ] && [ $(stat -f %z $PFLOG) -gt 24 ]; then
	   mv $PFLOG $FILE
	   pkill -HUP -u root -U root -t - -x pflogd
	   tcpdump -n -e -s 160 -ttt -r $FILE | logger -t pf -p local0.info
	   rm $FILE
	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

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, en geef het dezelfde permissies als het pflog bestand.

# touch /var/log/pflog.txt
# chmod 600 /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 "pkill -HUP -u root -U root -t - -x pflogd"
    /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.29 2013/11/02 14:03:43 ajacoutot Exp $