[OpenBSD]

[Wstecz: Packet Tagging] [Spis treści] [Dalej: Wydajność]

PF: Logowanie


Spis treści


Wstęp

Tworzenie logów w PF odbywa się za pośrednictwem pflogd(8), który nasłuchuje na urządzeniu pflog0 i zapisuje pakiety do pliku logów (domyślnie /var/log/pflog) w formacie binarnym tcpdump(8). Reguły filtrujące, które zawierają słowa kluczowego log lub log (all) podlegają logowaniu.

Logowanie pakietów

Po to by logować pakiety przechodzące przez PF, musi zostać użyte słowo kluczowe log w regułach NAT/rdr oraz filter. Zwróć uwagę, że mogą być logowane tylko pakiety przepuszczane lub blokowane; nie można określić reguły która będzie tylko logowała pakiety.

Klucz log powoduje, że wszystkie pakiety pasujące do reguły będą logowane. W przypadku gdy reguła tworzy stan, tylko pierwszy pasujący (ten powodujący utworzenie stanu) będzie logowany.

Opcje które można podać dla klucza log:

all
Spowoduje logowanie wszystkich pasujących pakietów, nie tylko początkowego pakietu. Przydatne w regułach które tworzą stany.
user
Powoduje logowanie, ze standardową informacją, pakietów pochodzących/kierowanych do soketu którego właścicielem jest uniksowy user-id i group-id (obojętnie jaki socket jest lokalny).

Opcje podawane są w nawiasie po kluczu log; wielokrotne opcje mogą być oddzielone przecinkiem lub spacją.

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

Reguła ta spowoduje logowanie wszystkich pakietów kierowanych na port 22.

Odczytywanie pliku logów

Plik logów, tworzony przez pflogd jest plikiem o formacie binarnym i nie może być odczytywany przy pomocy edytora tekstu. Należy użyć tcpdump do jego odczytu.

Aby wyświetlić zawartość pliku logów:

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

Oczywiście przeglądanie pliku pflog przy pomocy tcpdump(8), nie daje wyników w czasie rzeczywistym. Wyświetlanie logowanych pakietów na bieżąco może być osiągnięte przy pomocy interfejsu pflog0:

# tcpdump -n -e -ttt -i pflog0

UWAGA: Podczas analizowania logów, uwagę należy zwracać na szczegółowe dekodowanie protokołów przez tcpdump (tryb "dokładny" aktywowany opcją -v). Dekoder zawarty w programie tcpdump nie ma zbyt chwalebnej przeszłości jeśli chodzi o bezpieczeństwo. Przynajmniej teoretycznie możliwe jest przeprowadzenie opóźnionego ataku poprzez wysyłanie pakietów mających zostać zalogowanymi. Jest zalecaną praktyką, aby przed rozpoczęciem przeglądania plików logów w ten sposób, przenieść je z firewalla na inną maszynę.

Szczególna ostrożność powinna być zachowana w stosunku do zabezpieczenia dostępu do plików logów. Domyślnie, pflogd będzie zapisywać 96 bajtów pakietu w pliku logów. Dostęp do logów może skutkować uzyskaniem dostępu do wrażliwych danych transportowanych w pakietach (jak na przykład nazwy użytkowników i hasła usług telnet(1) lub ftp(1)).

Selektywne przeglądanie logów

Ponieważ logi pflogd(8) są zapisywane w binarnym formacie tcpdump(8), wszystkie dostępne właściwości tego programu mogą być wykorzystywane podczas ich przeglądania. Na przykład, aby wyświetlić pakiety, które odpowiadają portowi 80, można użyć takiego polecenia:
# tcpdump -n -e -ttt -r /var/log/pflog port 80

Aby uzyskać jeszcze bardziej precyzyjną informację, można ograniczyć wyświetlane dane do konkretnych kombinacji port-host:

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

Ta sama technika może być zastosowana podczas odczytu bezpośrednio z interfejsu pflog0:

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

Warto podkreślić, że nie ma to wpływu na to, które pakiety są zapisywane w pliku logów pflogd, a jedynie na to, co jest wyświetlane przez tą komendę.

Standardowe reguły filtrujące tcpdump(8) zostały rozszerzone w wersji tego programu dla OpenBSD o dodatkowe możliwości filtrowania logów pflogd:

Przykład:

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

Wyświetla logi w czasie rzeczywistym, dla nadchodzących pakietów, które zostały zablokowane na interfejsie wi0.

Logowanie pakietów poprzez syslog

W niektórych sytuacjach jest pożądane, aby logi firewalla były dostępne w formacie ASCII i/lub wysyłane do zdalnego serwera gromadzącego logi. Może to być zrealizowane poprzez dwa małe skrypty powłoki, wprowadzenie drobnych zmian w plikach konfiguracyjnych OpenBSD oraz syslogd(8) - demonie logującym. Syslogd prowadzi logi w formacie ASCII i jest w stanie przechowywać logi na zdalnym serwerze logów.

Prace rozpoczyna się od utworzenia użytkownika pflogger, jego shell to /sbin/nologin. Najprościej zrobić to przy pomocy adduser(8).

Po dodaniu użytkownika pflogger, należy przekopiować dwa proste skrypty:

/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

Przejść do edycji zadań demona cron dla użytkownika root:

# crontab -u root -e

Dodać dwie następujące linie:

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

Utworzyć zadania demona cron dla użytkownika pflogger:

# crontab -u pflogger -e

Dodać dwie poniższe linie:

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

Dodać następującą linie do /etc/syslog.conf:

local0.info     /var/log/pflog.txt

Dodatkowo, aby prowadzić logi na zdalnym serwerze przeznaczonym do tego celu, należy dodać następującą linie:

local0.info     @syslogger

Dodatkowo należy upewnić się, że host syslogger jest zdefiniowany w pliku hosts(5).

Utwórz plik /var/log/pflog.txt, aby umożliwić syslog dopisywanie do niego logów.

# touch /var/log/pflog.txt

Zmiany staną się aktywne po przeładowaniu demona syslogd:

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

Wszystkie logowane pakiety są teraz wysyłane do /var/log/pflog.txt. Jeśli druga linia została także dodana, są one także wysyłane do zdalnego hosta logującego syslogger.

Skrypt /etc/pflogrotate już działa i zastępuje /var/log/pflog więc rotacja pflog dokonywana przez newsyslog(8) nie jest już potrzebna i powinna być wyłączona. Ponieważ /var/log/pflog.txt przejmuję zadania /var/log/pflog, jego rotacja powinna być aktywowana. Tak więc należy zmienić /etc/newsyslog.conf w następujący sposób:

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

PF będzie teraz zapisywał logi w formacie ASCII do pliku /var/log/pflog.txt. Odpowiednio ustawiony plik /etc/syslog.conf sprawi, że dziennik prowadzony będzie także na zdalnym serwerze logów. Logowanie nie będzie natychmiastowe i może upłynąć około 5-6 minut (przerwa pomiędzy zadaniami cron), zanim logowane pakiety pojawią się pliku.

[Wstecz: Packet Tagging] [Spis treści] [Dalej: Wydajność]


[wstecz] www@openbsd.org
$OpenBSD: logging.html,v 1.18 2006/05/19 09:13:25 jufi Exp $