IPTables – pierwsza linia obrony Twojego serwera, p2

Wczoraj było o podstawach działania linuksowego firewalla i pakietu IPTables dzisiaj będzie ciąg dalszy. Mam nadzieję, że do tej pory wszystkie (albo przynajmniej większość) rzeczy przez mnie przedstawionych jest jasna i zrozumiała. Wiesz już jak dodawać reguły i w jakiej kolejności powinny być one ułożone . W dalszej części będzie między innymi o kasowaniu wybranych reguł z łańcucha i zapisywaniu / odzyskiwaniu konfiguracji firewalla. Zapraszam do lektury i dzielenia się swoim i uwagami w komentarzach.

Dodawanie reguł cd.

 

Zaczniemy spokojnie czy od małej powtórki z poprzedniego wpisu. Przy konfiguracji firewalla należy pamiętać, że niektóre aplikacje komunikują się na interfejsie lokalnym tak zwanym loopback interface. Co za tym idzie powinniśmy zezwolić a cały ruch na tym interfejsie – odbywa się on tylko lokalnie więc nie będzie zagrożeniem. Regułę dodajemy w podobny sposób jak poprzednio:

iptables -I INPUT 1 -i lo -j ACCEPT

Jak widzisz pojawił się jeden nowy „przełącznik” (-i lo) określający do jakiego interfejsu odnosi się dana reguła.

  • -I INPUT 1 – wstawiamy regułę na początku łańcucha INPUT (-I) na pozycji pierwszej
  • -i lo – wskazujemy że reguła będzie dotyczyła interfejsu lokalnego tzw. loopback (lo)
  • -j ACCEPT – określamy, że dopasowany ruch powinien być akceptowany

Sprawdźmy teraz jak teraz wygląda nasz firewall (będę używał zapisanej konfiguracji z poprzedniego wpisu – jeśli zaczynasz od początku polecam użycie poleceń z TEGO pliku i wklejenie ich kolejno w konsoli).

iptables -L -v

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination         
   0     0 ACCEPT     all  --  lo     any     anywhere             anywhere            
 320 18032 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:ssh
   0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:http
   0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:https
  14  1720 DROP       all  --  any    any     anywhere             anywhere

Jak widać nasza reguła wylądowała na samej górze łańcucha i od tej pory interfejs loopback akceptuje każdy rodzaj ruchu sieciowego.

Poświęć chwile na analizę powyższego listingu. Pierwszą rzeczą jaka powinna ci się rzucić w oczy jest fakt, że użyłem dodatkowego przełącznika przy wyświetleniu aktualnych reguł: iptables -L -v Przełącznik -v wyświetla więcej statystyk dla naszego firewalla – ilość i wielkość (w bajtach) pakietów jakie „wpadły” do danej reguły. Widać, że nasz firewall przetworzył ruch dla reguły zezwalającej na ruch ssh – stało się tak ponieważ testy wykonywałem na maszynie będąc podłączonym do niej właśnie przez protokół ssh. Kilka pakietów „złapało” się również na ostatnią regułę DROP – przypominam, że są to pakiety, które nie pasowały to reguł wcześniejszych w tym łańcuchu.

Ustanowione połączenia

 

Nie napisałem o tym wcześniej ale dobrym nawykiem jak i zalecaną akcją przy konfiguracji firewalla jest ustawienie w pierwszej kolejności (może być też w drugiej 🙂 ) akceptowania połączeń już istniejących i powiązanych do już istniejących – zabezpieczmy się w ten sposób przed np. przypadkowym dodaniem reguły blokującym nam np. dostęp do konsoli  lub podczas testowania reguł nie odetniemy dostępu klientom już podłączonym.

iptables -I INPUT 1 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

Poza dobrze znanymi Ci już przełącznikami (jak np. -I INPUT 1) pojaiwły się 2 nowe: -m conntrack oraz –ctstate.

  • -m conntrack – pozwala na dopasowanie reguły do aktualnego stanu połączenia, należy go używać z przełącznikiem –ctstate.
  • –ctstate – definiuje stan w jakim pakiem powinien się znajdować aby mógł być dopasowany. Możliwe stany to:
    • NEW – połączenie nowe (nie widziane do tej pory).
    • RELATED – połączenie nowe ale odnoszące się do innego, które było wcześniej zaakceptowane.
    • ESTABLISHED – połączenie już istniejące.
    • INVALID – połączenie, które nie zostało z jakiś powodów dopasowane do żadnego innego stanu.

Kasowanie reguł

 

Wiesz już jak dodawać różnego rodzaju reguły ale co w przypadku kiedy reguła przestała być potrzebna lub jest błędna ? Usuwanie reguł w iptables jest bardzo proste i odbywa się poprzez przełącznik -D. Kasowanie może być przeprowadzone w dwojaki sposób. Można usunąć regułę podając jej wartość np. :

iptables -D INPUT 1 -i lo -j ACCEPT

Polecenie usunie dokładnie taką regułę z łańcucha – jeśli zrobisz literówkę lub reguł nie będzie w łańcuchu system powiadomi Cię, że nie może znaleźć dopasowania. Zakładam, że po jakimś czasie nie będziesz pamiętał jak dokładnie wyglądała składania dodawanych przez Ciebie reguł – w tym wypadku można wyświetlić składnie wszystkich reguł zapisanych w twoim firewallu poprzez polecenie:

iptables -S

Otrzymasz w ten sposób listę aktualnie zapisanych reguł. Wszystko co należy zrobić to skopiować interesującą nasz linię i zamienić przełącznik -A, -I na -D.

