[OpenBSD]

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

PF: Logowanie


Spis treści


Wstęp

Gdy pakiet jest logowany poprzez PF, kopia nagłówka tego pakietu jest wysyłana do interfejsu pflog(4), w raz z dodatkowymi informacjami takimi jak nazwa interfejsu przez jaki pakiet przeszedł, działaniem jakie podjął PF wobec tego pakietu (przepuszczenie lub zablokowanie), itp. pflog(4) pozwala aplikacjom z przestrzeni użytkownika na odebranie informacji PF-a z kernela. Jeżeli PF jest włączony podczas startu systemu, uruchamiany jest demon pflogd(8). Domyslnie pflogd(8) nasłuchuje na interfejsie pflog0 i zapisuje zalogowane informacje do pliku /var/log/pflog.

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.
to pflogN
Powoduje logowanie określonych pakietów na podany interfejs pflog(4). Przykładowo, gdy korzystamy z spamlogd(8), cały ruch SMTP może być przez PF-a logowany na dedykowanym interfejsie pflog(4). Można wówczas wskazać demonowi spamlogd(8) aby nasłuchiwał na tym interfejsie. Pozwoli to na zachowanie logów PF-a czystych z wpisów dotyczących ruchu SMTP, który normalnie nie byłby logowany. Użyj ifconfig(8) do tworzenia interfejsów pflog(4). Domyślny interfejs pflog0 jest tworzony automatycznie.
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, to pflog1) on $ext_if inet proto tcp to $ext_if port 22 keep state

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 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 mały skrypt 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 rozpoczynamy od napisania poniższego skryptu:

/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

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

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, oraz nadaj mu takie same uprawnienia jak plikowi pflog.

# touch /var/log/pflog.txt
# chmod 600 /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$