IPFilter cz.3
Data: 30-09-2003 o godz. 22:45:21
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ą.

7.2 Narzędzie ipmon

ipfstat jest fajny jeśli chodzi o sprawdzenie aktualnego stanu systemu, ale zwykle chcemy mieć również jakiś log, by oglądać wydarzenia dziejące się w czasie. Służy do tego ipmon. Jest on zdolny do sprawdzania logów pakietów ( tworzonych przez słowo kluczowe log w regułach ), logu tabeli stanów i logu NAT, lub dowolnej kombinacji tych trzech. Narzędzie to może pracować zarówno na pierwszym planie, lub jako demon który loguje informacje do syslog lub pliku. Jeśli chcielibyśmy zobaczyć listę stanów w akcji, użyjemy polecenia `ipmon -o S':

# ipmon -o S
01/08/1999 15:58:57.836053 STATE:NEW 100.100.100.1,53 -> 20.20.20.15,53 PR udp
01/08/1999 15:58:58.030815 STATE:NEW 20.20.20.15,123 -> 128.167.1.69,123 PR udp
01/08/1999 15:59:18.032174 STATE:NEW 20.20.20.15,123 -> 128.173.14.71,123 PR udp
01/08/1999 15:59:24.570107 STATE:EXPIRE 100.100.100.1,53 -> 20.20.20.15,53 PR udp Pkts 4 Bytes 356
01/08/1999 16:03:51.754867 STATE:NEW 20.20.20.13,1019 -> 100.100.100.10,22 PR tcp
01/08/1999 16:04:03.070127 STATE:EXPIRE 20.20.20.13,1019 -> 100.100.100.10,22 PR tcp Pkts 63 Bytes 4604

Widzimy zapytanie DNS z zewnętrznej maszyny do naszego serwera, dwa pingi xntp do dobrze znanych serwerów czasu i połączenie wychodzące ssh które trwało bardzo krótko.

ipmon jest również w stanie pokazać nam jakie pakiety są logowane. Na przykład, kiedy używamy stanów, często spotkasz pakiety takie jak ten:

# ipmon -o I
15:57:33.803147 ppp0 @0:2 b 100.100.100.103,443 -> 20.20.20.10,4923 PR tcp len 20 1488 -A

Co to oznacza? Pierwsze pole to oczywiście stempel czasu. Drugie jest również raczej oczywiste, to interfejs na którym wydarzyło sie zdarzenie. Trzecie pole @0:2 to coś, co ludzie zwykle pomijają. To oznaczenie reguły która spowodowała zdarzenie. Pamiętasz `ipfstat -in'? Jeśli chciałbyś wiedzieć co spowodowało zalogowanie pakietu, powinieneś obejrzeć regułę 2 w grupie 0. Czwarte pole, małe `b' mówi że pakiet został zablokowany, i generalnie będziesz to ignorował, chyba że logujesz również pakiety które przepuszczasz, co spowoduje pokazanie się literki `p'. Piąte i szóste pole nie wymagają chyba wyjaśnienia - mówią skąd pakiet przyszedł i gdzie miał dotrzeć. Siódme ( PR ) i ósme pole to protokół, a dziewiąte długość pakietu. Ostatnia część, `-A' to flagi które były ustawione; ten pakiet ma ustawioną flagę ACK. Dlaczego wspomniałem na początku stany? Ponieważ często w Internecie zdarzają się lagi, pakiety są regenerowane i czasami dostaniesz dwa takie same, co spowoduje stwierdzenie przez kod odpowiedzialny za śledzenie połączeń, że to pakiet należący do innego połączenia. Być może trafi on na regułę. Zwykle zobaczysz tutaj zalogowany ostatni pakiet sesji, ponieważ kod `keep state' wyrzuci połączenie zanim ostatni pakiet będzie miał szansę dotrzeć do Twojej ściany ogniowej. To normalne zachowanie, nie denerwuj się. Innym przykładem pakietu może być:

12:46:12.470951 xl0 @0:1 S 20.20.20.254 -> 255.255.255.255 PR icmp len 20 9216 icmp 9/0

Jest to broadcast rozpoznawczy ICMP routera. Możemy to stwierdzić na podstawie typu ICMP: 9/0.

ipmon pozwala również na obejrzenie tabeli NAT:

# ipmon -o N
01/08/1999 05:30:02.466114 @2 NAT:RDR 20.20.20.253,113 <- -> 20.20.20.253,113 [100.100.100.13,45816]
01/08/1999 05:30:31.990037 @2 NAT:EXPIRE 20.20.20.253,113 <- -> 20.20.20.253,113 [100.100.100.13,45816] Pkts 10 Bytes 455

Widzimy tu przekierowanie do serwera identd, który oszukuje twierdząc, że udostępnia usługę ident dla maszyn za naszym NATem, ponieważ zwykle nie mogą one sobie same zapewnić tej usługi przy zwykłym NATcie.

8. Specyficzne zastosowania Filtra IP - rzeczy które nie pasowały wyżej, ale są warte wspomnienia

8.1 Utrzymywanie stanu oraz flagi i serwery

