[OpenBSD]

[Zurück: Pakete markieren] [Inhalt] [Weiter: Leistung]

PF: Aufzeichnen


Inhaltsverzeichnis


Einführung

In PF wird das Aufzeichnen von Paketen mit Hilfe von pflogd(8) realisiert, welches auf dem pflog0-Interface lauscht und Pakete in eine Logdatei (normalerweise /var/log/pflog) im tcpdump(8)-Binärformat schreibt. Filterregeln, die das log- oder log (all)-Schlüsselwort mit angeben, zeichen genau auf diese Art und Weise auf.

Pakete aufzeichnen

Damit Pakete, die PF passieren, aufgezeichnet werden können, muss das Schlüsselwort log innerhalb der NAT/rdr- und Filterregeln angegeben werden. Beachte, dass PF nur Pakete aufzeichnen kann, die geblockt oder durchgelassen werden; du kannst also keine Regel angeben, die einfach nur Pakete aufzeichnet.

Das Schlüsselwort log bewirkt, dass alle Pakete, die auf die Regel zutreffen, aufgezeichnet werden. Falls die Regel ein ,state' anlegt, wird nur das erste aufkommende Paket aufgezeichnet (d. h. das Paket, das für das Anlegen des ,states' verantwortlich ist).

Die Optionen, die an das Schlüsselwort log übergeben werden können, sind:

all
Sorgt dafür, dass alle zutreffenden Pakete (nicht nur das erste Paket) aufgezeichnet werden. Insbesondere für Regeln sinnvoll, die ein ,state' anlegen.
user
Sorgt dafür, dass die UNIX-Benutzer-ID und -Gruppen-ID des Besitzers des Sockets, von dem aus das Paket gesendet/zu dem das Paket gesendet wird, neben den standardmäßigen Loginformationen aufgezeichnet werden.

Optionen werden in Klammern nach dem Schlüsselwort log angegeben; mehrere Optionen werden mit Kommas oder Leerstellen getrennt.

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

Hiermit werden alle eingehenden Pakete für den Port 22 aufgezeichnet.

Eine Logdatei lesen

Die Logdatei, die von pflogd geschrieben wird, ist im Binärformat und kann nicht mit einem Texteditor gelesen werden. Tcpdump muss verwendet werden, um die Log anzuzeigen.

Um die Logdatei anzusehen:

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

Bedenke, dass die Verwendung von tcpdump(8), um die pflog-Datei anzusehen, keine Echtzeit-Anzeige ist. Eine Echtzeit-Anzeige aufgezeichneter Pakete wird anhand des pflog0-Interfaces erreicht:

# tcpdump -n -e -ttt -i pflog0

HINWEIS: Wenn die Logs untersucht werden, sollte besondere Vorsicht mit tcpdumps ,verbose'-Protokoll-Dekodierung herrschen (diese wird mit der -v-Kommandozeilenoption aktiviert). Tcpdumps Protokoll-Dekodierer hat keine perfekte Sicherheitsvergangenheit. Zumindest ist in der Theorie ein verzögerter Angriff möglich, indem die einzelnen Paket-,payloads' mit dem Logging-Device aufgezeichnet werden. Es ist empfohlene Praxis, die Logdateien von der Firewall-Maschine auf einen anderen Rechner zu verschieben, bevor sie auf diesem Weg überprüft werden.

Besondere Sorgfalt sollte ebenfalls beim Absichern des Zugriffs auf die Logs geboten sein. Standardmäßig nimmt pflogd 96 Bytes des Pakets in die Logdatei auf. Zugriff auf die Logs könnten somit Zugriff auf sensible Paket-,payloads' ermöglichen (wie zum Beispiel telnet(1)- oder ftp(1)-Benutzernamen und -Passwörter).

Log-Ausgabe filtern

Weil pflogd-Logs im tcpdump-Binärformat vorliegen, kann die gesamte Palette der tcpdump-Funktionen genutzt werden, wenn die Logs wieder angesehen werden. Zum Beispiel kann Folgendes verwendet werden, um nur die Pakete zu sehen, die mit einem bestimmten Port übereinstimmen:
# tcpdump -n -e -ttt -r /var/log/pflog port 80

