IPFilter cz.1
Data: 30-09-2003 o godz. 22:36:06
Temat: Konfiguracje usług w systemie FreeBSD


IP Filter to fajna, mała paczka ściany ogniowej. Robi prawie wszystko co inne, darmowe (ipfwadm, ipchains, ipfw), ale oprócz tego jest również przenośna między platformami i potrafi parę ciekawych rzeczy których inne nie robią.

1. Wprowadzenie

IP Filter to fajna, mała paczka ściany ogniowej. Robi prawie wszystko co inne, darmowe (ipfwadm, ipchains, ipfw), ale oprócz tego jest również przenośna między platformami i potrafi parę ciekawych rzeczy których inne nie robią. Dokument ma na celu zebranie wiedzy ze śladowej dokumentacji dostępnej do tej pory dla ipfilter. Co więcej, dokument ten może służyć jako dokumentacja do filtrów pakietów zgodnych na poziomie opcji (w szczególności pf) a jeśli to będzie potrzebne wskaże różnice; jest jednak adresowany do specyficznego języka opisu reguł i ich składni, a także nie pisano go pod kątem konkretnej platformy. Wskazana jest podstawowa znajomość zagadnień filtrowania pakietów, choć z drugiej strony jeśli zbyt dobrze się w tym orientujesz, czytanie tego dokumentu jest prawdopodobnie stratą czasu. By lepiej zrozumieć zagadnienia związane ze ścianami ogniowymi, autorzy polecają lekturę 'Building Internet Firewalls', autorstwa Chapman & Zwicky, wydawnictwa O'Reilly and Associates; oraz 'TCP/IP Illustrated, Volume I', Stevens, Addison-Wesley.

1.1 Oświadczenie

Autorzy tego dokumentu ( ani tłumacz! - przyp. tłum. ) nie są odpowiedzialni za żadne uszkodzenia wynikłe w wyniku podejmowania akcji bazujących na lekturze tego dokumentu. Dokument ten pomyślano jako wprowadzenie do budowy ścian ogniowych opartych o IP-Filter. Jeśli nie czujesz się dobrze biorąc odpowiedzialność za swoje czyny, powinieneś przestać czytać ten dokument i wynająć wykwalifikowany personel by zainstalował dla ciebie ścianę ogniową.

1.2 Prawa autorskie

Tam gdzie nie napisano inaczej, prawa autorskie dokumentów HOWTO należą do ich autorów. Dokumenty HOWTO mogą być reprodukowane i dystrybuowane w całości lub w części, na każdym nośniku fizycznym lub elektronicznym, tak długo jak informacje o prawach autorskich zostaną dołączone do każdej kopii. Komercyjna redystrybucja jest również zezwolona i jak najbardziej zachęcamy do niej; jednakże autorzy życzą sobie zostać o takim fakcie poinformowani.

Wszystkie tłumaczenia, prace oparte o ten dokument, lub prace zbiorowe zawierające dowolne HOWTO muszą opierać się na tej samej filozofii praw autorskich. To znaczy, nie możesz pisać prac opartych o HOWTO i narzucać jakieś dodatkowe ograniczenia na jego dystrybucję. Mogą się jednak zdarzyć wyjątki od tych reguł - proszę skontaktować się z koordynatorem HOWTO.

Krótko mówiąc, chcemy promować informacje przekazywane w tym dokumencie przez tyle dróg ile się da. Jednak życzymy sobie zachować prawa autorskie do tego HOWTO, i chcielibyśmy być informowani o jakichkolwiek planach redystrybuowania tego HOWTO.

1.3 Skąd uzyskać ważne rzeczy

Oficjalna strona IP Filter znajduje się pod adresem http://coombs.anu.edu.au/~avalon/ip-filter.html.

Kompatybilny filtr pakietów na licencji BSD znajduje się pod adresem http://www.benzedrine.cx/pf.html.

Najaktualniejszą wersję tego dokumentu można znaleźć pod adresem: http://www.obfuscation.org/ipf/

2. Podstawy ścian ogniowych

Tą sekcję napisaliśmy tak, by zapoznać się ze składnią poleceń ipfilter, oraz teorią ścian ogniowych w ogólności. Możliwości które tu opisano znajdziesz w każdej dobrej paczce ściany ogniowej. Ta sekcja da Ci solidne podstawy, tak by lektura i zrozumienie sekcji zaawansowanej było bardzo łatwe. Należy podkreślić, że przeczytanie tylko tej sekcji nie wystarczy do zbudowania dobrej ściany ogniowej, a zapoznanie się z sekcją zaawansowaną jest absolutnie wymagana dla każdego kto chce zbudować efektywny system bezpieczeństwa.

