fail2ban proti pokusům o uhodnutí hesla
Modul 5: Zabezpečení sítě · Doba čtení: 10 min.
Cíl lekce: Po této lekci budete umět nastavit fail2ban pro SSH, číst jeho stav a log, znovu odblokovat adresu a vysvětlit, co fail2ban chrání a co ne.
Klíčové pojmy: brute force, jail, filtr, akce (banaction), maxretry, findtime, bantime, bantime.increment, ignoreip, backend systemd, jail.conf, jail.local a jail.d, fail2ban-client, recidive
Zkoušeči klik na internetu
Podívejte se den po instalaci do logu SSH a uvidíte to: stovky pokusů o přihlášení se jmény jako root, admin, test, ubuntu a oracle, z adres z celého světa.
anna@web1:~$ sudo journalctl -u ssh --since today | grep -c "Invalid user"
412
anna@web1:~$ sudo journalctl -u ssh --since today | grep "Invalid user" | tail -n 3
nov 09 14:02:11 web1 sshd-session[20311]: Invalid user admin from 203.0.113.77 port 51522
nov 09 14:02:13 web1 sshd-session[20313]: Invalid user oracle from 203.0.113.77 port 51544
nov 09 14:02:16 web1 sshd-session[20315]: Invalid user test from 203.0.113.77 port 51560(Na Ubuntu se služba jmenuje ssh, na AlmaLinux a Rocky sshd. Název procesu může být sshd nebo sshd-session, podle verze OpenSSH.) To je útok hrubou silou (brute force): boti, kteří prostě zkoušejí všechna běžná jména a hesla. Pokud se přihlašujete klíči a přihlášení heslem máte vypnuté (lekce 2.2), nikdy se dovnitř nedostanou, ať to zkoušejí jakkoli často. Zaplňují ale Váš log, stojí trochu výpočetního výkonu a u služeb, kde heslo potřeba je (webmail, administrační panel), mohou být opravdu nebezpeční.
fail2ban čte logy, rozpoznává neúspěšné pokusy a adresu, která selže příliš často, na nějakou dobu zablokuje ve firewallu.
Jak fail2ban uvažuje: jaily
fail2ban pracuje s jaily (celami). Jail kombinuje tři věci:
- filtr: regulární výrazy, které v logu rozpoznají neúspěšné pokusy (například řádek "Invalid user ... from <adres>");
- akci: co se stane při příliš mnoha pokusech, obvykle pravidlo firewallu, které adresu zablokuje (
banaction, na Debianu 13 standardně přes nftables); - prahové hodnoty: kolik neúspěšných pokusů (
maxretry) za jakou dobu (findtime) vede k blokaci na jak dlouho (bantime).
Výchozí hodnoty z jail.conf jsou: maxretry = 5, findtime = 10m, bantime = 10m. Tedy: pět neúspěšných pokusů během deseti minut znamená deset minut blokace.
Instalace a past Debianu 12
anna@web1:~$ sudo apt install fail2ban
anna@web1:~$ sudo systemctl status fail2banNa Debianu a Ubuntu je jail pro SSH ([sshd]) po instalaci už zapnutý, a to přes soubor /etc/fail2ban/jail.d/defaults-debian.conf.
Existuje jedna známá past. fail2ban musí vědět, kde log je. Dříve to byl textový soubor /var/log/auth.log. Od Debianu 12 se rsyslog standardně neinstaluje a zprávy jsou jen v journalu systemd (lekce 6.2). Balíček fail2ban v Debianu 12 stále hledal /var/log/auth.log, nenašel ho a nespustil se. Debian 13 to vyřešil tím, že v defaults-debian.conf nastavil pro SSH backend = systemd. Na Debianu 12 to vyřešíte sami (viz níže) stejným způsobem. Ubuntu má rsyslog standardně stále nainstalovaný, ale backend = systemd funguje i tam.
Vaše vlastní nastavení: jail.local
Soubor jail.conf nikdy neupravujte: při aktualizaci se nahradí. Vlastní nastavení dejte do /etc/fail2ban/jail.local nebo do souboru v /etc/fail2ban/jail.d/ s příponou .local:
# /etc/fail2ban/jail.d/eigen.local
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
bantime.increment = true
ignoreip = 127.0.0.1/8 ::1 198.51.100.20
[sshd]
enabled = true
backend = systemdCo jednotlivé řádky dělají:
bantime = 1h: hodina blokace místo deseti minut.bantime.increment = true: kdo se po blokaci vrátí, dostane pokaždé delší blokaci.ignoreip: adresy, které se nikdy neblokují. Uveďte sem pevnou IP adresu své kanceláře, pokud ji máte. Nedávejte sem "pro jistotu" velké rozsahy.backend = systemd: číst journal místo textového souboru (nutné na Debianu 12, doporučené všude). K tomu musí být nainstalovaný balíčekpython3-systemd; obvykle už je nainstalovaný jako závislost.
Znovu načíst a zkontrolovat:
anna@web1:~$ sudo fail2ban-client -t # otestovat konfiguraci
OK: configuration test is successful
anna@web1:~$ sudo systemctl reload fail2ban
anna@web1:~$ sudo fail2ban-client status
Status
|- Number of jail: 1
`- Jail list: sshdČtení stavu, blokování a odblokování
anna@web1:~$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 3
| |- Total failed: 1288
| `- Journal matches: _SYSTEMD_UNIT=ssh.service + _COMM=sshd
`- Actions
|- Currently banned: 2
|- Total banned: 117
`- Banned IP list: 203.0.113.77 198.51.100.140"Currently failed" jsou adresy, které už pokusy udělaly, ale zatím nepřekročily práh. "Currently banned" jsou adresy, které jsou právě zablokované.
Pokud jste zablokovali sami sebe (například tím, že jste to několikrát zkusili se špatným klíčem nebo uživatelským jménem), přihlaste se přes jinou síť nebo konzoli a svou adresu odblokujte:
anna@web1:~$ sudo fail2ban-client set sshd unbanip 198.51.100.20Log samotného fail2ban je v /var/log/fail2ban.log a ukazuje, kdy byla která adresa zablokována a odblokována:
2026-11-09 14:02:16,903 fail2ban.actions [811]: NOTICE [sshd] Ban 203.0.113.77
2026-11-09 15:02:17,120 fail2ban.actions [811]: NOTICE [sshd] Unban 203.0.113.77Opakovaní útočníci: recidive
Někteří boti se po každé blokaci prostě vrátí. Proti nim máte dva prostředky. bantime.increment (viz výše) prodlužuje blokaci pokaždé. Kromě toho existuje jail recidive: čte log samotného fail2ban a adresu, která byla během jednoho dne často blokována, zablokuje na týden na všech portech. Zapnete ho ve svém souboru .local:
[recidive]
enabled = trueCo fail2ban dělá a co ne
fail2ban je užitečný, ale není to zámek na dveřích. Zámkem je přihlašování klíčem s vypnutými hesly (lekce 2.2). Proto také vězte, co fail2ban nedokáže:
- Rozprostřený útok z tisíců adres, z nichž každá udělá jeden nebo dva pokusy, nikdy nepřekročí
maxretry. - Slabé heslo zůstane slabé. fail2ban hádání zpomalí, nic víc.
- Jen to, co je v logu: službu, která neúspěšné pokusy nezaznamenává, nebo log, který fail2ban nečte, neuvidí.
- Docker: blokace v běžném řetězci firewallu neplatí pro publikované porty kontejnerů (lekce 9.3). Pro služby v kontejnerech je potřeba zvláštní nastavení (akce na řetězci
DOCKER-USER).
Co fail2ban dělá dobře: udržuje log v klidu, snižuje zátěž od botů a chrání služby, kde (zatím) používáte hesla, například webmail nebo administrační panel. Pro takové služby existují filtry pro nginx, Postfix, Dovecot a mnoho dalších.
Na AlmaLinux a Rocky Linux
fail2ban tam pochází z EPEL: dnf install epel-release a pak dnf install fail2ban. Balíček fail2ban nainstaluje i propojení s firewalld. Služba SSH se jmenuje sshd. Samotný jail zapněte v souboru .local; na rozdíl od Debianu není zapnutý automaticky.
Shrnutí
- Boti se celý den pokoušejí přihlásit; s klíči a vypnutým přihlášením heslem se dovnitř nedostanou, fail2ban je navíc drží v odstupu.
- Jail je filtr + akce + prahové hodnoty (
maxretry,findtime,bantime); standardně 5 pokusů za 10 minut, 10 minut blokace. - Vlastní nastavení patří do
jail.localnebojail.d/*.local, nikdy dojail.conf; používejtebackend = systemd(nutné na Debianu 12). fail2ban-client status sshdzobrazí zablokované adresy,set sshd unbanipje odblokuje; recidive abantime.incrementřeší opakované útočníky.- fail2ban nezastaví rozprostřené útoky ani slabá hesla a porty Dockeru sám od sebe nevidí.
Kvíz
Úkol
Úkol Z5.3: Čtení logu o vniknutí. Ve vzorovém souboru ssh-journal-1.txt je část journalu SSH serveru s fail2ban a k tomu výstup fail2ban-client status sshd. Odpovězte: která adresa zkoušela nejvíce uživatelských jmen, která adresa se dokázala přihlásit klíčem a jako který uživatel, která adresa je zablokovaná a v kolik hodin, a byla by tato adresa zablokovaná i při výchozím nastavení (maxretry = 5, findtime = 10m)? Program odpovědi porovná s pevným klíčem. Pokud máte vlastní server s fail2ban, podívejte se tam také na fail2ban-client status sshd.
Doporučujeme k přečtení
- Zabezpečení VPS: prvních pět minut
- Je moje IP adresa zablokovaná? Vaše IP adresa a náš firewall
- fail2ban, výchozí konfigurace
jail.conf: https://github.com/fail2ban/fail2ban/blob/master/config/jail.conf - Manuál
jail.conf(5): https://manpages.debian.org/trixie/fail2ban/jail.conf.5.en.html