Utrzymywanie stanu jest fajną sprawą, ale bardzo łatwo jest popełnić błąd decydując w którą stronę będziemy to robić. Generalnie, będziesz chciał ustawić słowo kluczowe `keep state' przy pierwszej regule która wchodzi w interakcję z pakietami inicjującymi dany rodzaj połączenia. Jednym z najczęściej spotykanych błędów jest, w momencie łączenia śledzenia stanów z filtrowaniem według flag, jest tak jak poniżej:

block in all
pass in quick proto tcp from any to 20.20.20.20/32 port = 23 flags S
pass out all keep state

Reguły wyraźnie umożliwiają tworzenie połączeń do serwera telnetu pod adresem 20.20.20.20 i odsyłanie odpowiedzi ze strony serwera. Jednak gdy spróbujesz użyć tych reguł, zadziałają ale na krótko. Ponieważ wpuszczamy tylko pakiety z ustawioną flagą SYN, pozycja w tabeli stanów nigdy nie zostanie dokończona, i po przekroczeniu domyślnego czasu na ustanowienie połączenia ( 60 sekund ) połączenie zostanie zamknięte.

Możemy rozwiązać ten problem, przepisując reguły na jeden z dwóch sposobów:

block in all
pass in quick proto tcp from any to 20.20.20.20/32 port = 23 keep state
block out all

lub:

block in all
pass in quick proto tcp from any to 20.20.20.20/32 port = 23 flags S keep state
pass out all keep state

Obie możliwości spowodują, że będzie możliwe nawiązanie pełnego połączenia oraz zapisanie go w tabeli stanów.

8.2 Radzenie sobie z FTP

FTP to jeden z protokołów, przy którym siadasz i zaczynasz się zastanawiać `Co do cholery oni sobie myśleli?'. FTP ma wiele problemów z którymi administrator musi sobie poradzić. Co gorsza, problemy które administrator musi rozwiązać są różne dla klientów FTP i serwera FTP.

W obrębie protokołu FTP wyróżnia się dwa tryby transferu - aktywny i pasywny. Aktywny to ten, w którym serwer łączy się z otwartym portem na komputerze klienta i wysyła dane. Analogicznie, pasywny to taki, w którym to klient łączy się na otwarty port serwera i odbiera dane.

Konfiguracja dla serwera FTP

Jeśli chodzi o obsłużenie aktywnych sesji FTP, zadanie jest proste. Jednocześnie skonfigurowanie obsługi pasywnych sesji FTP będzie dużym problemem. Najpierw zajmiemy się aktywnym FTP, później pasywnym. Generalnie, obsłużymy aktywne FTP tak jak przychodzące połączenia HTTP czy SMTP; po prostu otworzymy port ftp i pozwolimy regule z `keep state' zrobić swoje:

pass in quick proto tcp from any to 20.20.20.20/32 port = 21 flags S keep state
pass out proto tcp all keep state

Powyższe reguły umożliwią nawiązywanie aktywnych połączeń FTP do Twojego serwera pod adresem 20.20.20.20.

Kolejnym wyzwaniem będzie obsłużenie pasywnego FTP. Standardowo tak działają przeglądarki WWW, więc staje się to dosyć popularne i powinniśmy pomyśleć o tym poważnie. Problemem jest to, że dla każdego połączenia pasywnego, serwer musi zacząć nasłuchiwać na jakimś nowym porcie ( zwykle powyżej portu numer 1023 ). Jest to coś w rodzaju tworzenia nowej usługi na serwerze. Zakładając że mamy dobrą ścianę ogniową, z domyślną zasadą blokowania, dostęp do tej nowej usługi ( otwartego portu ) zostanie zablokowany, a więc aktywne FTP nie będzie działało. Ale nie rozpaczaj. Jest nadzieja.

Pierwszym co mogłaby zrobić osoba próbująca rozwiązać ten problem, to otworzenie wszystkich portów powyżej 1023. Tak naprawdę, to zadziała:

pass in quick proto tcp from any to 20.20.20.20/32 port > 1023 flags S keep state
pass out proto tcp all keep state

Jest to jednak mało satysfakcjonujące. Przez przepuszczenie wszystkiego na porty powyżej 1023, tak naprawdę otwieramy się na wiele potencjalnych problemów. O ile porty 1-1023 zaprojektowano dla usług serwerowych, wiele programów używa portów wyższych niż 1023, na przykład nfsd czy Xy.

Dobre wiadomości są takie, że to twój serwer FTP decyduje, które porty zostaną otworzone by obsłużyć pasywne połączenie ftp. Oznacza to, że zamiast otwierać wszystkie porty powyżej 1023, możesz wybrać na przykład porty 15001-19999 na porty ftp i otwierać tylko ten zakres na swojej ścianie ogniowej. W przypadku serwera wu-ftpd, wykonuje się to przez dodanie do pliku ftpaccess opcji passive ports. Proszę, sprawdź szczegóły przez wywołanie strony podręcznikowej do pliku ftpaccess. Ze strony ipfilter, wszystko co musimy zrobić to dokonfigurować następujące reguły:

pass in quick proto tcp from any to 20.20.20.20/32 port 15000 >< 20000 flags S keep state
pass out proto tcp all keep state

Jeśli Cię to nie satysfakcjonuje, zawsze możesz dodać obsługę IPF w twoim serwerze FTP, lub odwrotnie.

Konfiguracja dla klientów FTP

O ile obsługa serwerów FTP jest jeszcze w IPF daleka od doskonałości, obsługa klientów FTP działa dobrze od wersji 3.3.3. Tak samo jak w przypadku serwerów FTP, mamy dwa rodzaje połączeń - pasywne i aktywne.

Najprostszym trybem z punktu widzenia ściany ogniowej jest tryb pasywny. Zakładając, że stosujesz reguły z `keep state' dla wychodzących połączeń tcp, połączenia pasywne będą działały bez dalszych zabiegów. Jeśli jeszcze tego nie robisz, zastanów się nad poniższym:

pass out proto tcp all keep state

Drugi typ ruchu, aktywny, jest trochę bardziej problematyczny, ale również rozwiązany. Transfery aktywne otwierają na serwerze port dla przepływu danych do klienta.