Dies kann weiter verbessert werden, indem die angezeigten Pakete auf eine bestimmte Host- und Port-Kombination reduziert werden:

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

Die gleiche Idee kann angewendet werden, wenn vom pflog0-Interface gelesen wird:

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

Bedenke, dass dies keinen Einfluss darauf nimmt, welche Pakete in die Logdatei aufgezeichnet werden; das zuvor angegebene Kommando zeigt nur Pakete an, sobald sie aufgezeichnet werden.

Zusätzlich zu den typischen tcpdump(8)-Filterregeln wurde OpenBSDs tcpdump-Filtersprache so erweitert, dass die pflogd-Ausgabe gelesen werden kann:

Beispiel:

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

Dies zeigt die Log von eingehenden Paketen in Echtzeit an, die auf dem wi0-Interface geblockt worden sind.

Pakete durch syslog aufzeichnen

In vielen Situationen ist es erwünscht, die Firewall-Logs im ASCII-Format verfügbar zu haben und/oder diese zu einem entfernten Logserver zu senden. All das kann mit zwei kleinen Shellskripten, ein paar kleinen Änderungen an den OpenBSD-Konfigurationsdateien und syslogd(8), dem Logging-Daemon, erreicht werden. Syslogd zeichnet in ASCII auf und ist ebenfalls in der Lage, auf einen entfernten Logserver aufzuzeichnen.

Zuerst müssen wir einen Benutzer pflogger anlegen, der eine /sbin/nologin-Shell besitzt. Der einfachste Weg, um diesen Benutzer anzulegen, ist adduser(8).

Nachdem wir den Benutzer pflogger angelegt haben, erstellen wir die beiden folgenden Skripte:

/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

Editieren roots Cron-Job:

# crontab -u root -e

Fügen diese beiden Zeilen mit ein:

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

Erstellen einen Cron-Job für den Benutzer pflogger:

# crontab -u pflogger -e

Fügen die folgenden beiden Zeilen ein:

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

Fügen folgende Zeile in /etc/syslog.conf mit ein:

local0.info     /var/log/pflog.txt

Wenn du ebenfalls auf einen entfernten Log-Server aufzeichnen willst, füge diese Zeile mit ein:

local0.info     @syslogger

Stelle sicher, dass der Host syslogger in der hosts(5)-Datei definiert wurde.

Erstelle die Datei /var/log/pflog.txt, damit syslog in der Lage ist, in diese Datei aufzuzeichnen.

# touch /var/log/pflog.txt

Teile syslogd die Änderungen mit, indem du ihn neustartest:

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

Alle aufgezeichnete Pakete werden nun zur /var/log/pflog.txt-Datei gesendet. Wenn die zweite Zeile hinzugefügt wurde, dann werden sie ebenfalls zum entfernten Log-Host syslogger gesendet.

Das Skript /etc/pflogrotate verarbeitet und entfernt danach /var/log/pflog, so dass das Rotieren von pflog durch newsyslog(8) nicht weiter notwendig ist und daher auch ausgeschaltet werden könnte. Trotzdem wird /var/log/pflog.txt /var/log/pflog ersetzen und das Rotieren davon sollte aktiviert werden. Ändere /etc/newsyslog.conf wie folgt:

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

PF wird nun in ASCII in /var/log/pflog.txt aufzeichnen. Wenn es in /etc/syslog.conf so angeben wurde, wird ebenfalls auf einen entfernten Log-Server aufgezeichnet. Das Aufzeichnen findet nicht sofort statt, stattdessen kann es bis zu 5 oder 6 Minuten dauern (das Cron-Job-Intervall), bevor aufgezeichnete Pakete in der Datei auftauchen.

[Zurück: Pakete markieren] [Inhalt] [Weiter: Leistung]


[zurück] www@openbsd.org
$OpenBSD: logging.html,v 1.18 2006/05/01 12:19:17 jufi Exp $