Konfiguracja firewalla
Zagadnienia bezpieczeństwa sieci LAN Co dzień przybywa komputerów podłączonych do sieci Internet, tym samym rośnie prawdopodobieństwo, że któryś z użytkowników Internetu postanowi włamać się do naszej sieci lokalnej. Bezpieczeństwo sieci komputerowych jest zagadnieniem ogromnym i nie widzę możliwości wyczerpania tutaj tego tematu. Zwłaszcza, że co dzień odkrywane są nowe sposoby włamania lub zakłócenia pracy systemów komputerowych. W tym rozdziale zajmę się sposobami kompleksowego zabezpieczenia sieci komputerowej za pomocą techniki filtrowania datagramów (firewalling) oraz tłumaczenia adresów sieciowych (NAT - masquerading). Pierwszym krokiem podczas rozpatrywania zagadnień bezpieczeństwa jest określenie potencjalnych "wrogów" i zorientowanie w metodach ich pracy.
Cele ataków włamywaczy.
Poniżej pokrótce omówię najczęściej stosowane sposoby ingerencji w pracę systemów sieciowych. Istnieją dwa cele ataków crackerów (włamywaczy komputerowych):
1. Uzyskanie dostępu do systemu.
2. Zdestabilizowanie pracy systemu komputerowego.
Pierwszy cel osiągany jest poprzez zdobycie nazwy użytkownika w systemie (login) i używanego przez niego hasła. Czasem odbywa się to poprzez wykorzystanie błędu w oprogramowaniu danej usługi sieciowej i zdobycie dostępu do systemu na prawach przyznanych tej usłudze. Zdobycie loginu nie jest trudne, najczęściej wystarczy zdobyć adres poczty elektronicznej (E-mail) danego użytkownika (czasem jest to tzw. alias, co utrudnia zadanie włamywaczowi).
Statystyki podają, że najczęściej użytkownicy sieci komputerowych stosują hasła łatwe do złamania za pomocą metody słownikowej (korzystając ze słownika zawierającego odpowiednią liczbę słów). Dekodowanie haseł metodą brute-force jest bardziej czasochłonne (statystycznie) i dzięki temu łatwiejsze do wykrycia. Polega ono na sprawdzaniu wszystkich możliwych kombinacji znaków mogących znaleźć się w haśle danego systemu operacyjnego. Dlatego należy dbać, aby hasła użytkowników były jak najbardziej skomplikowane, powinny zawierać przynajmniej duże i małe litery oraz cyfry.
Drugi cel ataków, osiągany jest przez crackerów dzięki wykorzystaniu błędów (bug) w oprogramowaniu serwerów usług Internetowych, czasem stosu TCP/IP. Tego typu działaniem jest ostatnio popularna metoda unieruchamianiu serwisów WWW. Polega ona na wysyłaniu olbrzymiej liczby zapytań do serwera WWW, który próbując je wszystkie obsłużyć zostaje zablokowany. Główną metodą zabezpieczeń przed tego typu "problemami" jest ciągła aktualizacja oprogramowania sieciowego oraz śledzenie stron zawierających gotowe oprogramowanie służące do takich działań. Jest to zadanie administratora sieci komputerowej i w zakresie jego obowiązków musi być czas przeznaczony na tego typu działania.
Metody włamań.
Starą metodą jest podstawienie programu, udającego program logujący do systemu. W ten sposób użytkownik podaje swoje hasło, a program włamywacza posiada hasło w postaci niezakodowanej. W przypadku systemu Windows 95 (98) zainstalowanie takiego programu, udającego przykładowo system potwierdzania hasła poczty elektronicznej, nie stanowi zbytniego problemu.
Następną metodą jest nasłuchiwanie (sniffing), polega ona na podłączeniu do sieci komputera z uruchomionym oprogramowaniem do ściągania wszystkich ramek Ethernetowych w danym segmencie sieci. W tym momencie cracker uzyskuje dostęp do wszystkich haseł, które transmitowane są otwartym tekstem po sieci (np. odczytywanie poczty za pomocą protokołu POP, transmisja plików protokołem FTP). Pod nazwą sniffing zaszeregowane są również metody podsłuchu transmisji w kablach sieciowych lub też transmisji w kablach monitorowych. Przykładowo: istnieją urządzenia umożliwiające oglądanie (oczywiście zaszumionego) obrazu wyświetlanego na monitorze znajdującym się kilkanaście metrów od nas, za kilkoma ścianami.
Znanym problemem są usługi umożliwiające zdalną pracę: rlogin, rsh, rcp, których system zabezpieczeń jest zupełnie niewystarczający. Aktualnie są coraz rzadziej stosowane i najczęściej nie wykorzystywane. Zastąpione zostały usługą bezpiecznego połączenia ssh (Secure Shell).
Niebezpieczna może być również usługa ftp. Niewłaściwie skonfigurowany serwer ftp, może umożliwić włamywaczowi uzyskanie ważnych informacji, przykładowo pliku zawierającego hasła.
Jedną z kategorii zagrożeń stanowią tzw. furtki (backdoors) lub włazy (trapdors) będące nieudokumentowanymi funkcjami aplikacji, pozostawionymi przez programistów. W systemie Linux, dzięki pełnej dostępności źródeł programów, bardzo szybko są wykrywane i usuwane tego typu problemy.
align="justify"Ponadto usługa smtp w implementacji wczesnych wersji programu sendmail okazała się niedostatecznie bezpieczna. Przykładowo przy odpowiednim przerobieniu przesyłki, interpretowana jest ona jako program wykonywalny i uruchamiana przez sendmaila.
Jednym z problemów może być wykorzystywanie przez administratorów serwerów WWW, skryptów CGI pochodzących z nieznanych źródeł. Dodatkowo korzystanie z usług WWW wymaga wiele ostrożności, ponieważ pojawia się bardzo dużo nowych technologii, których systemy zabezpieczeń nie są dobrze znane. Typowym przykładem jest technologia ActiveX wprowadzona przez firmę Microsoft, chociaż implementacja języka Java też nie jest wolna od błędów. Jednak znany jest fakt, że zastosowana w przeglądarce Netscape Communicator technologia Sand Box jest o wiele bezpieczniejsza od implementacji zabezpieczeń w Internet Explorerze.
Jedną z najgłośniejszych technik włamań było "podszywanie się" (spoofing). Polega ono na wysyłaniu datagramów IP z nieprawdziwym adresem źródłowym, przez co komputer je odbierający błędnie identyfikuje ich nadawcę. Zabezpieczenie przed ta metodą zostało wkompilowane w jądro rutera i jest uruchamiane zawsze przy starcie systemu.
Systemy Linuxowe są odporne na atak Ping of Death polegający na wysyłaniu dużych pakietów ICMP i przepełnianiu stosu TCP. Łatwo rozpoznać takie pakiety ICMP po fragmentacji, która została dokonana ze względu na rozmiar przekraczający MTU.
Teardrop i Bonk są metodami ataków (niebezpieczne głównie dla Windows NT) używającymi nachodzących na siebie fragmentów pakietów. Ruter Linuxowy dokonuje defragmentacji i uniemożliwia takie ataki.
Niektóre z mniej stabilnych stosów TCP są wrażliwe na datagramy z dużą liczbą fragmentów i mogą nie odebrać ich wszystkich. Linux jest pozbawiony tego problemu. Można filtrować takie fragmenty lub skompilować jądro rutera z opcją `IP: always defragment' ustawioną na `Y' (tylko gdy dany ruter jest jedyną możliwa drogą dotarcia takich pakietów).
Istnieje na pewno wiele innych metod i ciągle pojawiają się nowe. Jedynym sposobem zabezpieczenia jest nieustanne śledzenie grup dyskusyjnych zajmujących się zagadnieniami bezpieczeństwa i natychmiastowe reagowanie na każde nowe zagrożenie. Jest to zadanie każdego administratora sieci. Ponadto podstawą tworzenia polityki zabezpieczeń dla danej firmy jest prawidłowe skonfigurowanie firewalla, będącego aktualnie niezbędnym składnikiem systemu bezpieczeństwa.
Podczas projektowania bezpiecznej sieci komputerowej możemy wyróżnić trzy poziomy (strefy) dostępu z Internetu:
I. Poziom zewnętrzny - sieć znajdująca się za firewallem z komputerami o adresach widocznych z Internetu. W tej sieci powinny znajdować się jedynie serwery świadczące usługi Internetowe.
II. Poziom wewnętrzny - podsieć z adresów nierutowalnych, mająca połączenie z Internetem za pomocą rutera z funkcjami firewalla i NAT (najczęściej masquerading). Tutaj powinny się znajdować komputery pracowników firmy.
III.Poziom izolowany - sieć bez rutingu do Internetu, tutaj powinny się znajdować serwery baz danych strategicznych dla firmy (kadry, płace, dane techniczne produkcji, biura projektowe itp.) i komputery pracowników korzystających z tych zasobów.
Rzadko istnieje możliwość wprowadzenia takiej modelowej struktury.
Pomimo istnienia aż tylu różnych metod włamania się do systemów informatycznych, najczęściej powodem problemów jest po prostu błąd człowieka. Głośne są przypadki pozostawiania haseł dostępu do systemu przyklejonych pod klawiaturą, a czasem karteczką do monitora. Dla tego bardzo ważny jest poziom zrozumienia zasad bezpieczeństwa przez użytkowników systemu i ich przestrzeganie. Ustalenie takich zasad, przyjęcie metod ich egzekwowania, ustalenie i sztywne przestrzeganie poziomów dostępu do systemu oraz odpowiednie jego skonfigurowanie (konstrukcja sieci, firewall) tworzy politykę bezpieczeństwa firmy.
Firewall
Firewall - "ściana ogniowa" termin wzięty z konstrukcji samochodu, jest to element konstrukcji uniemożliwiający rozprzestrzenianie się ognia w czasie pożaru na kabinę pasażerów. W sieci komputerowej jego zadaniem jest zapewnienie bezpieczeństwa sieci w przypadku prób włamania. Można wyróżnić dwa ogólne typy firewalli.
Firewalle filtrujące IP - na podstawie adresów IP oraz numerów portów podejmują decyzje o zakwalifikowaniu danego datagramu jako bezpieczny. Firewalle filtrujące działają na poziomie pakietów IP. Są zaprojektowane do kontroli przepływu bazując na adresie źródłowym, docelowym, porcie i typie pakietu (zawartych w każdym z pakietów). Ten typ firewalli jest bardzo bezpieczny, ale nie daje kontroli nad użytkownikami. Można udostępnić usługę, ale nie da się otrzymać informacji identyfikujących konkretnego użytkownika z niej korzystającego, poza adresem IP komputera z którego przyszła transmisja.
Serwery połączeniowe (proxy) - wykonują połączenie sieciowe w zamian za komputer z sieci lokalnej. Serwery proxy pozwalają na niebezpośredni dostęp do Internetu. Dobrym przykładem jest serwer proxy usługi WWW. Gdy łączymy się z proxy-serwerem za pomocą oprogramowania klienckiego uruchamia on swojego klienta i dostarcza danych których zarządaliśmy. Ponieważ serwery proxy podwajają każde połączenie, możliwe jest zapisywanie (logowanie) każdego z nich. Serwery proxy są w pełni bezpieczne, gdyż nie dokonują bezpośredniego rutingu. Jedyną ich wadą są ogromne wymagania sprzętowe oraz pewien brak elastyczności. W momencie pojawienia się nowej usługi, z której użytkownicy sieci chcą skorzystać, musimy zainstalować dodatkowy program na serwerze zapewniający daną usługę.
Poniżej przedstawię dokładniejszy podział firewalli i ich cechy.
Tradycyjne proxy (Traditional proxies).
Pakiety z sieci prywatnej nigdy nie wychodzą do Internetu i vice versa. Adresy IP w sieci prywatnej powinny być z klas nierutowalnych. Jedyną drogą połączenia się z Internetem, jest wywołanie firewalla, ponieważ jest on jedyną maszyną mogącą łączyć się równocześnie z obiema sieciami. Uruchamiamy jest na nim program zwany proxy, który tego dokonuje. Dla każdej usługi która ma być dostępna z Internetu, na firewallu musi być uruchomiony osobny program pośredniczący w jej świadczeniu.
Komputery w sieci wewnętrznej muszą być specjalnie skonfigurowane do uzyskania dostępu do wybranych usług. Przykładowo, aby ściągnąć stronę WWW, muszą połączyć się z firewallem na port 8080 i zażądać potrzebnej strony. W tym momencie uruchamia się odpowiedni program pośredniczący, ściąga potrzebne dane i przekazuje do odpowiedniego komputera w sieci lokalnej.
Przezroczyste proxy (Transparent proxies).
Pakiety z sieci prywatnej nigdy nie wychodzą do Internetu i vice versa. Adresy IP w sieci prywatnej powinny być z klas nierutowalnych. Jedyną drogą połączenia się z Internetem, jest wywołanie firewalla, ponieważ jest on jedyną maszyną mogącą łączyć się równocześnie z obiema sieciami. Uruchamiamy na nim program zwany transparent proxy, który tego dokonuje. Jądro Linuksa kieruje pakiety do tego programu, zamiast wysłać je bezpośrednio do Internetu. Dla każdej usługi która ma być dostępna z Internetu, na firewallu musi być uruchomiony osobny program pośredniczący w świadczeniu takiej usługi.
Przezroczyste proxy oznacza, że klient nie musi wiedzieć o użyciu oprogramowania typu proxy i nie musi być specjalnie konfigurowany. Przykładowo: firewall jest skonfigurowany do przekierowywania (za pomocą komendy ipchains) wszystkich połączeń do portu 80 na port 8080 na którym pracuje tranparent proxy. Przy próbie pobrania dowolnej strony WWW, transmisja przekierowywana jest na port 8080, a następnie wszystko odbywa się jak w poprzednim przykładzie.
Tłumaczenie adresów IP (NAT lub Masquerading).
Pakiety z sieci prywatnej nigdy nie wychodzą do Internetu bez specjalnej obróbki i vice versa. Adresy IP w sieci prywatnej powinny być z klas nierutowalnych. W tym przypadku używamy specjalnych funkcji jądra Linuksa. Masquerading ma wydzielone moduły do radzenia sobie ze skomplikowanymi protokołami jak FTP, RealAudio, Quake, itp.
Sieć publiczna.
W tym przypadku, nasza sieć jest częścią Internetu, pakiety mogą poruszać się bez zmian poprzez obie sieci. Filtrowanie pakietów jest użyte aby ograniczyć dostęp z Internetu tylko do naszych wewnętrznych serwerów i uniemożliwić dostęp do komputerów użytkowników. Ten typ firewalla ma najmniejsze możliwości kontroli i autoryzacji dostępu, ale jest równocześnie najbardziej elastyczny i wprowadza najmniej ograniczeń dla użytkowników z sieci wewnętrznej.
Obsługa filtrowania pakietów przez jądro Linuksa
Komenda ipchains jest linuksową komendą używaną do konfiguracji reguł firewalla i tłumaczenia adresów IP (NAT). Zastąpiła ona starszą ipfwadm. Aby móc wykorzystać komputer z systemem operacyjnym Linux do filtrowania pakietów należy skompilować jądro systemu z opcjami (dla jądra z serii 2.1 lub 2.2):
CONFIG_FIREWALL = y
CONFIG_IP_FIREWALL = y
W nowszych jądrach mogą to być inne parametry konfiguracyjne. Aby stwierdzić czy jądro ma prawidłowo wkompilowaną obsługę filtrowania datagramów, należy sprawdzić czy w katalogu /proc/net/ istnieje plik ip_fwchains, zawierający konfigurację reguł ipchains.
Przy konfigurowaniu firewalla za pomocą komendy ipchains, podstawowym pojęciem jest łańcuch (chain). Łańcuch jest to zbiór reguł filtrujących. Istnieją trzy standardowe łańcuchy: input, forward i output, ponadto użytkownik może tworzyć własne łańcuchy.
Droga datagramów IP poprzez firewall jest bardzo skomplikowana. Najważniejsze etapy zostały zaznaczone pogrubioną czcionką na powyższym schemacie.
Najpierw sprawdzana jest suma kontrolna datagramów (checksum), następnie testowane są one pod kątem deformacji (sanity). Później pakiety przechodzą przez łańcuch wejściowy (input chain) i jeśli trzeba podlegają procesowi NAT (demasquerade), czyli adres rutera usuwany jest z pola "adres docelowy" i zastępowany adresem IP komputera w sieci prywatnej. Dalej na podstawie tablicy rutingu (routing decision) lub protokołu rutującego podejmowana jest decyzja o dalszym losie pakietu. Procesy lokalne (local process) mogą odbierać pakiety po etapie rutowania i wysyłać pakiety poprzez etap rutowania i łańcuch wyjściowy (output chain). Jeśli pakiety nie są utworzone przez procesy lokalne, są sprawdzane w łańcuchu przejściowym (forward chain). Jeśli pakiety od procesów lokalnych są przekazywane do lokalnego komputera (localhosta) przechodzą przez łańcuch wyjściowy (output chains) do interfejsu lo (lo interface - loopback). Wszystkie pakiety wydostające się z komputera muszą przejść przez łańcuch wyjściowy (output chain).
Składnia polecenia ipchains
Pokrótce przedstawię podstawową składnię polecenia ipchains. Skupię się na opcjach użytych w plikach konfiguracyjnych na ruterze. Dokładny opis pozostałych opcji znajduje się w publikacji Ipchains_HOWTO Po poleceniu ipchains następuje opcja określająca działanie całej komendy.
-F (Flush) - usuwa wpisy z wymienionego później łańcucha.
-A (Append) dodaje nową regułę do łańcucha.
-I (Insert) wstawia nową regułę do łańcucha na podane miejsce.
-D (Delete) usuwa regułę z łańcucha.
Następnie występują wpisy określające źródło i cel transmisji
-s (source) źródło.
-d (destination) cel.
Adresy mogą być podawane jako nr IP lub nazwa oraz jako zakresy, np.:
199.95.207.0/24
199.95.207.0/255.255.255.0
Większość opcji umożliwia operację negacji logicznej np.: "-s ! localhost" oznacza wszystkie hosty poza lokalnym.
Protokół może być podawany jako numer lub nazwa (tcp, udp, icmp), nie jest ważne czy małe czy też duże litery.
-p udp
Można również podawać numer portu dla którego układamy regułę:
-p TCP -s 0.0.0.0/0 1023
Zakres portów:
-p TCP -s 0.0.0.0/0 1010:1023
-p TCP -s 0.0.0.0/0 :1023 - wszystkie porty poniżej 1023
Równie dobrze możemy podać nazwę portu:
-p TCP -s 0.0.0.0/0 www
Określamy interfejs sieciowy, którego dotyczy reguła.
-i eth0
-i eth+ oznacza wszystkie interfejsy zaczynające się na eth.
Logowanie pakietów, flaga -l .
Flaga -j specyfikuje co wykonać z pakietem pasującym do reguły. Jeśli nie ma tej flagi, to reguła jest używana do prostego zliczania pakietów ją spełniających. Działaniami które możemy zlecić są:
ACCEPT - pozwala przejść pakietom przez firewalla.
DENY - likwiduje pakiety, tak jakby nigdy nie doszły do firewalla.
REJECT - likwiduje pakiety, (jeśli nie są to pakiety ICMP) wysyłając komunikat ICMP o nieosiągalności celu.
MASQ - stosuje NAT (jądro musi być skompilowane z IP Masquerading enabled). Prawidłowe jedynie dla łańcucha forward.
REDIRECT - przesyła pakiet na lokalny port, zamiast podanego w nagłówku. Używane tylko dla protokołów TCP i UDP. Numer portu może być podany po REDIRECT co przesyła pakiety na konkretny port. To działanie jest prawidłowe tyko dla łańcucha input (wejściowego).
RETURN - jest identyczny z natychmiastowym osiągnięciem końca łańcucha.
Ustalamy politykę dla łańcucha. Polityka określa co należy zrobić z pakietem nie pasującym do żadnej z reguł.
ipchains -P input DENY