artykuły
Powrót do listy artykułów

Temat artykułu: Firewall cz.1 - pierwsza broń przed intruzami
Tekst napisał pitt2k dnia 08-01-2003

W artykule tym chciałbym przedstawić budowę i konfigurację typowego firewalla pod Linuxem - oczywiście na przykładzie Debiana, chociaż w innych dystrybucjach będzie to wyglądało tak samo.

Składniki

  • iptables v1.2.6a
  • Edytor (mc, vi)
  • kernel > 2.4
  • cierpliwość :-)

Mieszamy składniki
Zaczynamy od instalacji pakietu iptables. Zakładam, że mamy zainstalowanegoLinuxa z jądrem > 2.4 (najlepiej 2.4.18). W celu instalacji wchodzimy do dselect, szukamy i instalujemy pakiet iptables oraz wszystkie pakiety, których wymaga.


Gdy już mamy zainstalowany ten pakiecik, musimy pobawić się w konfigurację zasadobowiązujących na firewallu poprzez użycie polecenia iptables.


Najczęściej wykorzystywane opcje

Opcja Zwrot Opis
L list Wyświetla ustawienia firewalla w danej chwili
n numeric Nie odwołuje się do DNS w celu zamiany IP na nazwy
V version Wyświetla wersję programu
N new Stworzenie nowego łańcucha
F flush Wyczyszczenie reguł z łańcucha
P policy Ustawienie domyślnej polityki
A add Dodanie nowej reguły do łańcucha
i interface Wskazanie interface-u (np. ppp0, eth0, lo)
p protocol Wskazanie protokołu dla którego ma obowiązywać regóła
s source Wskazanie źródła z którego pochodzi pakiet
d destination Wskazanie miejsca docelowego pakietu
--sport source port Wskazanie portu źródłowego dla którego ma obowiązywać regóła
--dport destination port Wskazanie portu docelowego dla którego ma obowiązywać regóła


Adresy IP źródłowy ('-s', '--source' lub '--src') i docelowy ('-d', '--destination' lub '--dst') mogą być podane na cztery sposoby.
Najczęstszym jest użycie pełnej nazwy, takiej jak 'localhost' czy 'www.howto.pl'.Drugim sposobem jest podanie numerycznego adresu IP, takiego jak np. '127.0.0.1'.Trzeci i czwarty sposób pozwalają na wskazanie grup adresów IP, takich jak '199.95.207.0/24' lub '199.95.207.0/255.255.255.0'. Oba przykłady wskazują na adresy od '199.95.207.0' do '199.95.207.255' włącznie; cyfry po znaku '/' określają które części adresu IP są ważne. '/32' czy inaczej '/255.255.255.255' jest domyślne (tzn. każda liczba w adresie musi dokładnie pasować). By wskazać jakikolwiek adres IP używa się '0/0'.

Teoria
Firewalle z definicji działają na zasadzie filtracji pakietów. Co to oznacza ?
Ni mniej, ni więcej tyle, że pozwalamy na przedostanie się przez zaporę tylko tych pakietów, które muszą przechodzić. Oczywiście w praktyce wykorzystuje się oprócz samych tylko protokołów - porty.
Teraz mały wykład na temat protokołów i portów.
Przy budowie firewalla skupiamy się na trzech podstawowych protokołach:
  • TCP/IP
  • UDP
  • ICMP
Nie będę się rozpisywał na temat budowy i zasady działania w/w protokołów. Jeśli kogoś to bardzo interesuje, to odsyłam do odpowiednich RFC.
Numer portu jest identyfikatorem aplikacji, która działa w oparciu o protokół TCP lub UDP. Numery portów w zakresie 0 - 1023 są nazwane dobrze znanymi portami. Numery tych portów są przypisane do aplikacji po stronie serwera.
Numery portów od 1024 - 49151 są określane jako porty zarejestrowane. Z portów tych mogą korzystać zarówno aplikacje serwerowe, jak i klienckie.
Pozostałe numery portów, od 49152 - 65535, zostały nazwane przez IANA portami dynamicznymi lub prywatnymi. Dowolny serwer lub klient może korzystać z tych portów.

Przed przystąpieniem do filtrowania pakietów musimy najpierw zaznajomić się z różnicami występującymi pomiędzy różnymi portami oraz usługami które z nich korzystają.

Popularne numery portów oraz skojarzone z nimi protokoły
Port Protokół Aplikacja
20 TCP FTP Data
21 TCP FTP Control
22 TCP SSH
23 TCP Telnet
25 TCP SMTP
53 TCP/UDP DNS
80 TCP HTTP
110 TCP POP3
119 TCP NNTP
443 TCP SSL
1080 TCP SOCKS

W każdej sieci IP cztery unikalne parametry identyfikują komunikację pomiędzy hostami przy pomocy protokołu TCP lub UDP:
  • adres IP źródła
  • numer portu źródła
  • docelowy adres IP
  • docelowy numer portu

Co to oznacza ?
Bardzo wiele - każdy pakiet możemy przepuścić lub odrzucić weryfikując jego pochodzenielub jego cel !!!

Kernel rozpoczyna pracę z trzema listami reguł w tabeli filtrującej; nazywane sa one łańcuchami ściany ogniowej, lub po prostu łańcuchami.
Te trzy nazwane zostały INPUT (wejściowy), OUTPUT(wyjściowy) i FORWARD(przekazujący).


Trzy pięciokąty reprezentują trzy łańcuchy o których wspomniałem wyżej. Kiedy pakiet dociera do jednego z nich na diagramie, sprawdzany jest łańcuch reguł by zdecydować o losie pakietu. Jeśli łańcuch mówi że należy odrzucić (DROP) pakiet, jest on odrzucany tutaj, ale jeśli łańcuch mówi by zaakceptować pakiet (ACCEPT), kontynuuje on swoją podróż po diagramie.
Łańcuch to lista reguł. Każda reguła mówi 'jeśli nagłówek pakietu wygląda tak, to zrobimy z tym pakietem następującą rzecz'.
Jeśli reguła nie pasuje do pakietu, sprawdzana jest następna. Na koniec, jeśli nie ma więcej reguł, kernel sprawdza na zasadę (policy) danego łańcucha. W systemie w którym dba się o bezpieczeństwo, zasada mówi zwykle kernelowi by odrzucić (DROP) pakiet.

  1. Kiedy pakiet dociera do maszyny (powiedzmy, przez kartę Ethernetową), kernel sprawdza najpierw adres przeznaczenia pakietu: nazywa się to routingiem.
  2. Jeśli pakiet przeznaczony jest do tego kompuera, pakiet zostaje przepuszczony do łańcucha INPUT. Jeśli przejdzie go, proces do którego miał dotrzeć otrzyma go.
  3. W innym przypadku, jeśli kernel nie ma włączonego przekazywania (forwardingu), lub nie wie jak przekazać pakiet, jest on odrzucany. Jeśli przekazywanie jest włączone i pakiet jest przeznaczony do innego interfejsu sieciowego (jeśli w ogóle masz jeszcze jeden), pakiet przechodzi w prawo na naszym diagramie do łańcucha FORWARD. Jeśli zostaje zaakceptowan (ACCEPT), zostanie wysłany dalej.
  4. Na koniec, program pracujący na tym komputerze może również wysyłać własne pakiety. Przejdą one od razu do łańcucha OUTPUT: jeśli stwierdzi on że zaakceptuje pakiet (ACCEPT), pakiet przechodzi do właściwego interfejsu sieciowego.

Mamy do wyboru dwa scenariusze.
Albo przepuszczamy domyślnie wszystkie pakiety a tylko te które nam nie pasują odrzucamy.
Albo odrzucamy wszystko a wpuszczamy tylko te które muszą się u nas pojawić.
Oczywiście lepsze jest to drugie rozwiązanie ponieważ jest bezpieczniejsze !!!

Jeżeli mamy sieć wewnętrzną podpiętą przez naszego Linuxa do Internetu, to zalecałbym postawienie 2 firewalli i utworzenie tzw. DMZ - strefy zdemilitaryzowanej, czyli prościej serwera pomiędzy dwoma zaporami.
Jeśli jednak nasz komputer jest jedynym komputerem podłączonym do Internetu i nie jest wpięty do sieci komputerowej stawiamy jeden ogniomurek :)

Zaczynamy zabawę
  1. Usuwamy poprzednie regóły

    iptables -F INPUT
    iptables -F FORWARD
    iptables -F OUTPUT

  2. Ustawiamy domyślną politykę dla poszczególnych łańcuchów na odrzucającą

    iptables -P INPUT DROP
    iptables -P OUTPUT DROP
    iptables -P FORWARD DROP

  3. Jeżeli nasz komputer ma udostępniać Internet w sieci wewnętrznej to dodajemyregółkę uruchamiającą przekazywanie pakietów i tzw. maskaradę, czyli maskowaniepakietów pochodzących z wewnętrznej sieci.

    iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
    echo 1 > /proc/sys/net/ipv4/ip_forward

  4. Pozwalamy pakietom swobodnie biegać po naszym komputerze (odblokowujemu pętlęzwrotną LOOPBACK)

    iptables -A INPUT -i lo -j ACCEPT
    iptables -A OUTPUT -o lo -j ACCEPT

  5. Pozwalamy na pingowanie nas i innych

    iptables -A INPUT -p icmp -s 0/0 -d 0/0 -j ACCEPT
    iptables -A OUTPUT -p icmp -s 0/0 -d 0/0 -j ACCEPT

  6. Odblokowujemy dostęp do DNS dla naszego komputera (bo inaczej nie będziemy mogli np. przeglądać stron WWW - no chyba, że komuś chce się wpisywać IP :-))

    iptables -A INPUT -p tcp -s 0/0 --sport 53 -d 207.46.197.102 -j ACCEPT
    iptables -A OUTPUT -p tcp -s 207.46.197.102 -d 0/0 --dport 53 -j ACCEPT

    iptables -A INPUT -p udp -s 0/0 --sport 53 -d 207.46.197.102 -j ACCEPT
    iptables -A OUTPUT -p udp -s 207.46.197.102 -d 0/0 --dport 53 -j ACCEPT

  7. Odblokowujemy przeglądanie WWW dla naszego komputera

    iptables -A INPUT -p tcp -s 0/0 --sport 80 -d 207.46.197.102 -j ACCEPT
    iptables -A OUTPUT -p tcp -s 207.46.197.102 -d 0/0 --dport 80 -j ACCEPT



    Sieć lokalna
  8. Pozwalamy pingować wszystko

    iptables -A FORWARD -p icmp -s 0/0 -d 0/0 -j ACCEPT
    iptables -A FORWARD -p icmp -s 0/0 -d 0/0 -j ACCEPT

  9. Odblokowujemy dostęp do DNS dla komputerów w sieci (dla przykładu DNS TEPSY)

    iptables -A FORWARD -p ! icmp -s 192.168.1.0/24 -d 194.204.159.1 -j ACCEPT
    iptables -A FORWARD -p ! icmp -s 194.204.159.1 -d 192.168.1.0/24 -j ACCEPT

    iptables -A FORWARD -p ! icmp -s 192.168.1.0/24 -d 194.204.152.34 -j ACCEPT
    iptables -A FORWARD -p ! icmp -s 194.204.152.34 -d 192.168.1.0/24 -j ACCEPT

  10. Odblokowujemy przeglądanie WWW dla komputerów w naszej sieci

    iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 0/0 --dport 80 -j ACCEPT
    iptables -A FORWARD -p tcp -s 0/0 --sport 80 -d 192.168.1.0/24 -j ACCEPT



No i tym oto sposobem mamy prostego, ale skutecznego firewalla. Resztę pozostawiam czytelnikom. Oczywiście to co tu przedstawiłem, to tylko wierzchołek góry lodowej,która nazywa się FIREWALL.
Pamiętajcie jednak, że firewall, to dobry, ale nie jedyny sposób na zabezpieczenie przed dostępem z zewnątrz. Uważajcie więc na konfigurację, bo ponad 80% włamań powstaje z powodu braku lub złej konfiguracji ściany ogniowej !!!!.