Jest to normalnie problematyczne jeśli pośrodku istnieje ściana ogniowa, powstrzymująca połączenia wychodzące przed wracaniem. By to rozwiązać, ipfilter zawiera proxy ipnat, które tymczasowo otwiera dziurę w ścianie ogniowej po to by serwer FTP mógł przekazać dane klientowi. Nawet jeśli nie używasz ipnat, proxy będzie działało. Poniższe reguły to minimum tego co musisz dodać do konfiguracji ipnat ( ep0 powinieneś zamienić na nazwę interfejsu który podłączony jest do sieci zewnętrznej):

map ep0 0/0 -> 0/32 proxy port 21 ftp/tcp

Po więcej detali dotyczących proxy ipfilter, wróć do sekcji Magia ukryta w NAT; proxy aplikacji. Dodatkowo, proxy ftp działa w `złą stronę' i może zostać użyte do obsługi serwera FTP za NATem, ale nie chcesz tego robić ze względów bezpieczeństwa. Naprawdę. To wielka dziura. Zajrzyj pod adres http://www.false.net/ipfilter/2001_11/0273.html by zobaczyć jak to naprawdę wygląda i dlaczego powinieneś o tym zapomnieć.

8.3 Zmienne kernela dotyczące tematu

Istnieje trochę rzeczy w kernelu, które albo muszą być ustawione by ipf działał, albo generalnie dobrze jest wiedzieć o ich istnieniu przy budowaniu ścian ogniowych. Pierwsza podstawowa rzecz to włączenie przekazywania IP, ponieważ w innym przypadku ipf będzie mógł zrobić niewiele, ponieważ stos IP nie będzie routować pakietów.

IP Forwarding:

OpenBSD:

net.inet.ip.forwarding=1

FreeBSD:

net.inet.ip.forwarding=1

NetBSD:

net.inet.ip.forwarding=1

Solaris:

ndd -set /dev/ip ip_forwarding 1

Zmiany dotyczące ustawień portów:

OpenBSD:

net.inet.ip.portfirst = 25000

FreeBSD:

net.inet.ip.portrange.first = 25000
net.inet.ip.portrange.last = 49151

NetBSD:

net.inet.ip.anonportmin = 25000
net.inet.ip.anonportmax = 49151

Solaris:

ndd -set /dev/tcp tcp_smallest_anon_port 25000
ndd -set /dev/tcp tcp_largest_anon_port 65535

Inne użyteczne wartości:

OpenBSD:

net.inet.ip.sourceroute = 0
net.inet.ip.directed-broadcast = 0

FreeBSD:

net.inet.ip.sourceroute=0
net.ip.accept_sourceroute=0

NetBSD:

net.inet.ip.allowsrcrt=0
net.inet.ip.forwsrcrt=0
net.inet.ip.directed-broadcast=0
net.inet.ip.redirect=0

Solaris:

ndd -set /dev/ip ip_forward_directed_broadcasts 0
ndd -set /dev/ip ip_forward_src_routed 0
ndd -set /dev/ip ip_respond_to_echo_broadcast 0

Dodatkowo, FreeBSD ma pewne dodatkowe zmienne sysctl:

net.inet.ipf.fr_flags: 0
net.inet.ipf.fr_pass: 514
net.inet.ipf.fr_active: 0
net.inet.ipf.fr_tcpidletimeout: 864000
net.inet.ipf.fr_tcpclosewait: 60
net.inet.ipf.fr_tcplastack: 20
net.inet.ipf.fr_tcptimeout: 120
net.inet.ipf.fr_tcpclosed: 1
net.inet.ipf.fr_udptimeout: 120
net.inet.ipf.fr_icmptimeout: 120
net.inet.ipf.fr_defnatage: 1200
net.inet.ipf.fr_ipfrttl: 120
net.inet.ipf.ipl_unreach: 13
net.inet.ipf.ipl_inited: 1
net.inet.ipf.fr_authsize: 32
net.inet.ipf.fr_authused: 0
net.inet.ipf.fr_defaultauthage: 600

9. Zabawa z ipf!

Ta sekcja być może nie nauczy Cię niczego nowego o ipf, ale może podjąć parę problemów do których sam jeszcze nie doszedłeś, lub skierować twój mózg w stronę wynalezienia czegoś interesującego o czym nie pomyśleliśmy.

9.1 Filtrowanie localhost

Dawno dawno temu, w bardzo dalekim uniwersytecie, Wietse Venema stworzył paczkę tcp-wrapper i odtąd, była ona dodawana jako dodatkowa warstwa ochronna do usług sieciowych na całym świecie. Bardzo fajna sprawa. Ale, tcp-wrappers mają problemy. Na początek, chronią tylko usługi TCP jak sugeruje nazwa. Po drugie, chronią tylko usługi uruchamiane z poziomu inetd lub po skompilowaniu programu z biblioteką libwrap. Powoduje to gigantyczne dziury w bezpieczeństwie twojej maszyny. Możemy je zakryć, przez użycie ipf w stosunku do lokalnej maszyny. Na przykład, mój laptop jest często podłączany bezpośrednio, lub wdzaniam się do sieci którym niezbyt ufam, a w związku z tym używam poniższego zestawu reguł:

pass in quick on lo0 all
pass out quick on lo0 all

block in log all
block out all

pass in quick proto tcp from any to any port = 113 flags S keep state
pass in quick proto tcp from any to any port = 22 flags S keep state
pass in quick proto tcp from any port = 20 to any port 39999 >< 45000 flags S keep state
pass out quick proto icmp from any to any keep state
pass out quick proto tcp/udp from any to any keep state keep frags

Wyglądały one tak już od dłuższego czasu i nie dotykały mnie żadne problemy w związku z tym, że używałem załadowanego na stałe ipf. Jeśli chciałem uszczelnić je jeszcze bardziej, mogłem zacząć stosować proxy FTP przez NAT i dodać trochę reguł by zabezpieczyć się przed preparowaniem pakietów. Ale tak skonfigurowany komputer jest dużo bardziej restrykcyjny w stosunku do sieci lokalnej niż zwykły komputer. Są one dobre w sytuacji, gdy masz maszynę która ma masę użytkowników, a chcesz być pewien, że żaden z nich nie uruchomi żadnej usługi której nie powinien. Nie zatrzyma to złośliwego hackera z dostępem do konta root'a przed poprawką w twoich regułach ipf i wystartowaniem usługi, ale powstrzyma większość ludzi, zapewni bezpieczeństwo twoim usługom nawet w podejrzanej sieci lokalnej. Duże zwycięstwo, moim zdaniem. Używanie filtrowania w odniesieniu do lokalnej maszyny, w połączeniu z mniej restryktywną `główną ścianą ogniową' może rozwiązać wiele problemów wydajnościowych, jak również wiele politycznych koszmarów w stylu `Dlaczego nie działa ICQ?', albo `Dlaczego nie mogę uruchomić serwera WWW na mojej stacji roboczej? To przecież MOJA STACJA!!'. Kolejne zwycięstwo. Kto powiedział, że nie możemy zapewnić bezpieczeństwa i wygody jednocześnie?

Jaka ściana ogniowa? Filtrowanie transparentne.

Jednym z podstawowych problemów przy stawianiu ściany ogniowej, jest integralność jej samej. Czy ktoś może włamać się na twoją ścianę ogniową i zmienić reguły? Jest to częsty problem przed którym stają administratorzy, szczególnie gdy używają ścian ogniowych opartych o maszyny Unix/NT. Niektórzy używają ich w formie rozwiązań sprzętowych, tzw. blackbox, sugerując się wrażeniem, że zamknięte systemy lepiej zabezpieczają sieć. Mamy lepszy sposób.

Wielu administratorów sieci zna zagadnienie mostu ethernetowego ( ang. ethernet bridge ). Jest to urządzenie które łączy dwa oddzielne segmenty ethernetowe by stworzyć z nich jeden. Most ethernetowy używany jest zwykle do połączenia dwóch budynków, zmieniania prędkości w sieci i przedłużenia maksymalnej długości okablowania. Ostatnie wersje Linuksa, OpenBSD, NetBSD i FreeBSD które zamieniają PeCety warte tysiące złotych w mosty warte setki! To co wszystkie most mają wspólnego, to fakt że znajdują się w połowie połączenia między dwoma maszynami, które nie wiedzą o jego istnieniu. Wchodzimy w świat ipfilter i OpenBSD.

Mostowanie ethernetu ma miejsce w warstwie drugiej modelu ISO. IP na warstwie trzeciej. IP Filter jest głównie zainteresowany warstwą trzecią, ale zajmuje się również warstwą drugą ponieważ ma dostęp do interfejsów. Poprzez połączenie IP Filter i urządzenia mostującego z OpenBSD, możemy stworzyć ścianę ogniową która jest zarówno niewidzialna jak i nieosiągalna. System nie potrzebuje adresu IP, nie musi nawet ujawniać swojego adresu ethernetowego. Jedynym znakiem że gdzieś jest filtr, mogą być trochę większe opóźnienia niż te generowane przez okablowanie kategorii piątej, a część pakietów po prostu nie dociera tam gdzie powinna.

Konfiguracja takiego rodzaju zestawu reguł jest zadziwiająco prosta. W OpenBSD, pierwsze urządzenie mostujące ma nazwę bridge0. Powiedzmy że mamy dwie karty sieciowe, xl0 i xl1. By zamienić tą maszynę w most, wszystko co trzeba zrobić to wprowadzić następujące trzy komendy:

brconfig bridge0 add xl0 add xl1 up
ifconfig xl0 up
ifconfig xl1 up

W tym momencie, cały ruch przychodzący do xl0 jest wysyłany do xl1 i odwrotnie. Zauważ, że żadnemu z interfejsów nie przydzielono adresu IP, my również tego nie zrobiliśmy. Tak naprawdę, najlepiej tego nie robić.

Reguły zachowują się generalnie tak jak dotychczas. Mimo że istnieje urządzenie bridge0, nie filtrujemy pakietów w oparciu o nie. Reguły dalej oparte są o któryś z interfejsów, co sprawia że ważne jest która karta sieciowa jest podłączona do którego kabelka. Zacznijmy od podstawowego filtrowania by zilustrować to co się dzieje. Zauważmy, że twoja sieć wyglądała tak:

20.20.20.1 <-------------------> 20.20.20.0/24 koncentrator

To znaczy, że mamy ruter na 20.20.20.1 połączony do sieci 20.20.20.0/24. Wszystkie pakiety z sieci 20.20.20.0/24 przechodzą przez 20.20.20.1 by wyjść do świata zewnętrznego i odwrotnie. Dodajemy teraz most ipf:

20.20.20.1 <-----/xl0 IpfBridge xl1/-----> 20.20.20.0/24 koncentrator

Oraz następujący zestaw reguł na nim:

pass in  quick  all
pass out quick  all

Z załadowanymi tymi regułami, funkcjonalność jest identyczna. Jeśli chodzi o ruter 20.20.20.1 i sieć 20.20.20.0/24 oba rysunki opisujące sieć są identyczne. Zmieńmy trochę reguły:

block in  quick on xl0 proto icmp
pass  in  quick all
pass  out quick all

Nadal 20.20.20.1 i 20.20.20.0/24 myślą, że sieć jest identyczna, ale jeśli 20.20.20.1 spróbuje wykonać ping do 20.20.20.2 nie dostanie odpowiedzi. Co więcej, 20.20.20.2 nie dostanie w ogóle pakietu. ipfilter przechwyci pakiet zanim dotrze on do drugiego końca wirtualnego drutu. Filtr z mostem możemy postawić gdziekolwiek. Używając tej metody, możemy ograniczyć koło zaufania do pojedyńczych maszyn, jeśli tylko starczy nam kart sieciowych :-).

Blokowanie icmp ze świata jest raczej śmieszne, szczególnie jeśli jesteś administratorem i lubisz pingować świat, wykonywać traceroute czy zmieniać swoje MTU. Skonstruujmy lepszy zestaw reguł by skorzystać z kluczowej zalety ipf: sprawdzania stanów.

pass  in quick on xl1 proto tcp  keep state
pass  in quick on xl1 proto udp  keep state
pass  in quick on xl1 proto icmp keep state
block in quick on xl0

W tej sytuacji, sieć 20.20.20.0/24 ( może lepiej będzie ją nazywać siecią xl1 ) może teraz osiągnąć świat, ale świat nie może osiągnąć sieci i nie może nawet sprawdzić dlaczego. Router jest dostępny, maszyny są aktywne, ale świat nie może po prostu wejść. Nawet gdyby router został zaatakowany, ściana ogniowa nadal będzie aktywna i będzie działać poprawnie.

Na razie filtrowaliśmy tylko na podstawie interfejsu i protokołu. Mimo, że mostowanie wykonywane jest na warstwie drugiej, nadal możemy ograniczać dostęp na podstawie adresu IP. Zwykle mamy uruchomione parę usług, więc nasz zestaw reguł może wyglądać tak:

pass  in quick on xl1 proto tcp  keep state
pass  in quick on xl1 proto udp  keep state
pass  in quick on xl1 proto icmp keep state
block in quick on xl1 # nie, wpuszczamy tylko tcp/udp/icmp proszę pana
pass  in quick on xl0 proto udp from any to 20.20.20.2/32 port=53 keep state
pass  in quick on xl0 proto tcp from any to 20.20.20.2/32 port=53 flags S keep state
pass  in quick on xl0 proto tcp from any to 20.20.20.3/32 port=25 flags S keep state
pass  in quick on xl0 proto tcp from any to 20.20.20.7/32 port=80 flags S keep state
block in quick on xl0

Mamy teraz sieć w której 20.20.20.2 jest serwerem nazw dla strefy, 20.20.20.3 obsługuje przychodzącą pocztę, a 20.20.20.7 jest serwerem WWW.

Mostowanie w wykonaniu IP Filter nie jest jednak doskonałe i musimy to przyznać.

Po pierwsze, zauważysz że wszystkie reguły używają kierunku in, zamiast kombinacji in i out. Dzieje się tak dlatego, że obecnie kierunek out nie jest zaimplementowany w OpenBSD. Oryginalnie chodziło o powstrzymanie spadków wydajności jeśli używało się wielu interfejsów. Prowadzi się prace nad przyśpieszeniem pracy, ale nadal ten kierunek pozostaje niezaimplementowany. Jeśli naprawdę potrzebujesz tej funkcjonalności, może będziesz mógł pomóc pracując przy kodzie, lub spytać ludzi z OpenBSD jak mógłbyś pomóc.

Po drugie, używanie IP Filter z mostowaniem, sprawia że używanie funkcjonalności NAT nie jest zalecane, jeśli nie bezpośrednio niebezpieczne. Pierwszym problemem jest oznajmienie o obecności filtrującego mostu. Drugim problemem byłoby to, że most nie ma adresu IP który mógłby używać do maskarady, co spowoduje prawdopodobnie bałagan jeśli nie błąd kernel panic. Możesz, oczywiście, ustawić adres IP dla interfejsu wychodzącego by NAT działał, ale znikają wtedy zalety wynikające z mostowania.

Używanie transparentnego filtrowania przy naprawie błędów w projektowaniu sieci

Wiele firm zaczęło używać IP zanim myśleli w ogóle o ścianach ogniowych czy podziale na podsieci. Mają teraz sieci wielkości klasy C czy nawet większe, które zawierają ich wszystkie serwery, stacje robocze, routery, maszyny do kawy i generalnie wszystko. Horror! Przenumerowanie, z poprawnym podziałem na podsieci, poziomy zaufania, filtry i tak dalej jest zarówno czasochłonne i kosztowne. Wydatek w postaci sprzętu i godzin roboczych ludzi już sam w sobie zwykle powstrzymuje większość firm przed rozwiązaniem tego problemu, nie mówiąc już nawet o okresie niedziałania sieci. Typowa problematyczna sieć wygląda jak poniżej:

20.20.20.1   router               20.20.20.6   unix server
20.20.20.2   unix server          20.20.20.7   nt workstation
20.20.20.3   unix server          20.20.20.8   nt server
20.20.20.4   win98 workstation    20.20.20.9   unix workstation
20.20.20.5   intelligent switch   20.20.20.10  win95 workstation

...tylko jest z 20 razy większa, zaśmiecona i w większości nieudokumentowana. W idealnej sytuacji, chciałbyś mieć wszystkie serwery w jednej podsieci, stacje robocze w drugiej a przełączniki ( ang. switch ) w trzeciej. Wtedy router filtrowałby pakiety pomiędzy podsieciami, dając stacjom roboczym ograniczony dostęp do serwerów, żadnego dostępu do przełączników, a tylko administrator miałby dostęp do maszynki do kawy. Nigdy nie widziałem sieci opartej o klasę C w takim porządku. IP Filter może pomóc.

Na początek, rozdzielimy router, stacje robocze i serwery. Potrzebujemy dwóch koncentratorów ( lub dwa przełączniki ), które i tak prawdopodobnie mamy, oraz maszynę z zainstalowanym IP Filter i trzema kartami sieciowymi. Podłączymy wszystkie serwery do jednego huba, a stacje robocze do drugiego. Normalnie połączylibyśmy następnie oba koncentratory ze sobą, a potem do rutera. Zamiast tego, podłączymy router do interfejsu IPF xl0, serwery do interfejsu xl1, a stacje robocze do interfejsu xl2. Diagram naszej sieci będzie wyglądał podobnie do tego:

                                                 | 20.20.20.2  unix server
    router (20.20.20.1)              ____________| 20.20.20.3  unix server
     |                              /            | 20.20.20.6  unix server
     |                             /xl1          | 20.20.20.7  nt server
     ------------/xl0 IPF Bridge <
                                   xl2          | 20.20.20.4  win98 workstation
                                    ____________| 20.20.20.8  nt workstation
                                                 | 20.20.20.9  unix workstation
                                                 | 20.20.20.10 win95 workstation

Tam gdzie do tej pory nie było nic tylko kable połączeniowe, mamy most filtrujący który zapewnia nam, że nie trzeba modyfikować konfiguracji komputerów. Prawdopodobnie od razu włączyliśmy również mostowanie, więc sieć zachowuje się normalnie. Następnie, zaczynamy z zestawem reguł podobnym trochę do naszego ostatniego:

pass  in quick on xl0 proto udp from any to 20.20.20.2/32 port=53 keep state
pass  in quick on xl0 proto tcp from any to 20.20.20.2/32 port=53 flags S keep state
pass  in quick on xl0 proto tcp from any to 20.20.20.3/32 port=25 flags S keep state
pass  in quick on xl0 proto tcp from any to 20.20.20.7/32 port=80 flags S keep state
block in quick on xl0
pass  in quick on xl1 proto tcp  keep state
pass  in quick on xl1 proto udp  keep state
pass  in quick on xl1 proto icmp keep state
block in quick on xl1 # nie, wpuszczamy tylko tcp/udp/icmp proszę pana
pass  in quick on xl2 proto tcp  keep state
pass  in quick on xl2 proto udp  keep state
pass  in quick on xl2 proto icmp keep state
block in quick on xl2 # nie, wpuszczamy tylko tcp/udp/icmp proszę pana

Ponownie, ruch nadchodzący ze strony rutera ograniczony jest do DNS'u, SMTP i HTTP. Na razie, serwery i stacje robocze nie mają ograniczeń w ruchu. Zależnie od rodzaju firmy, może być coś w dynamice sieci co Ci się nie podoba. Być może w ogóle nie chcesz by stacje robocze miały dostęp do serwerów? Wyrzuć reguły dla xl2:

pass  in quick on xl2 proto tcp  keep state
pass  in quick on xl2 proto udp  keep state
pass  in quick on xl2 proto icmp keep state
block in quick on xl2 # nie, wpuszczamy tylko tcp/udp/icmp proszę pana

i zamień je na:

block in quick on xl2 from any to 20.20.20.0/24
pass  in quick on xl2 proto tcp  keep state
pass  in quick on xl2 proto udp  keep state
pass  in quick on xl2 proto icmp keep state
block in quick on xl2 # nie, wpuszczamy tylko tcp/udp/icmp proszę pana

Być może chcesz by dostawały się tylko do serwerów by odebrać i wysłać swoją pocztę przez IMAP? Nic łatwiejszego:

pass  in quick on xl2 proto tcp from any to 20.20.20.3/32 port=25
pass  in quick on xl2 proto tcp from any to 20.20.20.3/32 port=143
block in quick on xl2 from any to 20.20.20.0/24
pass  in quick on xl2 proto tcp  keep state
pass  in quick on xl2 proto udp  keep state
pass  in quick on xl2 proto icmp keep state
block in quick on xl2 # nie, wpuszczamy tylko tcp/udp/icmp proszę pana

Teraz zarówno stacje robocze jak i serwery są chronione przed światem zewnętrznym, a serwery chronione są od stacji roboczych.

Być może prawdziwa jest sytuacja odwrotna, może chcesz by stacje robocze mogły mieć dostęp do serwerów, ale nie do świata zewnętrznego. W końcu, następna generacja exploit'ów działa na klientach a nie na serwerach. W tym przypadku, musisz zmienić swoje reguły dotyczące interfejsu xl2 na:

pass  in quick on xl2 from any to 20.20.20.0/24
block in quick on xl2

Teraz serwery mają wolną rękę, ale klienci nie mogę połączyć się do serwerów. Możemy obniżyć trochę obostrzenia dla serwerów:

pass  in quick on xl1 from any to 20.20.20.0/24
block in quick on xl1

W połączeniu z tymi dwoma, klienci i serwery mogą wymieniać dane, ale żadne z nich nie może kontaktować się ze światem zewnętrznym ( pomimo tego, że świat zewnętrzny może dostać się do paru usług ). Cały zestaw reguł wyglądać będzie tak:

pass  in quick on xl0 proto udp from any to 20.20.20.2/32 port=53 keep state
pass  in quick on xl0 proto tcp from any to 20.20.20.2/32 port=53 flags S keep state
pass  in quick on xl0 proto tcp from any to 20.20.20.3/32 port=25 flags S keep state
pass  in quick on xl0 proto tcp from any to 20.20.20.7/32 port=80 flags S keep state
block in quick on xl0
pass  in quick on xl1 from any to 20.20.20.0/24
block in quick on xl1
pass  in quick on xl2 from any to 20.20.20.0/24
block in quick on xl2

Pamiętaj zatem, że jeśli twoja sieć to bałagan adresów IP i maszyn różnego przeznaczenia, most z transparentnym filtrowaniem może rozwiązać twój problem, z którym musiałbyś w innym przypadku żyć i być może, któregoś dnia zostałby on wykorzystany do włamania.

Bezpieczne logowanie z komendami `dup-to' ( zrzuć do ) i `to' ( do ).

