Hardening je zpevňování systému proti útoku — postupné ubírání všeho zbytečného, co by mohl útočník zneužít. Neexistuje jedno tlačítko „udělej to bezpečné": je to řemeslo postavené na dvou myšlenkách. Minimalizuj plochu útoku (čím míň běží, poslouchá a je nainstalováno, tím míň se dá napadnout) a least privilege (každý program a člověk má jen ta práva, která opravdu potřebuje — nic navíc). Když tyhle dvě věci pochopíš, zbytek téhle kapitoly už je jen praktické „jak".
Pár pojmů na úvod
- Plocha útoku (attack surface) = souhrn všech míst, kudy se dá do systému dostat: otevřené porty, běžící služby, nainstalované balíčky, uživatelské účty. Menší plocha = míň dveří, které musíš hlídat.
- Least privilege (nejmenší oprávnění) = zásada, že proces i člověk dostane jen minimum práv nutných
pro svou práci. Web server nepotřebuje být root; ty běžně taky ne (od toho je
sudo). - Hardening = proces zpevňování — odebírání zbytečného, zavírání otevřeného, utahování konfigurace.
- Security by obscurity = „schovám to, tak to nikdo nenajde" (např. SSH na nestandardním portu). Není to obrana, jen zdržení — pořád musíš mít pod tím skutečné zabezpečení.
- MFA (vícefaktorové ověření) = přihlášení chce víc než jen heslo (např. heslo + kód z aplikace). I když ti heslo unikne, útočník bez druhého faktoru dovnitř nevleze.
- fail2ban = démon, který čte logy a banuje IP adresy, co opakovaně zkoušejí uhodnout heslo.
Princip: patch, minimize, isolate, monitor
Celý hardening se dá shrnout do čtyř sloves — v tomhle pořadí důležitosti:
- Patch (aktualizuj) — drž systém záplatovaný. Zdaleka nejúčinnější jediná věc, kterou uděláš.
- Minimize (zmenši) — odinstaluj a vypni, co nepotřebuješ. Co neběží, to se nedá napadnout.
- Isolate (izoluj) — omez práva a přístup: least privilege, firewall, SELinux, oddělené účty.
- Monitor (sleduj) — dívej se do logů, ať poznáš, že se něco děje (
journalctl, fail2ban).
💡 Kdybys měl udělat jen jedinou věc, jsou to aktualizace. Drtivá většina reálných průniků nevyužívá geniální nový trik, ale starou známou díru, na kterou dávno existuje záplata — jen ji nikdo nenainstaloval.
Aktualizace — nejdůležitější jediná věc
Neaktualizovaný systém je největší díra vůbec. Každá zveřejněná zranitelnost je návod pro útočníka; záplata je oprava, kterou stačí nainstalovat. Ruční updaty se ale zapomínají — proto je zautomatizuj.
# Ruční update (Fedora/RHEL)
sudo dnf upgrade --refresh
# Jen bezpečnostní záplaty
sudo dnf upgrade --security
Automatické bezpečnostní updaty přes dnf-automatic (na Debianu/Ubuntu unattended-upgrades):
sudo dnf install dnf-automatic # na novější Fedoře (dnf5) je balík dnf5-plugin-automatic
# nastav v configu (dnf4: /etc/dnf/automatic.conf, dnf5: /etc/dnf/dnf5-plugins/automatic.conf):
# upgrade_type = security
# apply_updates = yes
sudo systemctl enable --now dnf-automatic.timer # dnf5: dnf5-automatic.timer
🚩 Pozor u serverů: automatické updaty jsou skvělé, ale některé (např. jádro nebo databáze) chtějí restart nebo dohled. Nastav si
reboot = nevera restartuj ve zvoleném okně, ať ti služba nespadne uprostřed provozu bez tvého vědomí.
SSH hardening
SSH je nejčastější vstup na server — a proto nejčastější cíl útoku. Boty nonstop zkoušejí uhodnout
hesla na portu 22. Tři nastavení v /etc/ssh/sshd_config (nebo v souboru v /etc/ssh/sshd_config.d/)
udělají většinu práce:
# /etc/ssh/sshd_config
PasswordAuthentication no # jen klíče — heslo se nedá uhodnout, když neexistuje
PermitRootLogin no # root je nejběžnější terč botů — půlka práce hádání odpadá
PubkeyAuthentication yes # přihlášení SSH klíčem
Po změně ověř konfiguraci a restartuj službu:
sudo sshd -t # zkontroluje syntax (neztiš se ven!)
sudo systemctl restart sshd
- Jen klíče (
PasswordAuthentication no) — SSH klíč je pár: soukromý zůstává u tebe, veřejný dáš na server (~/.ssh/authorized_keys). Uhodnout se nedá; heslo ano. Než heslo vypneš, ověř si, že se klíčem opravdu přihlásíš — jinak se sám zamkneš ven. PermitRootLogin no— root je univerzální jméno, které zná každý útočník. Přihlaš se běžným účtem a povyš se přessudo. Ubereš tím půlku hádací práce botům.- Nestandardní port je jen doplněk. Přesun z 22 na jiný port sníží šum v logách, ale není to obrana — je to security by obscurity. Kdo umí skenovat porty (a to umí každý bot), tě najde. Nikdy jím nenahrazuj klíče, ber ho jen jako doplněk navrch skutečného zabezpečení.
💡 Nestandardní port ti ubere 99 % automatického šumu v logách, takže se ti pak líp hledají cílené útoky. Ale kdyby to bylo tvoje jediné opatření, jsi nahý — pořád platí: klíče, žádná hesla, ne-root.
fail2ban — ban po opakovaných pokusech
I s vypnutými hesly stojí za to omezit hrubou sílu. fail2ban čte logy (např. SSH), a když z jedné IP přijde moc neúspěšných pokusů za krátký čas, na chvíli ji zabanuje ve firewallu.
sudo dnf install fail2ban
sudo systemctl enable --now fail2ban
Základní nastavení (vlastní konfig se píše do /etc/fail2ban/jail.local, ne do jail.conf):
# /etc/fail2ban/jail.local
[sshd]
enabled = true
maxretry = 5 # kolik pokusů se toleruje
bantime = 1h # jak dlouho IP sedí v banu
findtime = 10m # v jakém okně se pokusy počítají
sudo fail2ban-client status sshd # kdo je zrovna zabanovaný
fail2ban nenahrazuje klíče ani firewall — je to další vrstva (obrana do hloubky). Zpomalí a odežene otravné boty, ať se nemlátí do dveří donekonečna.
Firewall — zavři, co neposloucháš
Firewall rozhoduje, které porty jsou zvenku dosažitelné. Zásada je jednoduchá: výchozí zamítnout, povolit jen to, co opravdu nabízíš. Firewall má vlastní kapitolu — tady jen princip a rychlá kontrola.
# Co vůbec na stroji poslouchá po síti?
sudo ss -tulnp
# firewalld: co je otevřené (na Ubuntu obdobně `sudo ufw status`)
sudo firewall-cmd --list-all
Když v ss uvidíš službu, kterou nikdo nepotřebuje, máš dvě možnosti — buď ji zavři ve firewallu,
nebo (lepší) vypni celou službu, ať vůbec neběží. Otevřený port, za kterým nic nemá poslouchat, je
zbytečná díra.
📎 Detaily (
firewalld, zóny,nftables) najdeš v kapitole o firewallu. Pro hardening si zapamatuj jen: co nenabízíš, to nemá být zvenku vidět.
Vypni a odinstaluj nepotřebné služby
Každá běžící služba je kus kódu, který může mít chybu. Míň běžících = míň děr. Projdi, co startuje, a co nepotřebuješ, vypni nebo rovnou odinstaluj.
systemctl list-units --type=service --state=running # co teď běží
systemctl list-unit-files --state=enabled # co startuje po bootu
sudo systemctl disable --now cups.service # zastav + vypni ze startu
sudo dnf remove <balík> # nejlepší: úplně odinstaluj
disable --nowslužbu zastaví teď a odebere ze startu po rebootu.stopsamotný ji jen zastaví do příštího restartu — po bootu naběhne znovu.- Odinstalovat je čistší než jen vypnout: co na disku není, to se ani omylem nespustí a nemusíš to záplatovat. Tiskový server (CUPS) na headless serveru, Bluetooth na cloud VPS — pryč s tím.
Least privilege v praxi: účty, hesla, sudo
- Nepracuj jako root. Měj běžný účet a práva zvyšuj přes
sudojen na jednotlivé příkazy. Získáš tím auditní stopu (kdo co spustil) a omezíš škody z překlepu i z napadeného účtu. - Silná hesla / MFA. Tam, kde hesla zůstávají (login, sudo, disková šifra), ať jsou dlouhá a unikátní. Kde to jde, přidej MFA — heslo samo nestačí.
- Žádné sdílené účty. Každý člověk vlastní účet. Sdílený „admin" účet znamená, že v logu nepoznáš, kdo co udělal, a odchod jednoho člověka nutí měnit heslo všem. Least privilege = i oddělená identita.
sudo -l # co smím přes sudo spouštět
passwd -S <uživatel> # stav hesla účtu (L = zamčený, P = má heslo)
SELinux / AppArmor nech zapnutý
SELinux (Fedora/RHEL) a AppArmor (Ubuntu/Debian) jsou systémy povinné kontroly přístupu (MAC): i když nějaká služba běží jako root a útočník ji ovládne, MAC ji drží v ohrádce — nesmí sáhnout mimo to, co má povoleno. Je to poslední záchranná síť, když ostatní vrstvy selžou.
getenforce # Enforcing = zapnuto a vynucuje (to chceš)
sudo setenforce 1 # přepne enforcing↔permissive teď; z 'disabled' až po rebootu (trvale v /etc/selinux/config)
🚩 Nejčastější začátečnická chyba: „něco nejde, tak vypnu SELinux". Tím zahodíš celou vrstvu obrany. Správně je zjistit, co blokuje (
ausearch -m avc,journalctl), a přidat cílenou výjimku — ne vypnout ochranu pro celý systém. Detaily má samostatná kapitola.
Failure modes — časté chyby
- Root přes SSH a hesla povolená. Kombinace, kterou boti milují — znají jméno účtu (
root) i způsob (hádání hesla). Řešení:PermitRootLogin no+PasswordAuthentication no+ klíče. - Žádné aktualizace. „Běží to, nesahám na to." Za pár měsíců jedeš na desítkách veřejně známých děr. Jediné nejdůležitější opatření se ignoruje. Zapni automatické bezpečnostní updaty.
- Otevřené porty, co nikdo nepotřebuje. Databáze, admin panel nebo debug server viditelný do internetu
„protože to tak nějak naběhlo". Zkontroluj
ss -tulnpa zavři/vypni, co nemá poslouchat ven. - Spoléhání na obskurní port místo klíčů. „Přesunul jsem SSH na 2222, jsem v bezpečí." Nejsi — sken portů tě najde za vteřiny. Port je doplněk, ne náhrada za klíče a ne-root.
- Sdílené účty. Jeden „admin" pro celý tým. Nikdo neví, kdo co udělal, heslo koluje, odchod člověka =
problém. Každý ať má vlastní účet a
sudo. - Vypnutý SELinux „ať to jede". Zahodíš celou vrstvu, která by útočníka udržela v ohrádce. Místo vypínání přidej cílenou výjimku pro konkrétní službu.
🛠️ Cvičení
- Zmapuj plochu útoku. Zjisti, co na tvém stroji poslouchá po síti, a u každé položky si řekni,
jestli to opravdu potřebuješ zvenku. (Nápověda:
ss -tulnp.) Co bys vypnul? - Utáhni SSH na papíře. Napiš tři řádky do
sshd_config, které vypnou hesla a přímé přihlášení roota. Jaký příkaz spustíš před restartem služby, aby ses omylem nezamkl ven? - Zapni automatické záplaty. Najdi, jak na tvé distribuci zapnout automatické bezpečnostní updaty,
a rozmysli, proč u serveru chceš
reboot = nevermísto automatického restartu. - Najdi a vypni zbytečnou službu. Vypiš běžící služby, vyber jednu, kterou daný stroj nepotřebuje (třeba tiskový CUPS na serveru), a napiš příkaz, který ji zastaví i odebere ze startu.
- Rozhodni o SELinuxu. Zjisti, v jakém režimu SELinux běží. Kamarád radí ho vypnout, „protože mu něco blokoval". Co mu poradíš místo toho?
Náčrt řešení — rozbal, až si cvičení zkusíš sám
- Plocha útoku —
sudo ss -tulnpvypíše poslouchající TCP/UDP porty a proces za nimi. U každého se ptej: nabízím tuhle službu ven schválně? Když ne, buď ji vypni (systemctl disable --now), nebo zavři ve firewallu. Pozor:127.0.0.1/::1znamená „jen lokálně" — to zvenku vidět není, takže to tak nebezpečné není jako0.0.0.0/*. - SSH — do
sshd_config(nebo souboru vsshd_config.d/):PasswordAuthentication no,PermitRootLogin no,PubkeyAuthentication yes. Před restartem spusťsudo sshd -t(ověří syntax) a hlavně si v druhém okně ověř, že se přihlásíš klíčem — jinak se po restartu zamkneš ven. Pozor: nikdy nezavírej jediné SSH spojení, dokud si nový login neotestuješ. - Automatické záplaty — na Fedoře
sudo dnf install dnf-automatic, v/etc/dnf/automatic.confnastavupgrade_type = securityaapply_updates = yes, paksudo systemctl enable --now dnf-automatic.timer(na Debianuunattended-upgrades).reboot = neverchceš proto, aby ti server nespadl do restartu uprostřed provozu bez dozoru — jádro a databáze restartuješ v naplánovaném okně sám. Pozor: aktualizace jsou nejdůležitější jediné opatření vůbec. - Zbytečná služba —
systemctl list-units --type=service --state=runningukáže běžící služby;sudo systemctl disable --now cups.serviceji zastaví teď i odebere ze startu. Ještě lepší jesudo dnf remove cups, ať vůbec není na disku. Pozor:stopbezdisablevydrží jen do rebootu — po bootu služba naběhne znovu. - SELinux —
getenforceukáže režim; chcešEnforcing. Kamarádovi neporaď vypnout, ale zjistit, co blokuje (sudo ausearch -m avc -ts recent,journalctl) a přidat cílenou výjimku pro tu jednu službu. Vypnutím SELinuxu zahodí ochranu pro celý systém kvůli jednomu problému. Pozor:setenforce 0je jen dočasné do rebootu, natrvalo se to řídí v/etc/selinux/config.
🧠 Otázky & odpovědi
Co znamená minimalizovat plochu útoku a proč je to důležité?
Plocha útoku jsou všechna místa, kudy se dá do systému dostat — otevřené porty, běžící služby, nainstalované balíčky, uživatelské účty. Čím je jich víc, tím víc věcí musíš hlídat a záplatovat a tím větší šance, že v některé bude díra. Minimalizovat ji znamená ubrat všechno zbytečné: vypnout a odinstalovat služby, které nepoužíváš, zavřít porty, které nic nenabízejí. Co neběží a není nainstalováno, to se prostě nedá napadnout — proto je méně vždycky bezpečnější.
Proč u SSH vypínat hesla a povolit jen klíče?
Heslo se dá uhodnout hrubou silou — boti nonstop zkoušejí tisíce kombinací na port 22. SSH klíč je
naopak pár: soukromý zůstává jen u tebe, veřejný dáš na server. Uhodnout se prakticky nedá a bez
soukromého klíče se nikdo nepřihlásí, i kdyby znal jméno účtu. Nastavením PasswordAuthentication no
tenhle celý útočný vektor zavřeš — nedá se hádat něco, co neexistuje. Než hesla vypneš, vždycky si ale
ověř, že se klíčem opravdu přihlásíš, ať se sám nezamkneš ven.
Je bezpečné jen přesunout SSH na nestandardní port?
Ne jako jediné opatření. Přesun z portu 22 jinam je security by obscurity — sníží šum od automatických botů a zpřehlední logy, ale není to obrana. Kdokoli umí skenovat porty (a to umí každý útočník) tě najde za pár vteřin. Nestandardní port ber jako doplněk navrch skutečného zabezpečení: klíče místo hesel, zákaz root loginu, fail2ban. Sám o sobě tě neochrání, jen trochu zdrží — a spoléhat se na něj je klasická chyba, po které přijde nepříjemné probuzení.
Co udělat jako první, když mám zabezpečit server?
Aktualizovat a zapnout automatické bezpečnostní záplaty. Je to jediné nejúčinnější opatření, protože drtivá většina reálných průniků nevyužívá nový geniální trik, ale starou známou díru, na kterou dávno existuje záplata — jen ji nikdo nenainstaloval. Pak pokračuj podle hesla patch, minimize, isolate, monitor: zmenši plochu útoku (vypni zbytečné služby a porty), izoluj (least privilege, firewall, SELinux) a sleduj logy. Ale kdybys měl čas jen na jednu věc, jsou to updaty.
Proč nepracovat rovnou jako root a k čemu je sudo?
Protože root může všechno — a překlep nebo napadený proces s právy roota může zničit celý systém. Zásada
least privilege říká, že máš mít jen ta práva, která zrovna potřebuješ. Běžnou práci děláš pod obyčejným
účtem a přes sudo si zvyšuješ práva jen na jednotlivé příkazy, kde je to nutné. Získáš tím i auditní
stopu — v logu je vidět, kdo co přes sudo spustil, což u sdíleného rootu nikdy nezjistíš. Míň stálých
práv znamená míň škody, když se něco pokazí.
