[2] PF – Packet Filter – Wstępny zestaw reguł

31 stycznia 2024 Wyłączono przez Adam [zicherka] Nogły

W tym podrozdziale rozpoczniemy przygotowanie do zabezpieczenia naszego serwera. Stworzymy wstępny, początkowy zestaw reguł, który zapewni podstawową ochronę naszego serwera oraz zapewni jednocześnie dostęp do krytycznych usług ze strony Internetu.

Istnieją dwa podejścia – modele – do budowania zapory ogniowej:

  • Domyślna odmowa – czyli blokujemy cały ruch, a następnie dopiero zezwalamy na to, na co chcemy zezwolić w zestawie reguł,
  • Domyślne zezwolenie – przepuszczamy cały ruch, a blokowany jest jedynie ten, który został wskazany w regułach.

My wybieramy – a właściwie ja polecam wybrać pierwszą opcję – bardziej restrykcyjną, czyli domyślną odmowę.

Utwórzmy zatem plik konfiguracyjny:

root@vfbsd01:~ # mcedit /etc/pf.conf

PF filtruje pakiety zgodnie z trzema podstawowymi działaniami: blokowanie [block], przekazywanie [pass] i dopasowywanie [match]. W połączeniu z innymi opcjami tworzą reguły. Akcja jest podejmowana wtedy, gdy pakiet spełnia kryteria określone w regule. Jak można się spodziewać, reguły przepuszczania i blokowania będą przepuszczać i blokować ruch. Reguła dopasowania wykonuje akcję na pakiecie, gdy znajdzie pasujące kryteria, ale go nie przepuszcza ani nie blokuje. Na przykład możesz wykonać translację adresów sieciowych (NAT) na pasującym pakiecie bez przepuszczania go lub blokowania, co spowoduje, że pakiet będzie bez jakiejkolwiek akcji, dopóki nie każesz mu zrobić czegoś w innej regule, na przykład skierować go do innej maszyny lub przykładowo bramy.

# dodaj pierwszą regułę, która blokuje cały ruch
block all

Ta reguła blokuje wszelkie formy ruchu w każdym kierunku. Ponieważ nie określa kierunku, domyślnie jest to zarówno wejście, jak i wyjście. Ta zasada jest uzasadniona w przypadku lokalnej stacji roboczej, która musi być odizolowana od świata, ale jest w dużej mierze niepraktyczna i nie będzie działać zadowalająco dla nas na zdalnym serwerze, ponieważ nie zezwala na wymagany dla nas ruch SSH. W rzeczywistości, gdybyś włączył teraz PF, zablokowałbyś się na serwerze, bez możliwości jakiegokolwiek dostępu do niego.

Zatem zmień swój plik [/etc/pf.conf], aby zezwolić na ruch przychodzący dla SSH:

# dodaj na końcu
pass in proto tcp to port 22

Jako alternatywę dla portów, możesz użyć nazw usług/protokołów. Czyli nasze 2 wiersze wyglądały by tak:

block all
pass in proto tcp to port ssh

Ze względu na spójność będziemy używać numerów portów, chyba że istnieje ważny powód, aby tego nie robić. Szczegółowa lista protokołów i odpowiadających im numerów portów znajduje się w pliku [/etc/services], do którego przejrzenia gorąco zachęcam.

PF przetwarza reguły sekwencyjnie od góry do dołu, dlatego Twój obecny zestaw reguł początkowo blokuje cały ruch, ale następnie przekazuje go, jeśli spełnione są kryteria, które są w następnym wierszu, co w tym przypadku jest ruchem przychodzącym dla SSH.

Możesz teraz połączyć się przez SSH z serwerem, ale nadal blokujesz wszystkie inne formy ruchu wychodzącego. Jest to problematyczne, ponieważ nie można uzyskać dostępu do krytycznych usług z Internetu: instalacja pakietów, aktualizacja ustawienia czasu i tak dalej.

Aby rozwiązać ten problem, dołącz i zmień następujące reguły w pliku [/etc/pf.conf]:

block all
pass in proto tcp to port { 22 }
pass out proto { tcp udp } to port { 22 53 80 123 443 }

Nasz zestaw reguł zezwala teraz na wychodzący ruch SSH, DNS, HTTP, NTP i HTTPS, a także blokuje cały ruch przychodzący (z wyjątkiem SSH). Umieszczamy numery portów i protokoły w nawiasach klamrowych, które tworzą listę w składni PF, co pozwala w razie potrzeby dodać więcej numerów portów. Dodaje się również regułę [pass out] dla protokołu UDP na portach [53] i [123], ponieważ DNS i NTP często przełączają się między protokołami TCP i UDP. Wstępny zestaw reguł jest już prawie gotowy i wystarczy dodać kilka dodatkowych reguł, aby uzyskać podstawową funkcjonalność naszej zapory.

Uzupełnij wstępny zestaw reguł zasadami, aby cały dotychczasowy wpis w pliku [/etc/pf.conf] wyglądał jak poniżej:

set skip on lo0
block all
pass in proto tcp to port { 22 }
pass out proto { tcp udp } to port { 22 53 80 123 443 }
pass out inet proto icmp icmp-type { echoreq }

Zapisz plik i wyjdź z niego.

Utworzyliśmy regułę pomijania [set skip], dla urządzenia [lo0] – czyli interfejsu pętli zwrotnej, ponieważ nie ma potrzeby filtrowania ruchu na tym interfejsie. Dodaliśmy także regułę [pass out inet] dla protokołu ICMP, która pozwala na wykorzystanie narzędzia [ping] do sprawdzenia dostępności naszego serwera w razie kłopotów. Opcja [inet] reprezentuje rozdzinę adresów IPv4.

ICMP to uniwersalny protokół komunikacyjny używany przez urządzenia sieciowe do różnych rodzajów komunikacji. Na przykład narzędzie ping używa typu wiadomości znanego jako żądanie echa, które dodałeś do swojej listy [icmp_type]. Jako środek ostrożności zezwalasz tylko na te typy wiadomości, które są potrzebne, aby uniemożliwić niepożądanym urządzeniom kontaktowanie się z serwerem. W miarę wzrostu potrzeb możesz dodać więcej typów wiadomości do swojej listy.

Masz teraz działający zestaw reguł, który zapewnia podstawową funkcjonalność większości maszyn. W następnej sekcji potwierdźmy, że wszystko działa poprawnie, włączając PF i testując wstępny zestaw reguł. Zatem nasz plik na obecną chwilę ma następującą postać:

root@vfbsd01:~ # cat /etc/pf.conf
set skip on lo0
block all
pass in proto tcp to port { 22 }
pass out proto { tcp udp } to port { 22 53 80 123 443 }
pass out inet proto icmp icmp-type { echoreq }