[OpenBSD]

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

PF: Aufzeichnen


Inhaltsverzeichnis


Einführung

Wenn ein Paket in PF aufgezeichnet wird, dann wird eine Kopie des Paketheaders an das pflog(4)-Interfaces mit weiteren zusätzlichen Daten gesendet. Weitere Daten wären zum Beispiel das Interface, durch das das Paket passierte, die von PF durchgeführte Aktion (pass oder block) etc. Das pflog(4)-Interface ermöglicht es Anwendungen im Userland, PFs aufgezeichnete Daten aus dem Kernel zu empfangen. Wenn PF während des Bootvorgangs aktiviert wird, dann wird der Daemon pflogd(8) ebenfalls gestartet. Standardmäßig lauscht pflogd(8) auf dem pflog8-Interface und schreibt alle augezeichneten Daten in die Datei /var/log/pflog.

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 einen Status anlegt, wird nur das erste aufkommende Paket aufgezeichnet (d. h. das Paket, das für das Anlegen des Status verantwortlich ist).

Folgende Optionen können an das Schlüsselwort log übergeben werden:

all
Sorgt dafür, dass alle zutreffenden Pakete (nicht nur das erste Paket) aufgezeichnet werden. Insbesondere für Regeln sinnvoll, die einen Status anlegen.
to pflogN
Sorgt dafür, dass alle zutreffenden Pakete auf dem angegebenen pflog(4)-Interface ausgegeben werden. Wenn zum Beispiel spamlogd(8) verwendet wird, dann kann der gesamte SMTP-Verkehr über ein extra dafür bereitgestelltes pflog(4)-Interface von PF aufgezeichnet werden. Der spamlogd(8)-Daemon wiederum kann so eingestellt werden, dass er auf diesem Interface lauscht. Somit würde die Hauptlogdatei von PF vom SMTP-Verkehr befreit werden, der ansonsten nicht weiter aufgezeichnet werden muss. Verwende ifconfig(8), um pflog(4)-Interfaces zu erstellen. Das standardmäßige genutzte Loginterface pflog(8) wird automatisch erstellt.
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, to pflog1) on $ext_if inet proto tcp to $ext_if port 22 keep state

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 Echtzeitanzeige ist. Eine Echtzeitanzeige 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 ausführlicher Protokolldekodierung herrschen (diese wird mit der Kommandozeilenoption -v aktiviert). Tcpdumps Protokolldekodierer hat keine perfekte Sicherheitsvergangenheit. Zumindest ist in der Theorie ein verzögerter Angriff möglich, indem die einzelnen Paketpayloads mit dem Loggingdevice aufgezeichnet werden. Es ist empfohlene Praxis, die Logdateien von der Firewallmaschine 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 Paketpayloads 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 Portkombination 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 die 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 einem kleinen Shellskript, 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.

Erstelle das folgende Skript:

/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

Editiere roots Cron-Job:

# crontab -u root -e

Füge diese beiden Zeilen mit ein:

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

Füge 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, und gib dieser Datei die gleichen Rechte wie der pflog-Datei.

# touch /var/log/pflog.txt
# chmod 600 /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, sodass 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 im ASCII-Format in /var/log/pflog.txt aufzeichnen. Wenn es in /etc/syslog.conf so angeben wurde, wird ebenfalls auf einen entfernten Log-Server aufgezeichnet. Die Aufzeichnung 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.27 2008/01/13 13:43:34 tobias Exp $