NFsec Logo

Tworzenie firewalla z linii poleceń serwera

28/09/2009 w Hacks & Scripts Brak komentarzy.  (artykuł nr 164, ilość słów: 869)

P

rzedstawiony hack jest tłumaczeniem “Creating a Firewall from the Command Line of any Server” z książki “Linux Servers Hacks” autorstwa Rob’a Flickenger’a dostępnionym on-line (Hack #45) na stronie http://hacks.oreilly.com. Do tłumaczenia zostało dodane także parę informacji od tłumacza.

   Firewall (dalej zwany zaporą) na podstawie netfilter (dostępny w Linuksie 2.4 i nowszych wersjach) daje bardzo szerokie możliwości obsługi za pomocą wiesza poleceń. Do używania programu iptables trzeba przez pewien czas się przyzwyczajać, lecz ma on bardzo intuicyjną składnię i pozwala tworzyć skomplikowane (i, miejmy nadzieję, użyteczne ;) reguły zapory.

Nawet jeśli Twoja maszyna nie jest “prawdziwą” zaporą (tj. ma tylko jedną kartę sieciową i nie chroni innych maszyn), funkcja filtra mogą się bardzo przydać. Zakładając, że ten komputer ma być dostępny poprzez program telnet (w razie gdyby coś się stało z programem ssh lub jego bibliotekami), lecz nie ze wszystkich miejsc w Sieci. Możemy do tego użyć programu tcpwrapper (tworząc wpisy w plikach /etc/hosts.allow i /etc/hosts.deny, oraz odpowiednio konfigurując plik /etc/inetd.conf). Lub w następujący sposób można też użyć programu iptables:

iptables -A INPUT -t filter -s ! 208.201.239.36 -p tcp --dport 23 -j DROP

Generalnie większość ludzi (administratorów systemu) chce zezwolić na nieograniczony dostęp z zaufanych hostów, zablokować wszelki dostęp z hostów sprawiających problemy oraz dopuścić jakiś rodzaj pośredniego dostępu dla wszystkich innych. Jest to metoda jednoczesnego stosowania białej listy, czarnej listy i zasad ograniczonego dostępu do portów:

#!/bin/sh
#
# Prosty skrypt inicjalizacji zapory
#
WHITELIST=/usr/local/etc/whitelist.txt
BLACKLIST=/usr/local/etc/blacklist.txt
ALLOWED="22 25 80 443"
#
# Usunięcie wszystkich dotychczasowych reguł
#
iptables -F
#
# Najpierw używamy białej listy ($WHITELIST), 
# akceptując cały ruch z komputerów i sieci tam wskazanych.
# 
#
for x in `grep -v ^# $WHITELIST | awk '{print $1}'`; do 
echo "Dopuszczam $x..."
iptables -A INPUT -t filter -s $x -j ACCEPT
done
#
# Następnie używamy czarnej listy ($BLACKLIST),
# odrzucając cały ruch z komputerów i sieci tam wskazanych.
#
for x in `grep -v ^# $BLACKLIST | awk '{print $1}'`; do 
echo "Blokuje $x..."
iptables -A INPUT -t filter -s $x -j DROP
done
#
# Teraz dozwolone porty: Co będziemy akceptować z hostów
# będących na naszej czarnej liście?
#
for port in $ALLOWED; do 
echo "Akceptuje port $port..."
iptables -A INPUT -t filter -p tcp --dport $port -j ACCEPT
done
#
# W końcu, jeśli coś nie jest wskazane wyżej oraz jest wewnętrznym
# żądaniem startowym, po prostu je odrzucamy.
#
iptables -A INPUT -t filter -p tcp --syn -j DROP

Należy się upewnić, aby wszystkie akceptowane porty określić w zmiennej $ALLOWED na początku skryptu. Jeśli zapomnisz dołączyć portu 22, nie będziesz mógł połączyć się ze swoją skrzynką przez SSH. Plik /usr/local/etc/blacklist.txt zawiera adresy IP, nazwy hostów oraz sieci wg. schematu:

1.2.3.4 # Skanowanie portów w dniu 8/15/02
7.8.9.0/24 # r00tb0y.script-kiddie.coop $0 s0rR33 u 31337 h4x0r!
(tak mi przykro elitarny hakierze)

Analogicznie plik /usr/local/etc/whitelist.txt zawiera dobrych kolesi, którzy powinni mieć dostęp bez względu na pozostałe reguły:

11.22.33.44 # Moja stacja robocza
208.201.239.0/26 # Sieć lokalna

Ponieważ skutek odnoszą tylko wiersze, które nie zaczynają się od znaku # (hasz), w razie potrzeby możemy cały umieścić w komentarzu. Następnym razem jak odpalisz skrypt, wpisy w komentarzach zostaną zignorowane. Na początku uruchamiamy polecenie: iptables -F, aby oczyścić wszystkie istniejące wpisy filtru, by można było po prostu ponownie uruchomić skrypt, kiedy zmieniono pliki blacklist.txt, whitelist.txt lub porty określone w zmiennej $ALLOWED.

Warto też zauważyć, że ten skrypt dopuszcza tylko połączenia TCP. Jeśli potrzebujesz obsługi protokołu UDP, ICMP lub innego, dołącz kolejny przebieg, taki jak dla zmiennej $ALLOWED w pętli for, ale dołącz dodatkowe porty i protokoły (przekazując np. parametr -p udp lub -p icmp programowi iptables).

Bądź ostrożny z białymi listami. Wszystkie adresy IP lub sieci z tej listy będą miały dostęp do wszystkich portów komputera. W pewnych okolicznościach sprytny włamywacz może wysyłać sfałszowane pakiety, które będą wyglądać na pochodzące z tych adresów IP, o ile ten włamywacz będzie w stanie przewidzieć (lub wywnioskować), które adresy IP pojawią się na białej liście. Ten typ ataku jest trudny do przeprowadzenia, ale nie jest niemożliwy. Jeśli cierpisz na paranoję, to na białej liście możesz uwzględnić tylko adresy sieci, które nie są trasowane przez Internet, lecz są używane w sieci wewnętrznej.

Niezwykle przydatny jest dostęp do konsoli podczas pracy z nowymi regułami zapory (programem iptables nie można zablokować sobie konsoli!). Jeśli już pogubisz się we wszystkich regułach programu iptables, pamiętaj, że można je wszystkie wyświetlić poleceniem: iptables -L i rozpocząć od nowa, wydając polecenie: iptables -F. Jeśli wydaje się, że polecenie iptables -L powoduje zawieszenie, spróbuj użyć polecenia: iptables -L -n, aby wyświetlić reguły bez rozpoznawania adresów przez DNS – reguły mogą przypadkowo blokować żądania DNS.

Proste filtry dają naprawdę dużo różnych możliwości, ale program iptables to nie tylko filtrowanie ruchu.

Bonus:Poniżej zamieszczam bardziej bezpieczną zaporę autorstwa dawa@did-it.com, która dopuszcza tylko hosty z białej listy blokując całą resztę:

#!/bin/sh
#
# Prosty skrypt inicjalizacji zapory
#
WHITELIST=/usr/local/etc/whitelist.txt
ALLOWED="22 25 80 443"
#
# Usunięcie wszystkich dotychczasowych reguł
#
iptables -F
#
# Najpierw używamy białej listy ($WHITELIST),
# akceptując cały ruch z komputerów i sieci tam wskazanych.
#
# Zazwalamy na ruch z lokalnego hosta.
iptables -A INPUT -t filter -s 127.0.0.1 -j ACCEPT

for x in `grep -v ^# $WHITELIST | awk '{print $1}'`; do
echo "Zezwalam $x..."
for port in $ALLOWED; do
echo "Akceptuje port $port..."
iptables -A INPUT -t filter -s $x -p tcp --dport $port -j ACCEPT
done
done
#
# W końcu, jeśli coś nie jest wskazane wyżej oraz jest wewnętrznym
# żądaniem startowym, po prostu je odrzucamy.
#
iptables -A INPUT -t filter -p tcp --syn -j DROP

Więcej informacji: Netfilter HowTo, man iptables, Hacks O’Reilly

Kategorie K a t e g o r i e : Hacks & Scripts

Tagi T a g i : , , , , ,

Komentowanie tego wpisu jest zablokowane.