2.1 Dynamika pliku konfiguracyjnego i kolejność

IPF ( Filtr IP ) posiada plik konfiguracyjny ( w przeciwieństwie do trybu pracy w której uruchamia się cały czas komendy dla każdej nowej reguły ). Plik konfiguracyjny jest zgodny z filozofią Unixa: każda nowa linia to reguła, znak '#' oznacza komentarz, możesz również wpisać regułę i po niej komentarz w jednej linii. Oczywiście dozwolone są również nadmiarowe spacje, a nawet poleca się je by zestawy reguł był czytelniejszy.

2.2 Podstawy przetwarzania reguł

Reguły przetwarzane są z góry na dół, każda dodawana po poprzedniej. Oznacza to po prostu, że jeśli cały Twój plik konfiguracyjny wygląda tak:

block in all
pass  in all

...komputer widzi go jako:

block in all
pass  in all

Co oznacza, że po otrzymaniu pakietu, IPF najpierw stosuje regułę:

block in all

Jeśli IPF uzna, że należy przejść do następnej reguły, zinterpretuje ją:

pass  in all

W tym momencie możesz zadać sobie pytanie "a uzna, że należy przejść do następnej reguły?". Jeśli znany jest ci ipfwadm czy ipfw, prawdopodobnie nie zadasz sobie tego pytania. Potem będziesz mocno zdziwiony, dlaczego pakiety są odrzucane lub przepuszczane, podczas gdy wskazałeś inaczej. Wiele filtrów pakietów przestaje porównywać pakiety w momencie, gdy znajdą pierwszą regułę która pasuje. IPF nie jest jednym z nich.

Odmiennie, niż w przypadku innych filtrów pakietów, IPF utrzymuje flagę czy przepuścić pakiet czy nie. Dopóki nie przerwiesz porównywania, IPF sprawdzi cały zestaw reguł i podejmie decyzję czy przepuścić pakiet czy nie, na podstawie ostatniej pasującej reguły. Wygląda to tak: IPF pracuje. Dostał kawałek czasu procesora. Ma przed sobą listę do sprawdzenia, która wygląda tak:

block in all
pass  in all

Do interfejsu dociera pakiet i trzeba zabrać się do pracy. Pobiera pakiet i sprawdza pierwszą regułę:

block in all

IPF stwierdza "Jak na razie, zablokuję ten pakiet". Następnie ogląda drugą regułę:

pass  in all

"Jak na razie, wpuszczę ten pakiet", stwierdza IPF. Potem patrzy na trzecią regułę. Nie ma jej, więc sprawdza jaką decyzję podjął ostatnio - przepuścić pakiet.

W tym momencie nadszedł dobry moment by zauważyć, że nawet gdyby zestaw reguł wyglądał tak:

block in all
block in all
block in all
block in all
pass  in all

To i tak pakiet zostałby przepuszczony. Nie istnieje tutaj coś takiego jak efekt kumulacyjny. Ostatnia pasująca reguła zawsze decyduje o losie pakietu.

2.3 Kontrolowanie przetwarzania reguł

Jeśli miałeś już do czynienia z innymi filtrami pakietów, możesz stwierdzić że ten sposób organizacji przetwarzania jest mylący, możesz również spekulować że istnieją problemy z przenoszalnością do innych filtrów oraz, że prędkość przetwarzania reguł może być mała. Wyobraź sobie że masz 100 reguł i wszystkie pasujące były pierwszymi 10. Dla każdego pakietu sprawdzenie pozostałych reguł byłoby wielką stratą czasu. Na szczęście, istnieje proste słowo kluczowe które możesz dodać do reguły by od razu spowodować reakcję. Tym słowem jest quick.

Poniżej przedstawiono zmodyfikowaną wersję oryginalnego zestawu, tym razem z nową komendą.

block in quick all
pass  in       all

W tym przypadku, IPF sprawdza pierwszą regułę:

block in quick all

Pakiet pasuje i przeglądanie reguł na nim się kończy. Pakiet zostaje odrzucony bez żadnego piśnięcia. Nie ma żadnych komunikatów, logów, konduktu pogrzebowego. Ciasto nie zostanie podane. Co więc z następną regułą?

pass  in       all

Do tej reguły IPF nigdy nie dociera. Mogłoby jej w ogóle nie być w pliku konfiguracyjnym. Działanie reguły all i słowo quick w poprzedniej regule powoduje, że nie są już sprawdzane żadne inne reguły.

