CentOS 7 a firewalling a poznámka k DNS útokům

16.3.2015

V distribucích od RedHatu je instalován by default pro účely firewallingu systém firewalld. Je to použitelný nástroj, který je ale svým defaultním nastavením na jednu stranu příliš obecný a znepřehledňující situaci v případě, ze provozujeme vlastní server třeba někde (ale nejen) na VPS. Na straně druhé se v něm sice dají, ale nikterak slavně, realizovat složitější nastavení. Je to systém podle mého názoru spíše určený pro instalace, kde se nastavení sítě mění v čase (typicky notebooky, apod.).

Firewalld funguje jako frontend nad netfilterem, a proto je možné použít místo něj nativní nástroj spojený s netfilterem, kterým je iptables (ip6tables pro v6).

Už jsem na tomto blogu několikrát zmínil bezpečnost, kam firewalling patří a v tomto krátkém článku bych rád ukázal, jak se bezbolestně zbavit firewalld a nahradit jej iptables a přidal bych jednoduché pravidlo, které nás zbaví (v případě, že provozujeme autoritativni nameserver, který zaroveň nedělá rekurzivní nameserver) části problémů s obtěžujícím a škodlivým provozem na portu DNS služby.

Článel má pomoci lidem, kterým vadí přílišná košatost firewalld a neuvědomují si, že to není povinná služba a lidem, kteří řeší obtěžující provoz na DNS portech.

Všechny akce zde popisované provádíme jako root.

Instalace iptables frontendu

yum install iptables-services

Poznámka: balíky iptables-services a firewalld vedle sebe mohou existovat bez problému.

Zálohování pravidel firewalld a vytvoření konfigurace pro iptables

Zálohování pravidel firewalld má smysl jen v případě, že jste již nějaká vytvořili. Doporučuji nahradit firewalld iptables frontendem ve chvíli instalace serveru, ale tento krok pro jistotu uvádím také.

Vlastni zálohování provedeme příkazy:

iptables-save > ~/iptables
ip6tables-save > ~/ip6tables 

Pravidla si prohlédněte a protože jste je konfigurovali sami, tak víte, o co se jedná a můžete si z nich vzít to podstatné. U obyčejného serveru nejspíše budete mít pravidla, která povolují přístup na služby, které mají být dostupné zevně a nic dalšího složitého. RedHat má navíc defaultní konfiguraci, která jako základ není špatná.

BTW u RedHat like distribucí je doporučeno (pokud neprovozujete IPv6 konfiguraci sítě) nesnažit se násilně zakazovat IPv6 konfiguraci rozhraní, ale zakázat komunikaci tímto protokolem právě pomocí firewallu.

Připravte si konfigurační soubory pro iptables, které budou uloženy v /etc/sysconfig/iptables a /etc/sysconfig/ip6tables. Příklad bude na konci článku s popisem.

Odstranění firewalld

je také velmi jednoduché:

systemctl stop firewalld
yum remove firewalld

Nasazení vlastních iptables pravidel a zajištění natažení po startu

systemctl enable iptables
systemctl enable ip6tables
systemctl start iptables
systemctl start ip6tables

Iptables můžete konfigurovat buď tak, že použijete program stejnojmenného názvu a nebo naplněním či editací souborů, o kterých jsem psal výše. Popisuji konfigurační soubor, poněvadž pokud budete chtít upravovat pravidla online, tak použijete jako argument příkazu iptables to, co vidíte v konfiguračním souboru, jako parametr. Jen si dejte pozor na to, že záleží na pořadí pravidel.

Doporučuji prostudovat netfilter a iptables dokumentaci, pokud netfilter zatím neznáte. Zejména, co jsou chainy, tabulky, stavovost a spojení, jak jsou pravidla procházena a k čemu jednotlivé tabulky slouží a případně, jaké jsou extensions. K tomuto je spousta materiálů online, ale samozřejmě doporučuji man 8 iptables a man 8 iptables-extensions. Analogicky je to u IPv6.

Tam, kde je ve výpisu před za hashem číslo, tak následující řádek budu komentovat dále v textu s odkazem na toto číslo.

IPv4 konfigurace:

*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
#1
-A PREROUTING -s 147.23.89.12/32 -i eth0 -p tcp -m tcp --dport 33 -j DNAT --to-destination 31.31.74.248:2309
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
#2
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
#3
-A INPUT -p tcp -m tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT
-A INPUT -p tcp -m tcp --dport 53 -m conntrack --ctstate NEW -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT
-A INPUT -p tcp -m tcp --dport 2309 -m conntrack --ctstate NEW -j ACCEPT
#4
-A INPUT -i eth0 -p udp -m udp --dport 53 -m string --hex-string "|05|lamed|02|cz" --algo bm --to 65535 -j ACCEPT
#5
-A INPUT -j REJECT --reject-with icmp-host-prohibited
#6
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

