[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 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:
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
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).
# 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.
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]