Do tej pory, używaliśmy filtrów do odrzucania pakietów. Zamiast je odrzucać, zastanówmy się nad przekazywaniem ich do innego systemu by móc zrobić z tymi informacjami coś bardziej użytecznego niż tylko logowanie za pomocą ipmon. Nasza ściana ogniowa, czy router czy most, może mieć tak dużo interfejsów jak dużo da się wsadzić do komputera. Możemy użyć tych informacji by stworzyć bezpieczne miejsce zbierania dla naszych pakietów. Dobrym przykładem byłaby implementacja sieci do wykrywania intruzów. Na początek, byłoby dobrze ukryć obecność systemów wykrywania intruzów przed światem, tak by nie mogły zostać wykryte.

Zanim zaczniemy, są pewne charakterystyki operacyjne o których musimy wiedzieć. Jeśli będziemy mieli do czynienia z pakietami, które zostały zablokowane, możemy używać zarówno słowa kluczowego to jak i fastroute ( różnice omówimy później ). Jeśli zamierzamy przepuszczać pakiety tak jak normalnie, musimy tworzyć kopię pakietów dla naszej sieci logującej przez użycie słowa kluczowego dup-to.

Metoda `dup-to'

Jeśli, na przykład, chcemy wysłać kopię wszystkiego co wychodzi przez interfejs xl3 do naszej sieci podłączonej do interfejsu ed0, możemy wstawić taką regułę:

pass out on xl3 dup-to ed0 from any to any

Możesz również mieć potrzebę wysłania tego pakietu do konkretnego adresu IP w Twojej sieci, zamiast tylko wysłać kopię i liczyć na to, że wszystko pójdzie dobrze. By to wykonać, zmodyfikujemy trochę regułę:

pass out on xl3 dup-to ed0:192.168.254.2 from any to any

Zwróć uwagę, że ta reguła spowoduje zmianę adresu przeznaczenia kopiowanego pakietu, co może zanegować użyteczność logowania. Dlatego, zalecamy tą wersję reguły jeśli jesteś pewien co do przeznaczenia logowanych pakietów ( np. nie używaj 192.168.254.2 dla logowania pakietów zarówno przeznaczonych dla serwera WWW jak i serwera poczty, ponieważ nie będziesz wiedział który pakiet miał dotrzeć do gdzie ).

Ta technika może być użyta całkiem efektywnie jeśli będziesz używał adresu IP w swojej sieci bezpieczeństwa tak jak traktowałbyś grupy rozgłaszania w prawdziwym internecie ( tzn. 192.168.254.2 może być kanałem dla analizy ruchu do HTTP, 23.23.23.23 kanałem dla sesji telnet i tak dalej ). Nie musisz mieć nawet tych adresów czy aliasów faktycznie ustawionych dla któregokolwiek adresu z sieci bezpieczeństwa. Normalnie, ipfilter musiałby używać ARP dla adresów nowego przeznaczenia ( przy użyciu czegoś w stylu ed0:192.168.254.2 ), ale możemy temu zapobiec przez stworzenie statycznych wpisów w tablicy ARP dla każdego `kanału' na naszym komputerze z ipfilter.