Soubor začíná popisem pravidel pro tabulku nat, kde po definicích defaultních politik pro “systémové” chainy je jediné explicitní pravidlo #1, které zajišťuje přesměrování paketů jdoucích z IP adresy následující po parametru “-s” na TCP port 33 na port 2309 na tomto stroji. Je to jen příklad, který slouží pro ilustraci případu, kde byste museli použít u firewalld parametr “–direct”. Většinou na serveru, který slouží pro provoz běžných služeb pravidla pro tuto tabulku nevyužijete a konfigurační soubor může sestávat z definic za první direktivou “COMMIT”. Vizte níže v příkladu pro IPv6.

Následuje popis pravidel pro tabulku filter, kde opět po definicích defaultních politik systémových chainů je pravidlo #2, které říká, že všechny pakety související s již existujícím spojením jsou přijaty, dále pravidla povolující ICMP provoz a provoz z rozhraní loopback a pravidla #3 definující povolení vytváření nových spojení na tento server na příslušných UDP nebo TCP portech (zde http, tcp/dns, https a služba na portu 2309).

Pravidlo #4 nám zajišťuje již výše zmíněnou pomoc při obtěžujícím provozu na UDP port 53 pro službu DNS a to tak, ze jsou přijaty pouze pakety, které obsahují v payloadu (ve vlastním DNS dotazu) string “lamed.cz”. Uvažujeme, že zde běží pouze autoritativni nameserver (nikoliv rekurzivni resolver) a tedy chceme přijímat pouze dotazy na naší zónu a jinými dotazy neobtěžovat DNS službu. Čísla mezi “svislítky” říkají, kolik znaku má string bezprostředně za nimi. Tímto a následujícími pravidly nepropustíte na službu nameserveru provoz, který byste v rámci konfigurace nameserveru stejně zahodili a tudíž službě odlehčíte. Stejně tak podobné pravidlo můžete v kombinaci s dalšími použít ve chvíli, kdy provozujete rekurzivní nameserver (třeba i spolu s autoritativním) pro omezený rozsah IP adres klientů a nechcete, aby Vám dotazy zatěžovaly vlastní nameserver (samozřejmě je rozumné omezit zdroj dotazů i v jeho konfiguraci).

Všechny ostatni příchozí pakety jsou pravidlem #5 zahozeny a to samé se děje v pravidlu #6, které však platí pro pakety, které by měly být forwardovány (čemuž se lze vyhnout i tak a je to by default, že forwarding není povolen na úrovni systému).

IPv6 konfigurace:

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p ipv6-icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT
-A INPUT -p tcp -m tcp --dport 53 -m conntrack --ctstate NEW -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT
-A INPUT -p tcp -m tcp --dport 2309 -m conntrack --ctstate NEW -j ACCEPT
-A INPUT -i eth0 -p udp -m udp --dport 53 -m string --hex-string "|05|lamed|02|cz" --algo bm --to 65535 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp6-adm-prohibited
-A FORWARD -j REJECT --reject-with icmp6-adm-prohibited
COMMIT

Zde je situace obdobná, jen akceptujeme stejné porty, na kterých máme obsluhy služeb, kvůli kterým server existuje ve chvíli, kdy používáme i IPv6 protokol. Za zmínku stojí pouze to, že je zde u pravidel vedoucích k odmítnutí paketu uvést správný ICMP typ zprávy o odmítnutí přístupu k danému portu.

Pokud IPv6 neprovozujete, stačí jako defaultní politiku pro chainy “INPUT”, “FORWARD” a “OUTPUT” uvést místo povolujícího “ACCEPT” zakazující “DENY” a pak už jen “COMMIT”.

Jak jsem již psal, tento článek se zabývá zejména náhradou firewalld u RedHat like distribucí a ukázkou dvou složitějších pravidel, která nejsou moc firewalld related (i když je možné je nadefinovat). V praxi nejspíše použijete i pravidla, která Vám odmítnuté pakety zalogují, případně pravidla, která pomohou při zvládání DoS útoků, apod. O tom ale někdy příště.

  • obsah/bezpecnost/centos_firewalling.txt
  • Last modified: 2018/10/18 00:12
  • by profors