Modul 2 — Sítě a protokoly

11. Firewally a základní síťová bezpečnost (iptables/ufw)

Princip firewallů na Linuxu, filtrování provozu podle pravidel a praktická konfigurace pomocí ufw a iptables/nftables.

Odhadovaná délka studia: 55 minut · Stav: nehotovo

Technologie: Firewall a síťová bezpečnost

Úvod a kontext

Server, který naslouchá na síti, je potenciálním cílem útoku — čím víc
otevřených portů a služeb, tím větší tzv. útočná plocha (attack
surface). Firewall (síťová brána firewall) je základní nástroj, kterým
DevOps inženýr omezuje síťovou komunikaci jen na to, co je skutečně
potřeba: povolí SSH správcům, HTTP/HTTPS veřejnosti, ale zablokuje
přístup k interní databázi zvenčí. Tato lekce navazuje na lekce o
TCP/IP a portech a ukáže, jak firewall na Linuxu nakonfigurovat pomocí
ufw (jednoduché rozhraní vhodné pro většinu serverů) i pomocí
nižšího iptables/nftables.

Teorie

Co firewall dělá

Linuxový firewall pracuje na úrovni jádra (subsystém netfilter) a
rozhoduje o každém síťovém paketu podle sady pravidel — pustit
(ACCEPT), zahodit potichu (DROP), nebo zahodit s oznámením odesílateli
(REJECT). Pravidla se typicky vyhodnocují v pořadí shora dolů a první
shoda rozhoduje (přesné chování závisí na konkrétním nástroji a
řetězci pravidel).

Směry provozu: INPUT, OUTPUT, FORWARD

Klasický model iptables rozlišuje tři základní řetězce (chains):

  • INPUT — provoz směřující do tohoto stroje (např. příchozí
    SSH spojení).
  • OUTPUT — provoz odcházející z tohoto stroje (např. server
    volající externí API).
  • FORWARD — provoz, který tímto strojem jen prochází — relevantní
    pro stroje fungující jako router/brána mezi sítěmi (typicky ne pro
    běžný aplikační server).

Většina konfigurace serveru se soustředí na řetězec INPUT — kontrolu
toho, kdo se k serveru smí připojit a na jaký port.

Princip výchozí politiky (default deny)

Doporučená bezpečnostní praxe je default deny: výchozí politika
je "zamítnout vše" a explicitně se povolí jen porty/služby, které mají
být dostupné. Opačný přístup ("povolit vše, blokovat jen známé
problémy") je mnohem náchylnější k tomu, že se omylem nechá otevřená
zbytečná služba.

Stavová filtrace (stateful firewall)

Moderní firewally jsou stavové — sledují stav TCP spojení (nové,
navázané, související) a umožňují snadno vyjádřit pravidlo typu "povol
odpovědi na spojení, která jsme sami navázali, i když příchozí port
není explicitně otevřený". To umožňuje třeba serveru dělat odchozí
HTTPS požadavky (např. stahovat balíčky), aniž byste museli ručně
povolovat každý možný odpovědní port.

ufw vs. iptables/nftables

  • iptables (a jeho nástupce nftables) je nízkoúrovňové
    rozhraní přímo k netfilter — velmi flexibilní, ale syntakticky
    neforgivingí a snadné je udělat chybu.
  • ufw (Uncomplicated Firewall) je zjednodušená nadstavba nad
    iptables/nftables, běžná na Ubuntu/Debianu — pro typický server
    (povolit SSH, HTTP, HTTPS, zbytek zakázat) je rychlejší a méně
    chybová volba.
  • Cloudové platformy navíc často mají vlastní vrstvu firewallu na
    úrovni infrastruktury (AWS Security Groups, GCP Firewall Rules) —
    ty fungují nezávisle na firewallu uvnitř operačního systému a v
    praxi se často kombinují (firewall na úrovni cloudu jako první
    obranná linie, ufw/iptables na serveru jako druhá).

Praktický příklad

Základní nastavení ufw na čerstvém serveru — nejdřív se musí
povolit SSH, jinak si administrátor po zapnutí firewallu sám zablokuje
přístup:

$ sudo ufw default deny incoming
$ sudo ufw default allow outgoing
$ sudo ufw allow OpenSSH        # nebo: sudo ufw allow 22/tcp
$ sudo ufw allow 80/tcp
$ sudo ufw allow 443/tcp
$ sudo ufw enable
Firewall is active and enabled on system startup

$ sudo ufw status verbose
Status: active
Default: deny (incoming), allow (outgoing), disabled (routed)

To                         Action      From
--                         ------      ----
22/tcp (OpenSSH)           ALLOW IN    Anywhere
80/tcp                     ALLOW IN    Anywhere
443/tcp                    ALLOW IN    Anywhere

Omezení přístupu jen z konkrétní IP adresy (typicky pro administrativní
porty nebo interní služby, např. databázi dostupnou jen z aplikačního
serveru):

$ sudo ufw allow from 203.0.113.5 to any port 5432 proto tcp

Odebrání pravidla a vypnutí konkrétního portu:

$ sudo ufw delete allow 8080/tcp

Ekvivalentní logika přímo v iptables (pro srovnání, jak vypadá na
nižší úrovni) — nastavení výchozí politiky deny a povolení SSH, HTTP,
HTTPS a už navázaných spojení:

$ sudo iptables -P INPUT DROP
$ sudo iptables -A INPUT -i lo -j ACCEPT
$ sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# Uložení pravidel, aby přežila restart (na Debian/Ubuntu)
$ sudo apt install iptables-persistent
$ sudo netfilter-persistent save

Řádek -i lo -j ACCEPT je důležitý — povoluje veškerý provoz na
loopback rozhraní (127.0.0.1), který používají lokální služby mezi
sebou (např. aplikace připojující se k databázi na localhost) a
neměl by být blokován.

Rychlá diagnostika, jestli je problém "port zablokovaný firewallem" vs.
"služba vůbec neběží": pokud ss -tulpn na serveru ukazuje, že služba
naslouchá, ale nc -zv zvenčí selže, je vysoce pravděpodobné, že
firewall (na serveru nebo v cloudové vrstvě) daný port blokuje.

Shrnutí

Firewall filtruje síťový provoz podle pravidel na úrovni portů,
protokolů a zdrojových/cílových adres a je základní obrannou linií
serveru. Doporučená praxe je výchozí politika "deny" s explicitním
povolením jen potřebných služeb, přičemž stavová filtrace umožňuje
bez komplikací povolit odpovědi na spojení navázaná samotným serverem.
Nástroj ufw nabízí jednoduché rozhraní nad iptables/nftables pro
běžné případy; cloudové platformy navíc přidávají vlastní vrstvu
firewallu na úrovni infrastruktury.

Kontrolní otázky

  1. Co znamená princip "default deny" a proč je bezpečnější než
    "default allow"?
  2. Jaké tři standardní řetězce rozlišuje iptables a který z nich je
    nejrelevantnější pro běžný aplikační server?
  3. Proč je nutné povolit provoz na rozhraní lo (loopback) i při
    striktním firewallu?
  4. Server má ss -tulpn ukazuje naslouchající službu na portu 443, ale
    klient zvenčí se přes nc -zv server 443 nemůže připojit. Jaké je
    nejpravděpodobnější vysvětlení a jak byste to ověřili?

Lekce na sebe nejsou zamčené — libovolnou lekci můžete otevřít i označit jako hotovou v jakémkoliv pořadí.