Generalnie, `dup-to ed0' to wszystko co jest wymagane by otrzymać nową kopię pakietu w naszej sieci bezpieczeństwa, dla celów logowania lub badań.

Metoda `to'

Metoda `dup-to' ma jedną wadę. Ponieważ ma wykonać kopię pakietu i ewentualnie zmienić jego adres docelowy, musi potrwać chwila zanim będzie gotowa zając się następnym pakietem.

Jeśli nie obchodzi nas wysyłanie pakietu do normalnego systemu a i tak mamy go zablokować, możemy używać słowa kluczowego `to' by przepchnąć ten pakiet przez proces normalnego routingu i zmusić go by wyszedł innym interfejsem niż normalnie.

block in quick on xl0 to ed0 proto tcp from any to any port < 1024

Używamy `block quick' dla routingu na interfejsie `to', ponieważ podobnie jak `fastroute', kod interfejsu `to' wygeneruje dwie ścieżki dla pakietu jeśli użyjemy `pass' a związku z tym prawdopodobnie spowoduje kernel panic.

10. Filtrowanie dziwnych sieci; najlepsze wyjście w aktualnych technologiach przeciwdziałających preparowaniu pakietów

Spędziliśmy trochę czasu śledząc szerokie zakresy adresów IP które zostały zarezerwowane przez IANA z różnych powodów, lub które nie były używane w momencie gdy pisano ten dokument. Ponieważ żadnego z tych adresów nie powinno się używać, nie powinien z niego wychodzić żaden ruch, jak również nie powinniśmy wysyłać tam niczego, prawda? Właśnie!

