Fail2ban sleduje záznamy o prihlasovaní a IP adresu, ktorá opakovane zadá nesprávne heslo, na čas zablokuje vo firewalle. Nainštalujete ho, nastavíte rozumné pravidlá vrátane prísnejšieho trestu pre opakovaných útočníkov a naučíte sa odblokovať adresu, keby to postihlo vás.
Čo budete potrebovať
- VPS u StormHostu s Ubuntu 24.04 alebo Debianom 13
- Pripojenie cez SSH ako root (návod)
- Otvorenú konzolu v prehliadači pre prípad, že zablokujete sami seba
- Približne 20 minút
Čo fail2ban robí#
Fail2ban pracuje s takzvanými jailmi (doslova „väzeniami“). Každý jail stráži jednu službu a má tri časti:
| Časť | Čo robí | Príklad pre SSH |
|---|---|---|
| Filter | Rozpozná v záznamoch neúspešný pokus a vytiahne z neho IP adresu. | Riadky Failed password for root from 198.51.100.25. |
| Zdroj záznamov (backend) | Odkiaľ záznamy číta: zo systémového journalu, alebo zo súboru. | Journal služby SSH. |
| Akcia (banaction) | Čo urobí s adresou, ktorá prekročí limit. | Pridá ju do zakázaných adries vo firewalle (nftables). |
Keď adresa počas findtime urobí maxretry chýb, fail2ban ju na bantime zablokuje. Po uplynutí času ju sám odblokuje.
Fail2ban nenahrádza SSH kľúč
Fail2ban útočníkov spomalí a vyčistí logy, ale proti uhádnutiu slabého hesla úplne nechráni. Najlepšia kombinácia je SSH kľúč s vypnutým heslom a fail2ban k tomu.
Inštalácia#
Platí pre Ubuntu 24.04 aj Debian 13.
Aktualizujte zoznam balíkov a nainštalujte fail2ban:
bash apt update apt install fail2banfail2ban– samotný program. Ako závislosť sa nainštaluje ajpython3-systemd, vďaka ktorému dokáže čítať systémový journal.
Overte, že je k dispozícii nástroj
nft, cez ktorý fail2ban blokuje:bash command -v nft || apt install nftablescommand -v nft– vypíše cestu k programunft, ak existuje.||– ďalší príkaz sa spustí iba vtedy, keď predchádzajúci zlyhal, teda keďnftchýba.apt install nftables– nainštaluje nástroj. Samotná inštalácia nezapína žiadne pravidlá ani nemení UFW.
Skontrolujte, že služba beží:
bash systemctl status fail2banHľadajte riadok
Active: active (running). Výpis ukončíte klávesom q.
Po inštalácii už fail2ban chráni SSH s predvoleným nastavením distribúcie: jail sshd je zapnutý, záznamy číta zo systémového journalu a blokuje cez nftables. Predvolený trest je však iba 10 minút, preto si nastavenie upravte.
Prečo jail.local, a nie jail.conf#
Predvolené nastavenie je v /etc/fail2ban/jail.conf a v /etc/. Tieto súbory neupravujte, aktualizácia balíka by ich mohla prepísať. Vlastné nastavenie patrí do /etc/fail2ban/jail.local. Fail2ban číta súbory v poradí jail.conf › jail.d/*.conf › jail.local › jail.d/*.local a neskoršia hodnota vždy prepíše skoršiu.
Konfigurácia riadok po riadku#
Vytvorte súbor:
bash nano /etc/fail2ban/jail.localVložte doň:
/etc/ fail2ban/ inijail.local [DEFAULT] # Adresy, ktore sa nikdy nezablokuju (oddelene medzerou) ignoreip = 127.0.0.1/8 ::1 # Dlzka prveho zablokovania bantime = 1h # Okno, v ktorom sa pocitaju neuspesne pokusy findtime = 10m # Pocet neuspesnych pokusov, po ktorom pride zablokovanie maxretry = 5 # Opakovanym utocnikom predlzovat zablokovanie bantime.increment = true bantime.factor = 1 bantime.maxtime = 1w [sshd] enabled = true port = ssh backend = systemd [recidive] enabled = true backend = auto logpath = /var/log/fail2ban.log banaction = %(banaction_allports)s bantime = 1w findtime = 1d maxretry = 5Uložte (Ctrl+O, Enter) a zatvorte editor (Ctrl+X).
Sekcie v hranatých zátvorkách: [DEFAULT] platí pre všetky jaily, [sshd] a [recidive] iba pre daný jail a majú prednosť pred [DEFAULT].
| Nastavenie | Čo robí | Odporúčaná hodnota | Kedy zmeniť |
|---|---|---|---|
ignoreip | Adresy a rozsahy, ktoré fail2ban nikdy nezablokuje. Oddeľuje sa medzerou. 127.0.0.1/8 ::1 je samotný VPS. | 127.0.0.1/8 ::1 | Pridajte svoju IP adresu, iba ak je pevná (kancelária, vlastný server). Dynamickú adresu domáceho pripojenia nepridávajte, časom ju môže dostať niekto iný. |
bantime | Ako dlho zostane adresa zablokovaná. Jednotky: m minúty, h hodiny, d dni, w týždne. Predvolené je 10m. | 1h | Kratší (30m), ak sa často pomýlite a nemáte konzolu poruke. |
findtime | Časové okno, v ktorom sa chyby sčítajú. | 10m | Dlhší (1h) proti pomalým útokom, ktoré skúšajú heslo raz za pár minút. |
maxretry | Koľko chýb v rámci findtime vedie k zablokovaniu. Pri 3 sa môžete zablokovať sami preklepom, pri 10 má útočník viac pokusov. | 5 | 3 pre SSH s vypnutým heslom (legitímny používateľ s kľúčom chyby nerobí). |
bantime.increment | Pri každom ďalšom zablokovaní rovnakej adresy sa čas predĺži. Fail2ban si pamätá históriu v databáze. | true | false, ak chcete vždy rovnaký čas. |
bantime.factor | Násobiteľ rastu. S hodnotou 1 rastie čas 1, 2, 4, 8… × bantime. | 1 | Vyšší (2) pre rýchlejší rast. |
bantime.maxtime | Strop, cez ktorý čas zablokovania neporastie. | 1w | Dlhší (4w) pre veľmi vytrvalých útočníkov. |
enabled | Zapne jail. Jaily sú v predvolenom stave vypnuté. | true | false dočasne jail vypne. |
port | Ktoré porty sa adrese zablokujú. ssh znamená port 22. | ssh | Ak máte SSH na inom porte, napíšte ho číslom, napríklad 2222 (pozri nižšie). |
backend | Odkiaľ čítať záznamy. systemd = systémový journal, auto = súbor z logpath. | systemd pre sshd, auto pre recidive | Nikdy, ak neviete prečo. Debian 13 nemá súbor /var/log/auth.log, SSH preto musí čítať journal. |
logpath | Súbor so záznamami (iba pre backend = auto). | /var/log/fail2ban.log | Nemení sa. |
banaction | Ako blokovať. %(banaction_allports)s = zablokovať všetky porty, nie iba SSH. | %(banaction_allports)s | Nemení sa. |
Recidive: prísnejší trest pre opakovaných útočníkov#
Jail recidive číta záznamy samotného fail2banu (/var/log/fail2ban.log). Keď rovnaká adresa dostane počas findtime (1 deň) aspoň maxretry (5) zablokovaní v akomkoľvek jaile, recidive ju zablokuje na bantime (1 týždeň) a na všetkých portoch. Útočník, ktorý sa vracia, tak príde o prístup k VPS úplne.
Preto recidive číta súbor (backend = auto) a nie journal: fail2ban zapisuje svoje záznamy do súboru /var/log/fail2ban.log, nie do journalu.
Aby si fail2ban pamätal históriu zablokovaní dosť dlho (pre bantime.increment aj pre obnovenie týždenných blokácií po reštarte), predĺžte čas uchovania v databáze:
nano /etc/fail2ban/fail2ban.local[Definition]
dbpurgeage = 8d| Nastavenie | Čo robí | Odporúčaná hodnota | Kedy zmeniť |
|---|---|---|---|
dbpurgeage | Po akom čase sa staré záznamy o zablokovaní mažú z databázy /var/. Predvolené je 1d. | 8d | Vždy o niečo dlhší než najdlhší bantime a bantime.maxtime. |
Spustenie a kontrola#
Skontrolujte konfiguráciu:
bash fail2ban-client -t-t– test konfigurácie. Pri úspechu vypíšeOK: configuration test is successful. Pri chybe uvedie súbor a problém.
Reštartujte fail2ban, aby načítal nové nastavenie:
bash systemctl restart fail2banVypíšte zapnuté jaily:
bash fail2ban-client statusVýstuptext Status |- Number of jail: 2 `- Jail list: recidive, sshdZobrazte stav jailu
sshd:bash fail2ban-client status sshdVýstuptext Status for the jail: sshd |- Filter | |- Currently failed: 2 | |- Total failed: 57 | `- Journal matches: _SYSTEMD_UNIT=ssh.service + _COMM=sshd `- Actions |- Currently banned: 3 |- Total banned: 12 `- Banned IP list: 198.51.100.25 198.51.100.40 198.51.100.77
| Riadok | Význam |
|---|---|
Currently failed | Koľko adries má teraz v okne findtime aspoň jednu chybu, ale ešte nie je zablokovaných. |
Total failed | Počet zachytených chýb od štartu fail2banu. |
Journal matches | Ktoré záznamy journalu jail číta. Na Ubuntu sa môže líšiť (sshd.service), na funkciu to nemá vplyv. |
Currently banned | Koľko adries je teraz zablokovaných. |
Total banned | Koľko zablokovaní prebehlo od štartu. |
Banned IP list | Zoznam práve zablokovaných adries. |
Odblokovanie IP adresy#
Ak ste zablokovali sami seba, prihláste sa cez konzolu v prehliadači (alebo z inej siete, napríklad cez mobilné dáta) a použite jeden z príkazov:
| Príkaz | Čo robí |
|---|---|
fail2ban-client set sshd unbanip 198.51.100.25 | Odblokuje adresu v jaile sshd. |
fail2ban-client unban 198.51.100.25 | Odblokuje adresu vo všetkých jailoch (vrátane recidive) a zmaže ju z databázy. |
fail2ban-client unban --all | Odblokuje všetky adresy vo všetkých jailoch. Útočníci sa pri ďalších pokusoch zablokujú znova. |
fail2ban-client banned 198.51.100.25 | Vypíše, v ktorých jailoch je adresa zablokovaná. |
Za 198.51.100.25 dosaďte svoju verejnú IP adresu. Ak ju nepoznáte, nájdete ju v zozname Banned IP list podľa času (záznamy o zablokovaní: grep "Ban " /var/log/fail2ban.log | tail), alebo ju vypíše ľubovoľná stránka „aká je moja IP adresa“ otvorená z počítača, z ktorého sa pripájate.
Svoju adresu zistíte aj vo chvíli, keď ste cez SSH prihlásení: echo $SSH_CLIENT vypíše ako prvý údaj adresu, z ktorej sa pripájate.
Ako spoznať, že ste zablokovaný vy#
- SSH zrazu hlási
Connection refusedaleboConnection timed out, hoci ešte pred chvíľou fungovalo. - Z inej siete (mobilné dáta) sa pripojíte bez problémov.
- Ak vás zablokoval
recidive, nefungujú vám ani ostatné služby na VPS (web, herný server), ostatným ľuďom áno. - V konzole vidíte svoju adresu vo výpise
fail2ban-client status sshd.
Zákaznícky účet a zmena hesla
Záložky Súbory a Databázy sa k VPS prihlasujú cez SSH heslom. Keď zmeníte root heslo a záložky sa niekoľkokrát pokúsia prihlásiť starým, fail2ban môže zablokovať aj adresu, z ktorej sa zákaznícky účet pripája. Po zmene hesla preto hneď zadajte nové v Súbory › Zmeniť prihlasovacie údaje. Ak už záložka nefunguje, spustite fail2ban-client unban --all a údaje zadajte znova.
SSH na inom porte#
Ak ste SSH presunuli (napríklad na 2222), upravte v jail.local riadok v sekcii [sshd]:
[sshd]
enabled = true
port = 2222
backend = systemdport = 2222– fail2ban zablokuje útočníkovi tento port. Pri nesprávnom porte by zablokovanie nemalo žiadny účinok. Pre viac portov ich oddeľte čiarkou:port = 22,2222.
Potom spustite fail2ban-client -t a systemctl restart fail2ban.
Ďalšie jaily: Nginx#
Ak na VPS prevádzkujete web s Nginx, môžete strážiť aj ten. Pridajte do jail.local:
[nginx-http-auth]
enabled = true
backend = auto
[nginx-botsearch]
enabled = true
backend = auto| Jail | Čo stráži |
|---|---|
nginx-http-auth | Nesprávne heslá pri stránkach chránených heslom (HTTP Basic Auth). |
nginx-botsearch | Roboty, ktoré hľadajú známe zraniteľné adresy (/wp-login.php, /phpmyadmin a pod.). |
backend = auto– Nginx zapisuje do súboru/var/log/nginx/error.log, nie do journalu. Bez tohto riadka by jail na Ubuntu čítal journal a nič by nenašiel.
Fail2ban a firewall#
Fail2ban blokuje cez nftables vo vlastnej tabuľke f2b-table. Funguje preto vedľa UFW aj s firewallom v zákazníckom účte a nič z toho neprepisuje. Zablokované adresy uvidíte príkazom:
nft list table inet f2b-tablenft list table inet f2b-table– vypíše tabuľku fail2banu vrátane množín (addr-set-sshd…) so zablokovanými adresami.
Ak chcete mať zablokované adresy vidieť priamo v ufw status, nastavte v [DEFAULT] riadok banaction = ufw (UFW musí byť zapnutý). Pre jail recidive potom nastavte banaction = ufw tiež. Predvolené nftables je však rýchlejšie a odporúčame ho.
Fail2ban chráni iba to, čo beží vo VPS. Firewall v zákazníckom účte fail2ban neovláda.
Overenie#
Skúste ručne zablokovať testovaciu adresu:
bash fail2ban-client set sshd banip 198.51.100.25Overte, že je vo firewalle:
nft list table inet f2b-tablemusí adresu198.51.100.25obsahovať.Odblokujte ju:
fail2ban-client set sshd unbanip 198.51.100.25.O hodinu až dve skontrolujte
fail2ban-client status sshd. Na verejnom VPS bývaTotal failedaTotal bannedčoskoro nenulové.
Keď niečo nefunguje#
fail2ban-client -t hlási chybu#
Výpis uvádza súbor a sekciu. Najčastejšie ide o preklep v názve nastavenia, chýbajúce = alebo hodnotu bez jednotky. Opravte súbor a test zopakujte.
Have not found any log file for sshd jail#
Jail sshd sa snaží čítať súbor /var/log/auth.log, ktorý na Debiane 13 neexistuje. V sekcii [sshd] musí byť backend = systemd.
No module named 'asynchat' (Ubuntu 24.04)#
Pôvodná verzia fail2banu v Ubuntu 24.04 nefungovala s Pythonom 3.12. Oprava je v aktualizáciách distribúcie: spustite apt update && apt full-upgrade a potom systemctl restart fail2ban.
Fail2ban adresy hlási ako zablokované, ale útočník ďalej skúša heslá#
- V
/var/log/fail2ban.loghľadajte chyby pri akcii (napríkladnft: not found). Potom nainštalujte balíknftables. - Skontrolujte, že
portv jaile zodpovedá skutočnému portu SSH.
Kde hľadať podrobnosti#
tail -n 50 /var/log/fail2ban.log
journalctl -u fail2ban -n 50tail -n 50 /var/log/fail2ban.log– posledných 50 riadkov logu fail2banu (zablokovanieBan, odblokovanieUnban, chyby).journalctl -u fail2ban -n 50– posledných 50 záznamov služby, hodí sa, keď fail2ban vôbec nenaštartuje.
Zhrnutie
- Fail2ban blokuje IP adresy po opakovaných chybných prihláseniach; nainštalujete ho príkazom
apt install fail2ban. - Vlastné nastavenie patrí do
/etc/fail2ban/jail.local, nikdy dojail.conf. - SSH číta journal (
backend = systemd),recidivečíta súbor (backend = auto). - Odblokovanie:
fail2ban-client set sshd unbanip <IP>alebofail2ban-client unban <IP>, keď sa odrežete, použite konzolu. - Po presune SSH upravte
portv jailesshd.