[Zurück: Pakete markieren] [Inhalt] [Weiter: Leistung]
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:
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.
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).
# 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.
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]