Więc, bez dodatkowych komentarzy, lista dziwnych sieci:

#
# s/OUTSIDE/interfejs-zewnętrzny (np: fxp0)
# s/MYNET/adres-sieci-w-formacie-CIDR (np: 1.2.3.0/24)
#
block in on OUTSIDE all
block in quick on OUTSIDE from 0.0.0.0/7 to any
block in quick on OUTSIDE from 2.0.0.0/8 to any
block in quick on OUTSIDE from 5.0.0.0/8 to any
block in quick on OUTSIDE from 10.0.0.0/8 to any
block in quick on OUTSIDE from 23.0.0.0/8 to any
block in quick on OUTSIDE from 27.0.0.0/8 to any
block in quick on OUTSIDE from 31.0.0.0/8 to any
block in quick on OUTSIDE from 69.0.0.0/8 to any
block in quick on OUTSIDE from 70.0.0.0/7 to any
block in quick on OUTSIDE from 72.0.0.0/5 to any
block in quick on OUTSIDE from 82.0.0.0/7 to any
block in quick on OUTSIDE from 84.0.0.0/6 to any
block in quick on OUTSIDE from 88.0.0.0/5 to any
block in quick on OUTSIDE from 96.0.0.0/3 to any
block in quick on OUTSIDE from 127.0.0.0/8 to any
block in quick on OUTSIDE from 128.0.0.0/16 to any
block in quick on OUTSIDE from 128.66.0.0/16 to any
block in quick on OUTSIDE from 169.254.0.0/16 to any
block in quick on OUTSIDE from 172.16.0.0/12 to any
block in quick on OUTSIDE from 191.255.0.0/16 to any
block in quick on OUTSIDE from 192.0.0.0/19 to any
block in quick on OUTSIDE from 192.0.48.0/20 to any
block in quick on OUTSIDE from 192.0.64.0/18 to any
block in quick on OUTSIDE from 192.0.128.0/17 to any
block in quick on OUTSIDE from 192.168.0.0/16 to any
block in quick on OUTSIDE from 197.0.0.0/8 to any
block in quick on OUTSIDE from 201.0.0.0/8 to any
block in quick on OUTSIDE from 204.152.64.0/23 to any
block in quick on OUTSIDE from 224.0.0.0/3 to any
block in quick on OUTSIDE from MYNET to any
# tutaj Twoje reguły przepuszczające...