Drugim sposobem na usunięcie interesujacej nas reguły jest podanie numeru lini, która ma być skasowana:

iptables -D INPUT 3

Powyższa komenda skasuje regułę w łańcuchu INPUT, która znajduje się na pozycji nr. 3. Przy rozbudowanej konfiguracji może się to okazać dość nieporęczne a skasowanie nie tej reguł dość bolesne 🙂

Iptables – dwa podejścia

 

Pisałem w pierwszej części tego artykułu, że istnieją dwa podejścia do zarządzania regułami firewalla. Pierwsze kiedy pozwalamy na cały ruch a blokujemy / ograniczamy ruch do niektórych usług, lub blokujemy domyślnie cały ruch do naszej maszyny a zezwalamy tylko na określone usługi. Do tej pory mieliśmy ustawione domyślne polityki dla łańcuchów INPUT, OUTPUT i FORWARD na akceptowanie (ACCEPT). Spróbujemy teraz zastosować drugie podejście – zmienimy domyślną politykę na odrzucanie połączeń.

iptables -P INPUT DROP

Po wykonaniu powyższego polecenia możemy usunąć nasz ostatni zapis w łańcuchu INPUT, który odrzucał pakiety nie dopasowane do wcześniejszych reguł (http, https, ssh):

iptables -D INPUT -j DROP

Wyświetlmy teraz aktualną konfigurację firewalla i zobaczmy co się zmieniło:

iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https

Po analizie powyższego listingu powinieneś zauważyć, że domyślna polityka dla łańcucha INPUT jest ustawiona na DROP czyli wszystkie pakiety są domyślnie odrzucane – chyba że istnieją na liście dopuszczonych tak jak protokoły http, https, oraz ssh.

Generalnie dobrą zasadą jest ustawienie domyślnych reguł na:

  • Domyślne ODRZUCANIE połączeń w łańcuchu INPUT (iptables -P INPUT DROP)
  • Domyślne ODRZUCANIE połączeń w łańcuchu FORWARD (iptables -P FORWARD DROP)
  • Domyślne AKCEPTOWANIE połączeń w łańcuchu OUTPUT (iptables -P OUTPUT ACCEPT)

 

Zapisanie / odczyt konfiguracji

 

Dodawane przez Ciebie reguły są zapisywane w pamięci operacyjnej – po restarcie maszyny utracisz wszystkie zmiany jakie wprowadziłeś w ustawieniach swojego firewalla. Aby zapisać konfigurację należy użyć poniższego polecenia:

iptables-save > /etc/iptables/iptables.rules

Spowoduje ona zapisane istniejącej konfiguracji w pliku w lokalizacji /etc/iptables pod nazwą iptables.rules.

Do przywrócenia konfiguracji służy polecenie:

iptables-restore < /etc/iptables/iptables.rules

 

Logowanie odrzuconych pakietów

 

Być może w ramach edukacji, ciekawości lub z innych pobudek przyda Ci się funkcja logowania odrzuconych pakietów do pliku. Aby tego dokonać wystarczy kilka prostych kroków:

  1. Dodać nowy łańcuch reguł,
  2. Dodać regułę, która przekieruje odrzucony ruch do nowego łańcucha
  3. Dodać prefix dla tych pakietów, dzięki czemu będzie je łatwiej odfiltrować z logu,
  4. Dorzucić niechciane pakiety.

Cała operacja nie jest skomplikowana i ogranicza się do poniższych poleceń:

# dodajemy nowy łańcuch o nazwie "LOGOWANIE"
iptables -N LOGOWANIE

# Dodajemy regułę, która przekieruje niechciany ruch do nowego łańcucha
iptables -A INPUT -j LOGOWANIE

# zapisanie pakietów do pliku z odpowiednim prefiksem
iptables -A LOGOWANIE -m limit --limit 2/min -j LOG --log-prefix "IPTables pakiet odrzucony: " --log-level 7

# Odrzucenie pakietów po zalogowaniu
iptables -A LOGOWANIE -j DROP

Zobaczmy jak teraz wygląda nasz firewall po zastosowaniu nowych reguł:

iptables -L

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

Chain LOGOWANIE (1 references)
target     prot opt source               destination         
LOG        all  --  anywhere             anywhere             limit: avg 2/min burst 5 LOG level debug prefix "IPTables pakiet odrzucony: " 
DROP       all  --  anywhere             anywhere 

W systemie Debian domyślny plik logowania znajduje się tutaj: /var/log/messages ,  w systemie Ubuntu będzie to /var/log/kern.log . Po wyświetleniu tego pliku (poprzez polecenie cat lub tail -f powinny nam się pojawić pakiety, które zostały odrzucone przez nasz firewall.

Jun  1014:39:13 localhost kernel: IN=eth0 OUT= MAC=00:22:4d:87:b2:66:00:64:40:3a:fa:c0:08:00 SRC=192.168.10.11 DST=1922.168.10.10 TOS=0x00 PREC=0x00 TTL=41 ID=61889 DF PROTO=TCP SPT=17557 DPT=80 WINDOW=69 RES=0x00 ACK RST URGP=0

Temat firewalla jest rozległy i zależy od indywidualnych potrzeb – w tym krótkim poradniku starałem się opisać absolutne podstawy. Na koniec polecam kilka innych żródeł aby rozszerzyć wiedzę na temat linuxowego firewalla i pakietu iptables.

Do poczytania

  1. https://help.ubuntu.com/community/IptablesHowTo 
  2. http://ipset.netfilter.org/iptables.man.html
  3. http://www.thegeekstuff.com/2011/06/iptables-rules-examples/

Dodaj komentarz

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