Sytuacja w której połowa pliku konfiguracyjnego do niczego się nie przydaje, jest raczej stanem niepożądanym. Z drugiej strony, IPF ma za zadanie powstrzymywać pakiety tak jak został skonfigurowany, i robi bardzo dobrą robotę. Tak czy inaczej, IPF jest również po to by niektóre pakiety przepuszczać, więc wymagana jest pewna zmiana reguł by to zadanie zrealizować.

2.4 Podstawy filtrowania po adresie IP

IPF może sprawdzać pakiety pod kątem wielu kryteriów. Jednym z tych o których myślimy najczęściej jest adres IP. Istnieją pewne zakresy przestrzeni adresowej z których nigdy nie powinniśmy otrzymywać żadnych pakietów. Jednym z takich zakresów jest sieć nieroutowalna, 192.168.0.0/16 ( /16 to zapis maski w postaci CIDR. Możesz być bardziej przyzwyczajony do zapisu decymalnego, 255.255.0.0 - IPF akceptuje obydwa ). Jeśli chciałbyś zablokować 192.168.0.0/16, jednym ze sposobów jest:

block in quick from 192.168.0.0/16 to any
pass  in       all

Tym razem mamy w końcu zestaw reguł który coś dla nas robi. Wyobraźmy sobie, że dociera do nas pakiet z adresu 1.2.3.4. Sprawdzana jest pierwsza reguła:

block in quick from 192.168.0.0/16 to any

Pakiet przyszedł z adresu 1.2.3.4 a nie z 192.168.*.*, więc reguła nie pasuje. Sprawdzana jest druga reguła:

pass  in       all

Pakiet przyszedł z adresu 1.2.3.4, który zdecydowanie należy do all ( czyli dowolnego adresu ), więc jest wysyłany tam gdzie chciałby dotrzeć.

Z drugiej strony, przypuśćmy że otrzymaliśmy pakiet z adresu 192.168.1.2. Sprawdzana jest pierwsza reguła:

block in quick from 192.168.0.0/16 to any

Pakiet pasuje, więc jest odrzucany i to koniec. Ponownie, IPF nie sprawdza drugiej reguły, ponieważ pierwsza reguła która pasowała, zawierała słowo quick.

W tym momencie możesz zbudować rozszerzalny zestaw adresów, z których niektóre należy zablokować a niektóre przepuścić. Ponieważ już zaczęliśmy blokować zakresy adresów prywatnych na naszej ścianie ogniowej, zadbajmy o resztę:

block in quick from 192.168.0.0/16 to any
block in quick from 172.16.0.0/12 to any
block in quick from 10.0.0.0/8 to any
pass  in       all

Pierwsze trzy reguły blokują niektóre z zakresów adresów prywatnych.

2.5 Kontrola interfejsów

Często zdarza się, że firmy mają najpierw sieć wewnętrzną, zanim zechcą podłączyć się do świata zewnętrznego. Tak naprawdę, sensowne wydaje się założenie, że to główny powód dla którego ludzie w ogóle rozważają ściany ogniowe. Maszyna, która pełni rolę mostu ( ang. bridge ) między siecią wewnętrzną a siecią zewnętrzną jest routerem. Router od każdej innej dowolnej maszyny różni jedna podstawowa cecha: ma więcej niż jeden interfejs.

Każdy pakiet który otrzymujesz, przychodzi którymś interfejsem sieciowym; każdy pakiet który wysyłasz wychodzi również interfejsem sieciowym. Powiedzmy że masz trzy interfejsy: pętlę zwrotną - lo0 ( ang. loopback ), xl0 ( kartę ethernetową 3COM ) i tun0 ( podstawowy tunel we FreeBSD którego używa PPP ), ale nie chcesz otrzymywać pakietów przychodzących z interfejsu tun0?

block in quick on tun0 all
pass  in               all

W tym przypadku słowo on oznacza identyfikację danych przybywających wskazanym interfejsem. Jeśli pakiet przychodzi do interfejsu tun0 ( 'on tun0' ), pierwsza reguła go zablokuje. Jeśli pakiet przyjdzie do interfejsu lo0 lub xl0, pierwsza reguła nie będzie pasowała, a druga tak i pakiet zostanie przepuszczony.

2.6 Jednoczesne użycie adresu IP i nazwy interfejsu

To dziwny stan, w którym decydujesz, że chcesz mieć interfejs podniesiony ( w naszym przypadku tun0 ), ale nie chcesz otrzymywać przez niego pakietów. Czym więcej jest kryteriów które sprawdza ściana ogniowa, tym jest bardziej szczelna ( lub przeciekająca ). Może chcesz otrzymywać dane przez tun0, ale nie od 192.168.0.0/16? To początek potężnej ściany ogniowej.

block in quick on tun0 from 192.168.0.0/16 to any
pass  in               all

