IPTables – pierwsza linia obrony Twojego serwera, p1

Firewall jest bardzo ważnym narzędziem w walce z zagrożeniami czyhającymi z każdej strony – przed chorobami wenerycznymi nie ochroni ale w zabezpieczaniu komputera / serwera sprawdza się wyśmienicie 🙂 Warto poświęcić chwilę lub dwie na poznanie chociaż w podstawowym zakresie sposobu w jaki działa i jak można dostosować go do swoich potrzeb. Jeśli dotarłeś drogi czytelniku do tego momentu i wiesz o czym mowa – znaczy to że zapewne nie jesteś użytkownikiem Windowsa. Ten wpis ma na celu przybliżenie zagadnienia konfiguracji swojego własnego firewalla na systemie Linux – IPTables jest pakietem, który Ci w tym pomoże.

IPTables Podstawy

 

Aby przejść do konfiguracji poszczególnych reguł naszej „ogniościanki”, trzeba najpierw poznać kilka podstawowych pojęć. Istnieją trzy „łańcuchy”, które są zbiorem reguł dla pakietów (czyli ruchu sieciowego) – w kolejności:

  • INPUT – reguły odnoszące się do ruchu „wchodzącego” do naszej maszyny.

  • OUTPUT – reguły odnoszące się do ruchu „wychodzącego” z naszej maszyny.

  • FORWARD -reguły odnoszące się do ruchu przekazywanego dalej.

Dla każdego łańcucha z listy powyżej istnieją dwa możliwe domyślne stany, które można zmieniać w zależności od potrzeb.

DENY – czyli odrzucanie wszystkiego poza regułami znajdującymi się w danym łańcuchu,

ALLOW – czyli domyślne akceptowanie całego ruchu, a filtrowanie tylko tych pakietów, które znajdą się na liście reguł w danym łańcuchu.

W zależności od środowiska i potrzeb należy zdecydować czy chcesz domyślnie blokować wszystko POZA specyficznymi usługami np. pakietami ICMP (ping) lub www (TCP port 80), czy też wygodniej jest dla Ciebie zezwolić na cały ruch sieciowy a filtrować tylko niektóre usługi / porty – np. ustawić dostęp do SSH tylko z niektórych adresów IP. Serwery pracujące pod systemami Debian/Ubuntu domyślnie mają ustawione polityki zezwalające na cały ruch (czyli ustawione na ACCEPT). Dystrybucje RedHat/CentOS domyślnie blokują cały ruch sieciowy.

Możesz sterować tym co znajdzie się w konfiguracji Twojego firewalla za pomocą poleceń wydawanych w konsoli. Ponieważ reguły są dopasowywane z góry na dół (czyli od pierwszej do ostatniej), ważne jest, aby wpisy były ustawione w odpowiedniej kolejności. Pierwsza reguła, która zostanie dopasowana do pakietu zostanie użyta – a tak po ludzku: jeśli w pierwszej linijce zabronisz całego ruchu a w drugiej zezwolisz – użyte zostanie dopasowanie z pierwszej lini a druga nie będzie brana pod uwagę. Efekt czegoś takiego można bardzo łatwo przewidzieć – brak dostępu do serwera „po sieci”, strasznie niewygodne jeśli Twój serwer jest na drugim końcu globu 🙂

Polecenia

 

Starczy teorii, teraz trochę praktyki. Dla przykładu dodamy regułę do łańcucha INPUT (czyli dla pakietów wchodzących do naszej maszyny), która zezwala na ruch do usługi SSH (ang. secure shell). Oczywiście wszystkie polecenia wydajemy jako użytkownik root, lub poprzez polecenie sudo. (w moich przykładach będzie to root z uwagi pracy na dystrybucji Debian).

iptables -A INPUT -p tcp --dport ssh -j ACCEPT