block out on OUTSIDE all
block out quick on OUTSIDE from !MYNET to any
block out quick on OUTSIDE from MYNET to 0.0.0.0/7
block out quick on OUTSIDE from MYNET to 2.0.0.0/8
block out quick on OUTSIDE from MYNET to 5.0.0.0/8
block out quick on OUTSIDE from MYNET to 10.0.0.0/8
block out quick on OUTSIDE from MYNET to 23.0.0.0/8
block out quick on OUTSIDE from MYNET to 27.0.0.0/8
block out quick on OUTSIDE from MYNET to 31.0.0.0/8
block out quick on OUTSIDE from MYNET to 69.0.0.0/8
block out quick on OUTSIDE from MYNET to 70.0.0.0/7
block out quick on OUTSIDE from MYNET to 72.0.0.0/5
block out quick on OUTSIDE from MYNET to 82.0.0.0/7
block out quick on OUTSIDE from MYNET to 84.0.0.0/6
block out quick on OUTSIDE from MYNET to 88.0.0.0/5
block out quick on OUTSIDE from MYNET to 96.0.0.0/3
block out quick on OUTSIDE from MYNET to 127.0.0.0/8
block out quick on OUTSIDE from MYNET to 128.0.0.0/16
block out quick on OUTSIDE from MYNET to 128.66.0.0/16
block out quick on OUTSIDE from MYNET to 169.254.0.0/16
block out quick on OUTSIDE from MYNET to 172.16.0.0/12
block out quick on OUTSIDE from MYNET to 191.255.0.0/16
block out quick on OUTSIDE from MYNET to 192.0.0.0/19
block out quick on OUTSIDE from MYNET to 192.0.48.0/20
block out quick on OUTSIDE from MYNET to 192.0.64.0/18
block out quick on OUTSIDE from MYNET to 192.0.128.0/17
block out quick on OUTSIDE from MYNET to 192.168.0.0/16
block out quick on OUTSIDE from MYNET to 197.0.0.0/8
block out quick on OUTSIDE from MYNET to 201.0.0.0/8
block out quick on OUTSIDE from MYNET to 204.152.64.0/23
block out quick on OUTSIDE from MYNET to 224.0.0.0/3
# tutaj Twoje reguły przepuszczające...