Porównaj to do naszego poprzedniego zestawu reguł:

block in quick from 192.168.0.0/16 to any
pass  in       all

Blokujemy w nim każdy ruch pochodzący z 192.168.0.0/16, niezależnie od interfejsu. W nowym zestawie reguł, w którym używamy słów 'on tun0' blokujemy tylko pakiety, które dotarły przez interfejs tun0. Gdyby pakiet przybył interfejsem xl0 zostałby wpuszczony.

W tym momencie możesz zbudować rozszerzalny zestaw adresów, z których niektóre należy zablokować a niektóre przepuścić. Ponieważ już zaczęliśmy blokować zakresy adresów prywatnych które docierają do interfejsu tun0, zajmijmy się resztą:

block in quick on tun0 from 192.168.0.0/16 to any
block in quick on tun0 from 172.16.0.0/12 to any
block in quick on tun0 from 10.0.0.0/8 to any
block in quick on tun0 from 127.0.0.0/8 to any
block in quick on tun0 from 0.0.0.0/8 to any
block in quick on tun0 from 169.254.0.0/16 to any
block in quick on tun0 from 192.0.2.0/24 to any
block in quick on tun0 from 204.152.64.0/23 to any
block in quick on tun0 from 224.0.0.0/3 to any
pass  in       all

Widziałeś już pierwsze trzy reguły, ale nie resztę. Czwarta wskazuje klasę A, w większości zmarnowaną, a używaną głównie na pętle zwrotne. Wiele oprogramowania komunikuje się ze sobą przez adres 127.0.0.1, więc zablokowanie tego adresu przy połączeniach z zewnątrz to też dobry pomysł. Piąta linia, 0.0.0.0/8 nigdy nie powinna znaleźć się w Internecie. Większość stosów IP traktuje 0.0.0.0/32 jako domyślną bramę, a reszta sieci 0.*.*.* jest traktowana na różne dziwne sposoby, co wynika ze sposobu w jaki podejmowane są decyzję o routingu. Powinieneś traktować 0.0.0.0/8 tak jak 127.0.0.0/8. 169.254.0.0/16 zostało przydzielone przez IANA do użytku w procesie auto-konfiguracji, kiedy system nie otrzymał jeszcze adresu IP z serwera DHCP lub podobnego. Należy zwrócić uwagę, że w szczególności Microsoft Windows będą używać adresów z tego zasięgu gdy ustawione są na używanie DHCP a nie były w stanie znaleźć do tej pory serwera DHCP. 192.0.2.0/24 został również zarezerwowany dla użytku autorów dokumentacji jako przykład dzielenia na bloki. Celowo nie używamy tego zakresu, ponieważ mógłby on spowodować zamieszanie gdybyś je zablokował; wszystkie nasze przykłady używają adresów 20.20.20.0/24. 204.152.64.0/23 to blok zarezerwowany przez Sun Microsystems dla prywatnych połączeń klastrów, i zablokowanie go pozostawiamy tobie pod rozwagę. Na koniec, 224.0.0.0/3 wycina klasy D i E sieci, która używana jest głównie do ruchu multicastowego ( rozgłaszania ). Dokładniejsze definicje `klasy E' możecie znaleźć w RFC 1166.

Istnieje bardzo ważna zasada w filtrowaniu pakietów, która była odraczana do momentu omówienia blokowania sieci i brzmi ona: w momencie gdy wiesz, że określony typ danych dociera z określonych miejsc, konfigurujesz system by zezwolić tylko na ruch tego typu danych z tych określonych źródeł. W przypadku klasy nieroutowalnej, wiesz że nic z 10.0.0.0/8 nie powinno docierać do ciebie przez tun0, ponieważ nie masz żadnego sposobu by na niego odpowiedzieć. Jest to pakiet nielegalny. Tak samo należy traktować inne nieroutowalne adresy, jak również 127.0.0.0/8.

Wiele oprogramowania, dokonuje uwierzytelniania na podstawie źródłowego adresu IP. Jeśli posiadasz sieć wewnętrzną, powiedzmy 20.20.20.0/24, wiesz że cały ruch dla tej sieci może wychodzić przez lokalny ethernet. Gdyby pakiet z 20.20.20.0/24 dotarł przez połączenie PPP, jest absolutnie sensownym zrzucić go na podłogę, albo umieścić w ciemnym pokoju przesłuchań. Nie powinien w żaden sposób móc osiągnąć swojego celu. Możesz to osiągnąć stosując to co już wiesz o IPF. Nowy zestaw reguł wyglądać będzie tak:

block in quick on tun0 from 192.168.0.0/16 to any
block in quick on tun0 from 172.16.0.0/12 to any
block in quick on tun0 from 10.0.0.0/8 to any
block in quick on tun0 from 127.0.0.0/8 to any
block in quick on tun0 from 0.0.0.0/8 to any
block in quick on tun0 from 169.254.0.0/16 to any
block in quick on tun0 from 192.0.2.0/24 to any
block in quick on tun0 from 204.152.64.0/23 to any
block in quick on tun0 from 224.0.0.0/3 to any
block in quick on tun0 from 20.20.20.0/24 to any
pass  in       all

2.7 Filtrowanie dwukierunkowe; Słowo kluczowe `out'

Do tej pory przepuszczaliśmy lub blokowaliśmy ruch przychodzący. By wyjaśnić, ruch przychodzący to cały ruch, który dociera do ściany ogniowej na dowolnym interfejsie. Analogicznie, ruch wychodzący to cały ruch, który ma zamiar opuścić interfejs ściany ogniowej ( obojętnie czy wygenerowany lokalnie czy tylko przekazywany ). Oznacza to, że wszystkie pakiety są filtrowanie nie tylko gdy docierają do ściany ogniowej, ale również w momencie jej opuszczania. W związku z tym implikuje to komendę `pass out all', która może lub może nie być pożądana. Tak samo jak możesz przepuszczać lub blokować ruch wchodzący, możesz robić to samo z ruchem wychodzącym.

Teraz gdy wiemy że istnieje sposób by filtrować zarówno ruch wychodzący jak i wchodzący, sami musimy znaleźć sensowne zastosowanie dla czegoś takiego. Jednym z możliwych pomysłów, jest powstrzymywanie sfałszowanych ( ang. spoofed ) pakietów przed wchodzeniem do Twojej sieci. Zamiast wypuszczać na ruterze cały ruch, ograniczymy go tylko do pakietów pochodzących z 20.20.20.0/24. Możesz to zrobić w ten sposób:

pass  out quick on tun0 from 20.20.20.0/24 to any
block out quick on tun0 from any to any

Jeśli pakiet przyjdzie z 20.20.20.1/32, zostanie przepuszczony przez pierwszą regułę. Jeśli pakiet przyjdzie z 1.2.3.4/32, zostanie zablokowany przez regułę drugą.

Możesz również wykonać podobne reguły dla adresów nieroutowalnych. Jeśli jakaś maszyna próbuje skierować pakiet przez IPF do 192.168.0.0/16, dlaczego by go nie odrzucić? Najgorsze co może się stać to to, że zaoszczędzisz trochę przepustowości:

block out quick on tun0 from any to 192.168.0.0/16
block out quick on tun0 from any to 172.16.0.0/12
block out quick on tun0 from any to 10.0.0.0/8
block out quick on tun0 from any to 0.0.0.0/8
block out quick on tun0 from any to 127.0.0.0/8
block out quick on tun0 from any to 169.254.0.0/16
block out quick on tun0 from any to 192.0.2.0/24
block out quick on tun0 from any to 204.152.64.0/23
block out quick on tun0 from any to 224.0.0.0/3
block out quick on tun0 from !20.20.20.0/24 to any

Z najbardziej ograniczonego punktu widzenia, zapis ten nie rozszerza Twojego bezpieczeństwa. Rozszerza natomiast bezpieczeństwo wszystkich innych i jest generalnie miłą rzeczą do zrobienia. Z drugiej strony, ktoś może stwierdzić, że skoro nie może rozsyłać sfałszowanych pakietów przez Twoją sieć, masz mniejsze znaczenie jako punkt przekaźnikowy dla cracker'ów i w związku z tym prawdopodobieństwo, że staniesz się celem ataku maleje.

Prawdopodobnie znajdziesz wiele sposobów użycia blokowania pakietów wychodzących. Jedną z rzeczy o których zawsze należy pamiętać, to fakt, że `in' i `out' są kierunkami odnoszącymi się do ściany ogniowej, nigdy w stosunku do dowolnej innej maszyny.

2.8 Logowanie tego co się dzieje; Słowo kluczowe `log'

Do tego momentu, całe blokowanie i przepuszczanie pakietów odbywało się w całkowitej ciszy. Zwykle chcesz jednak wiedzieć, że jesteś atakowany, a nie zastanawiać się czy ta ściana ogniowa w ogóle Ci coś daje. Podczas gdy nie logowałbym każdego pakietu który został przepuszczony i w niektórych przypadkach wszystkich blokowanych pakietów, chciałbym wiedzieć parę rzeczy o blokowanych pakietach z 20.20.20.0/24. By to wykonać, dodajemy słowo kluczowe `log':

block in     quick on tun0 from 192.168.0.0/16 to any
block in     quick on tun0 from 172.16.0.0/12 to any
block in     quick on tun0 from 10.0.0.0/8 to any
block in     quick on tun0 from 127.0.0.0/8 to any
block in     quick on tun0 from 0.0.0.0/8 to any
block in     quick on tun0 from 169.254.0.0/16 to any
block in     quick on tun0 from 192.0.2.0/24 to any
block in     quick on tun0 from 204.152.64.0/23 to any
block in     quick on tun0 from 224.0.0.0/3 to any
block in log quick on tun0 from 20.20.20.0/24 to any
pass  in       all

Do tej pory ściana ogniowa robi dobrą robotę blokując pakiety nadchodzące z podejrzanych miejsc, ale jest jeszcze trochę do zrobienia. Jedną z rzeczy o którą powinniśmy zadbać, jest by pakiety do 20.20.20.0/32 i 20.20.20.255/32 były zrzucane na podłogę. Jeśli tego nie zrobimy, otwieramy naszą sieć na atak typu smurf. Te dwie linie zabezpieczą naszą hipotetyczną sieć przed użyciem jako przekaźnik smurf:

block in log quick on tun0 from any to 20.20.20.0/32
block in log quick on tun0 from any to 20.20.20.255/32

Dodanie tych linijek, doprowadza nas do zestawu reguł wyglądającego mniej więcej tak:

block in     quick on tun0 from 192.168.0.0/16 to any
block in     quick on tun0 from 172.16.0.0/12 to any
block in     quick on tun0 from 10.0.0.0/8 to any
block in     quick on tun0 from 127.0.0.0/8 to any
block in     quick on tun0 from 0.0.0.0/8 to any
block in     quick on tun0 from 169.254.0.0/16 to any
block in     quick on tun0 from 192.0.2.0/24 to any
block in     quick on tun0 from 204.152.64.0/23 to any
block in     quick on tun0 from 224.0.0.0/3 to any
block in log quick on tun0 from 20.20.20.0/24 to any
block in log quick on tun0 from any to 20.20.20.0/32
block in log quick on tun0 from any to 20.20.20.255/32
pass  in       all

2.9 Kompletne filtrowanie dwukierunkowe według interfejsu

Do tej pory przedstawialiśmy jedynie fragmenty kompletnego zestawu reguł. W momencie gdy tworzysz swój zestaw, powinieneś utworzyć reguły dla każdego kierunku i interfejsu. Domyślnie ipfilter przepuszcza wszystkie pakiety . Jest to sytuacja analogiczna do tej, w której istnieje niewidoczna reguła na początku która brzmi `pass in all' i `pass out all'. Zamiast polegać na domyślnym zachowaniu, zadbaj by wszystko było tak dokładne i konkretne jak to możliwe, interfejs po interfejsie, do momentu w którym każda ewentualność zostanie rozpatrzona.

Zaczniemy od interfejsu lo0, który będzie pracował bez ograniczeń. Ponieważ istnieją programy rozmawiające z innymi na systemach lokalnych, zezwalamy na to i utrzymujemy ten stan bez żadnych restrykcji:

pass out quick on lo0
pass in  quick on lo0

Następny jest interfejs xl0. Później będziemy nakładać ograniczenia na interfejs xl0, ale na początek zaczniemy tak jakby wszystko w naszej sieci lokalnej było warte zaufania i damy interfejsowi dokładnie to samo co w przypadku lo0:

pass out quick on xl0
pass in  quick on xl0

Na koniec, jest również interfejs tun0, który do tej pory filtrowaliśmy tylko połowicznie:

block out quick on tun0 from any to 192.168.0.0/16
block out quick on tun0 from any to 172.16.0.0/12
block out quick on tun0 from any to 127.0.0.0/8
block out quick on tun0 from any to 10.0.0.0/8
block out quick on tun0 from any to 0.0.0.0/8
block out quick on tun0 from any to 169.254.0.0/16
block out quick on tun0 from any to 192.0.2.0/24
block out quick on tun0 from any to 204.152.64.0/23
block out quick on tun0 from any to 224.0.0.0/3
pass  out quick on tun0 from 20.20.20.0/24 to any
block out quick on tun0 from any to any

block in     quick on tun0 from 192.168.0.0/16 to any
block in     quick on tun0 from 172.16.0.0/12 to any
block in     quick on tun0 from 10.0.0.0/8 to any
block in     quick on tun0 from 127.0.0.0/8 to any
block in     quick on tun0 from 0.0.0.0/8 to any
block in     quick on tun0 from 169.254.0.0/16 to any
block in     quick on tun0 from 192.0.2.0/24 to any
block in     quick on tun0 from 204.152.64.0/23 to any
block in     quick on tun0 from 224.0.0.0/3 to any
block in log quick on tun0 from 20.20.20.0/24 to any
block in log quick on tun0 from any to 20.20.20.0/32
block in log quick on tun0 from any to 20.20.20.255/32
pass  in     all

Mamy już dosyć dużo filtrowania, zabezpieczamy sieć 20.20.20.0/24 przed fałszowaniem pakietów i przed używaniem do fałszowania pakietów. Kolejne przykłady będą oparte na jednostronnym podejściu, ale miej na uwadze że to tylko dla jasności, a kiedy będziesz konfigurował swój własny zestaw reguł, musisz dodawać reguły dla każdego kierunku i interfejsu.

2.10 Kontrolowanie konkretnych protokołów; Słowo kluczowe `proto'

Ataki Odmowy Usługi ( ang. Denial of Service lub DoS ) są równie częste co exploity związane z przepełnieniem bufora ( ang. buffer overflow ). Wiele ataków DoS związanych jest z zawiłościami stosu TCP/IP systemu operacyjnego. Często, sprowadzało się to do pakietów ICMP. Dlaczego nie zablokować ich w ogóle?

block in log quick on tun0 proto icmp from any to any

W tym momencie każdy pakiet ICMP nadchodzący przez tun0 będzie logowany i odrzucany.

2.11 Filtrowanie ICMP z użyciem słowa kluczowego `icmp-type'; Łączenie zestawów reguł

Oczywiście, odrzucanie całego ruchu ICMP nie jest idealną sytuacją. Dlaczego nie? Ponieważ lepiej i użyteczniej jest, gdy na ruch pakietów tego protokółu zezwalamy przynajmniej po części. Zapewne zatem będziesz chciał przepuszczać pewne rodzaje ruchu ICMP a odrzucać inne. Jeśli chcesz by działały traceroute i ping, musisz przepuszczać pakiety ICMP typu 0 i 11. Dokładnie rzecz biorąc, nie jest to dobry pomysł, ale jeśli potrzebujesz wyważyć bezpieczeństwo z jednej strony i wygodę z drugiej, IPF pozwoli ci to zrobić:

pass in quick on tun0 proto icmp from any to 20.20.20.0/24 icmp-type 0
pass in quick on tun0 proto icmp from any to 20.20.20.0/24 icmp-type 11

Pamiętaj, że kolejność w zestawie reguł jest ważna. Ponieważ każda z reguł ma słowo `quick', musimy umieścić reguły przepuszczające ( pass ) przed blokującymi ( block ), więc tak naprawdę ostatnie trzy reguły powinny się znaleźć w pliku konfiguracyjnym w tej kolejności:

pass  in     quick on tun0 proto icmp from any to 20.20.20.0/24 icmp-type 0
pass  in     quick on tun0 proto icmp from any to 20.20.20.0/24 icmp-type 11
block in log quick on tun0 proto icmp from any to any

Dodanie tych trzech reguł do tych, które zabezpieczają przed fałszowaniem pakietów może być trochę kłopotliwe. Jednym z błędów może być włączenie nowych reguł ICMP na początku:

pass  in     quick on tun0 proto icmp from any to 20.20.20.0/24 icmp-type 0
pass  in     quick on tun0 proto icmp from any to 20.20.20.0/24 icmp-type 11
block in log quick on tun0 proto icmp from any to any
block in     quick on tun0 from 192.168.0.0/16 to any
block in     quick on tun0 from 172.16.0.0/12 to any
block in     quick on tun0 from 10.0.0.0/8 to any
block in     quick on tun0 from 127.0.0.0/8 to any
block in     quick on tun0 from 0.0.0.0/8 to any
block in     quick on tun0 from 169.254.0.0/16 to any
block in     quick on tun0 from 192.0.2.0/24 to any
block in     quick on tun0 from 204.152.64.0/23 to any
block in     quick on tun0 from 224.0.0.0/3 to any
block in log quick on tun0 from 20.20.20.0/24 to any
block in log quick on tun0 from any to 20.20.20.0/32
block in log quick on tun0 from any to 20.20.20.255/32
pass  in       all

Problem polega na tym, że pakiet ICMP typu 0 z 192.168.0.0/16 zostanie przepuszczony przez pierwszą regułę i nie zostanie zablokowany przez regułę czwartą. Również, ponieważ używamy ICMP ECHO_REPLY (typ 0) by przepuścić pakiety do 20.20.20.0/24, z dołączonym słowem `quick', otworzyliśmy się właśnie z powrotem na atak typu smurf, negując ostatnie dwie reguły blokujące. Ups. By temu zapobiec, ustawimy reguły dotyczące ICMP po regułach zabezpieczających przez fałszowaniem pakietów:

block in     quick on tun0 from 192.168.0.0/16 to any
block in     quick on tun0 from 172.16.0.0/12 to any
block in     quick on tun0 from 10.0.0.0/8 to any
block in     quick on tun0 from 127.0.0.0/8 to any
block in     quick on tun0 from 0.0.0.0/8 to any
block in     quick on tun0 from 169.254.0.0/16 to any
block in     quick on tun0 from 192.0.2.0/24 to any
block in     quick on tun0 from 204.152.64.0/23 to any
block in     quick on tun0 from 224.0.0.0/3 to any
block in log quick on tun0 from 20.20.20.0/24 to any
block in log quick on tun0 from any to 20.20.20.0/32
block in log quick on tun0 from any to 20.20.20.255/32
pass  in     quick on tun0 proto icmp from any to 20.20.20.0/24 icmp-type 0
pass  in     quick on tun0 proto icmp from any to 20.20.20.0/24 icmp-type 11
block in log quick on tun0 proto icmp from any to any
pass  in       all

Ponieważ blokujemy ruch sfałszowany zanim zajmujemy się pakietami typu ICMP, pakiety sfałszowane nigdy nie docierają do zestawu reguł ICMP. Bardzo ważne jest pamiętanie o takich rzeczach podczas łączenia zestawów reguł.

2.12 Porty TCP i UDP; Słowo kluczowe `port'

Ponieważ zaczęliśmy już blokować pakiety na podstawie protokołu, możemy również zacząć blokować pakiety na podstawie specyficznych cech każdego z nich. Najczęściej używa się numeru portu. Usługi takie jak rsh, rlogin i telnet są bardzo przydatne, ale również bardzo niebezpieczne jeśli chodzi o podsłuchiwanie ( ang. sniffing ) i fałszowanie. Można oczywiście pójść na kompromis i zezwolić na używanie tych usług w sieci wewnętrznej a zablokować przy wychodzeniu na zewnątrz. Można to osiągnąć w prosty sposób, ponieważ rlogin, rsh i telnet używają określonych portów TCP (odpowiednio 513, 514 i 23). W związku z tym stworzenie reguł, które te usługi zablokują jest proste:

block in log quick on tun0 proto tcp from any to 20.20.20.0/24 port = 513
block in log quick on tun0 proto tcp from any to 20.20.20.0/24 port = 514
block in log quick on tun0 proto tcp from any to 20.20.20.0/24 port = 23

Upewnij się, że wszystkie trzy znajdują się przed regułą `pass in all', dzięki czemu zamkną sieć od zewnątrz ( część reguł odpowiadająca za ochronę przed fałszowaniem pomijam dla jasności ):

pass  in     quick on tun0 proto icmp from any to 20.20.20.0/24 icmp-type 0
pass  in     quick on tun0 proto icmp from any to 20.20.20.0/24 icmp-type 11
block in log quick on tun0 proto icmp from any to any
block in log quick on tun0 proto tcp from any to 20.20.20.0/24 port = 513
block in log quick on tun0 proto tcp from any to 20.20.20.0/24 port = 514
block in log quick on tun0 proto tcp from any to 20.20.20.0/24 port = 23
pass  in     all

Możesz również chcieć zablokować porty 514/udp ( syslog ), 111/tcp i 111/udp ( portmap ), 515/tcp ( lpd ), 2049/tcp i 2049/udp ( NFS ), 6000/tcp ( X11 ) i tak dalej. Możesz uzyskać pełną listę portów na których aktualnie nasłuchujesz używając polecenia netstat -a ( lub lsof -i, jeśli masz go zainstalowanego ).

Blokowanie UDP zamiast TCP sprowadza się do zastąpienia `proto tcp' przez `proto udp'. Reguła dla syslog'a wyglądałaby następująco:

block in log quick on tun0 proto udp from any to 20.20.20.0/24 port = 514

IPF ma również skrótowy sposób zapisu w przypadku gdy chodzi o `proto tcp' jak i proto udp jednocześnie, tak jak w przypadku portmap i NFS. Reguła dla portmap'a wyglądałaby tak:

block in log quick on tun0 proto tcp/udp from any to 20.20.20.0/24 port = 111

Czytaj dalej >>>





Artykuł jest z FreeBSD na www.malisz.eu.org
http://www.malisz.eu.org/

Adres tego artykułu to:
http://www.malisz.eu.org/9_IPFilter_1.htm