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 >>>