Jeśli zamierzasz tego użyć, sugerujemy zapoznanie się z whois.arin.net i okresowe sprawdzanie tych adresów, ponieważ IANA nie powiadomi Cię jeśli przyzna któryś z nich dla nowych firm czy czegokolwiek innego. Zostałeś ostrzeżony.

11. Uwagi od tłumacza

Chciałbym podziękować następującym osobom za uwagi co do tłumaczenia, poprawki i zasugerowanie poprawek:

    dereck (at) box43.pl
  • literówki i dziwna zapaść w połowie zdania :)

Ściany ogniowe oparte o IP Filter
Brendan Conoboy, synk@swcp.com Erik Fichtner, emf@obfuscation.org
Wersja oryginalna: Fri Mar 1 22:29:33 EST 2002

Oryginał tego dokumentu znajduje się pod adresem: http://www.obfuscation.org/ipf/


Tłumaczenie: Łukasz Bromirski, l.bromirski@mr0vka.eu.org
Wersja tłumaczenia: 3.0, 2002/09/03 14:38:15

Oryginał tłumaczenia znajduje się pod adresem: http://mr0vka.eu.org/tlumaczenia/ipf.html



Dokument ten jest pomyślany jako wprowadzenie dla nowych użytkowników paczki IP Filter tworzącej ścianę ogniową. Jednocześnie, ma nauczyć użytkownika niektórych fundamentalnych zasad projektowania dobrych ścian ogniowych.






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

Adres tego artykułu to:
http://www.malisz.eu.org/11_IPFilter_3.htm