Dla wyjaśnienia co się właśnie stało:

  • iptables – polecenie, które wskazuje systemowi, że chcemy zmienić konfigurację firewalla.
  • -A INPUT – oznacza, ze dodajemy wpis na końcu łańcucha INPUT.
  • -p tcp – oznacza, że pakiet do jakiego chcemy się odnieść jest pakietem TCP.
  • –dport ssh – polecenie wskazuje że port docelowy dla usługi to port SSH (czyli 22). Można używać nazw znanych usług takich jak ftp (21), ssh (22), http (80) zamiennie z numerami portów.
  • -j ACCEPT – ustawia akceptowanie połączeń na porcie SSH (22).

Następnie zezwolimy na ruch HTTP na standardowym porcie 80. Polecenie będzie identyczne poza numerem portu:

iptables -A INPUT -p tcp --dport http -j ACCEPT

W końcowej fazie zablokujemy cały pozostały ruch dodając na końcu:

iptables -A INPUT -j DROP

Sprawdźmy jakie reguły dodaliśmy, wydając polecenie:

iptables -L

Wynik polecenia powinien wyglądać następująco:


Chain INPUT (policy ACCEPT)
target     prot opt source               destination             
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
DROP       all  --  anywhere             anywhere 

Jak widać reguły zostały zapisane w kolejności ich dodawania. Przeanalizujmy jak zachowa się w tym momencie nasz firewall. Jeśli serwer otrzyma pakiet na port ssh (22) lub http (80), dopasuje zapytanie do jednej z pierwszych dwóch reguł i zaakceptuje komunikację. Jeśli natomiast pakiet będzie kierowany na inny port niż 22 lub 80 serwer nie znajdzie dopasowania i zastosuje ostatnią regułę odrzucającą wszystkie pakiety. Jak widać na załączonym przykładzie po znalezieniu dopasowania na początku listy nie są brane pod uwagę dalsze reguły.

Dodawanie reguł

 

Załóżmy, że chcemy dodać kolejną regułę zezwalającą na komunikację z naszym serwerem www po zabezpieczonym protokole https czyli porcie 443. Jeśli dodalibyśmy wpis tak jak poprzednio, reguła wylądowała by na samym końcu listy i nie została by wzięta pod uwagę – reguła odrzucająca wszystkie pakiety byłaby wyżej. Chcąc dodać coś zatem na pozycji 3 naszej listy powinniśmy zrobić to w następujący sposób:

iptables -I INPUT 3 -p tcp --dport 443 -j ACCEPT
  • I INPUT 3 – ustawi naszą regułę na pozycji 3 licząc od góry w łańcuchu INPUT. Jeśłi nie dodamy cyfry na końcu wpis ustawi się na samej górze łańcucha.
  • -p tcp – pakiet, którym chcemy sterować jest pakietem TCP.
  • –dport 443 – dodana przez nas reguła będzie dotyczyła ruchu na porcie 443 czy https.
  • -j ACCEPT – ruch dopasowany do tej reguły będzie dozwolony.

Sprawdźmy jak teraz wygląda nasz firewall:

iptables -L

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
DROP       all  --  anywhere             anywhere

Jak widać udało się ustawić wpis na pozycji 3, czyli przed regułą DROP. Tak więc jeśli ruch sieciowy zostanie dopasowany do którejkolwiek z 3 reguł zostanie przepuszczony, jeśli nie zostanie odrzucony.

Żeby swobodnie poruszać się po tematyce konfiguracji firewalla należny przyswoić kilka podstawowych zagadnień. Po pierwsze jaki są najbardziej podstawowe numery portów dla poszczególnych usług (ssh, ftp, http, https itp.) – w tym miejscu zapraszam do lektury https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers i czy danych ruch odbywa się po protokole TCPUDP lub innym np. ICMP (ping).

Póki co przebrnęliśmy przez absolutne podstawy, niebawem wyskrobię część drugą – zachęcam do zadawania pytań w komentarzach. Konstruktywna krytyka również mile widziana 🙂

1 Komentarz

  1. Pingback: IPTables – pierwsza linia obrony Twojego serwera, p2 | wnuk.me

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *