Modulul 5 · 5.3
fail2ban împotriva încercărilor de ghicire
Modulul 5: Protejarea rețelei · Timp de citire: 10 minute
Obiectivul lecției: După această lecție veți putea configura fail2ban pentru SSH, citi starea și jurnalul său, debloca din nou o adresă și explica ce protejează fail2ban și ce nu.
Noțiuni cheie: brute force, jail, filtru, acțiune (banaction), maxretry, findtime, bantime, bantime.increment, ignoreip, backend systemd, jail.conf, jail.local și jail.d, fail2ban-client, recidive
Cei care încearcă toate ușile internetului
Priviți în jurnalul SSH la o zi după instalare și veți vedea: sute de încercări de autentificare, cu nume precum root, admin, test, ubuntu și oracle, de la adrese din toată lumea.
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(Pe Ubuntu serviciul se numește ssh, pe AlmaLinux și Rocky sshd. Numele procesului poate fi sshd sau sshd-session, în funcție de versiunea OpenSSH.) Acesta este un atac brute force: boți care încearcă pur și simplu toate numele și parolele obișnuite. Dacă vă autentificați cu chei și autentificarea cu parolă este dezactivată (lecția 2.2), aceștia nu vor intra niciodată, oricât de des ar încerca. Totuși, vă umplu jurnalul, consumă puțină putere de calcul, iar la serviciile unde este necesară o parolă (un webmail, un panou de administrare) pot fi cu adevărat periculoși.
fail2ban citește jurnalele, recunoaște încercările eșuate și blochează în firewall, pentru o perioadă, o adresă care eșuează prea des.
Cum gândește fail2ban: jails
fail2ban lucrează cu jails (celule). Un jail combină trei lucruri:
- un filtru: expresii regulate care recunosc în jurnal încercările eșuate (de exemplu linia "Invalid user ... from <adres>");
- o acțiune: ce se întâmplă la prea multe încercări, de obicei o regulă de firewall care blochează adresa (
banaction, pe Debian 13 implicit prin nftables); - praguri: câte încercări eșuate (
maxretry) într-un anumit interval (findtime) duc la o blocare de ce durată (bantime).
Valorile implicite din jail.conf sunt: maxretry = 5, findtime = 10m, bantime = 10m. Așadar: cinci încercări eșuate în zece minute duc la o blocare de zece minute.
Instalarea și capcana din Debian 12
anna@web1:~$ sudo apt install fail2ban
anna@web1:~$ sudo systemctl status fail2banPe Debian și Ubuntu, jail-ul pentru SSH ([sshd]) este deja activ după instalare, prin fișierul /etc/fail2ban/jail.d/defaults-debian.conf.
Există o capcană cunoscută. fail2ban trebuie să știe unde se află jurnalul. Înainte, acesta era fișierul text /var/log/auth.log. Începând cu Debian 12, rsyslog nu mai este instalat implicit, iar mesajele se află doar în jurnalul systemd (lecția 6.2). Pachetul fail2ban din Debian 12 căuta încă /var/log/auth.log, nu îl găsea și nu pornea. Debian 13 a rezolvat acest lucru setând în defaults-debian.conf pentru SSH backend = systemd. Pe Debian 12 rezolvați singur problema (vedeți mai jos) făcând același lucru. Ubuntu are încă rsyslog implicit, dar backend = systemd funcționează și acolo.
Setările dumneavoastră proprii: jail.local
Nu modificați niciodată jail.conf: acest fișier este înlocuit la o actualizare. Puneți setările dumneavoastră în /etc/fail2ban/jail.local sau într-un fișier din /etc/fail2ban/jail.d/ cu extensia .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 = systemdCe fac aceste linii:
bantime = 1h: o oră de blocare în loc de zece minute.bantime.increment = true: cine revine după o blocare primește de fiecare dată o blocare mai lungă.ignoreip: adrese care nu sunt blocate niciodată. Puneți aici adresa IP fixă a biroului dumneavoastră, dacă aveți una. Nu puneți aici intervale mari „pentru siguranță”.backend = systemd: citește jurnalul systemd în loc de un fișier text (necesar pe Debian 12, recomandat peste tot). Pentru aceasta trebuie să fie instalat pachetulpython3-systemd; de obicei este deja instalat ca dependență.
Reîncărcați și verificați:
anna@web1:~$ sudo fail2ban-client -t # testarea configurației
OK: configuration test is successful
anna@web1:~$ sudo systemctl reload fail2ban
anna@web1:~$ sudo fail2ban-client status
Status
|- Number of jail: 1
`- Jail list: sshdCitirea stării, blocarea și deblocarea
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" sunt adresele care au făcut deja încercări, dar nu au depășit încă pragul. "Currently banned" sunt adresele blocate în acest moment.
Dacă v-ați blocat singur (de exemplu încercând de câteva ori cu cheia sau numele de utilizator greșit), autentificați-vă printr-o altă rețea sau prin consolă și deblocați-vă adresa:
anna@web1:~$ sudo fail2ban-client set sshd unbanip 198.51.100.20Jurnalul propriu al fail2ban se află în /var/log/fail2ban.log și arată când a fost blocată și deblocată fiecare adresă:
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.77Recidiviștii: recidive
Unii boți revin pur și simplu după fiecare blocare. Pentru aceștia există două mijloace. bantime.increment (mai sus) face blocarea tot mai lungă de fiecare dată. În plus, există jail-ul recidive: acesta citește jurnalul propriu al fail2ban și blochează pentru o săptămână, pe toate porturile, o adresă care a fost blocată des în decurs de o zi. Activați-l în fișierul dumneavoastră .local:
[recidive]
enabled = trueCe face fail2ban și ce nu face
fail2ban este util, dar nu este lacătul de pe ușă. Lacătul este autentificarea cu cheie, cu parolele dezactivate (lecția 2.2). De aceea, este bine să știți și ce nu poate face fail2ban:
- Un atac distribuit de la mii de adrese, fiecare cu una sau două încercări, nu depășește niciodată
maxretry. - O parolă slabă rămâne slabă. fail2ban încetinește ghicirea, nimic mai mult.
- Doar ce apare într-un jurnal: un serviciu care nu înregistrează încercările eșuate sau un jurnal pe care fail2ban nu îl citește rămân invizibile pentru el.
- Docker: blocările din lanțul obișnuit al firewall-ului nu se aplică porturilor de container publicate (lecția 9.3). Pentru serviciile din containere este necesară o setare separată (acțiune pe lanțul
DOCKER-USER).
Ce face fail2ban bine: menține jurnalul liniștit, reduce încărcarea cauzată de boți și protejează serviciile la care folosiți (încă) parole, precum un webmail sau un panou de administrare. Pentru astfel de servicii există filtre pentru nginx, Postfix, Dovecot și multe altele.
Pe AlmaLinux și Rocky Linux
Acolo fail2ban provine din EPEL: dnf install epel-release și apoi dnf install fail2ban. Pachetul fail2ban instalează și legătura cu firewalld. Serviciul SSH se numește sshd. Activați jail-ul într-un fișier .local; spre deosebire de Debian, acesta nu este activat automat.
Rezumat
- Boții încearcă toată ziua să se autentifice; cu chei și autentificarea cu parolă dezactivată nu intră, iar fail2ban îi ține în plus la distanță.
- Un jail înseamnă filtru + acțiune + praguri (
maxretry,findtime,bantime); implicit 5 încercări în 10 minute, 10 minute de blocare. - Setările proprii în
jail.localsaujail.d/*.local, niciodată înjail.conf; folosițibackend = systemd(necesar pe Debian 12). fail2ban-client status sshdafișează adresele blocate,set sshd unbanipdeblochează; recidive șibantime.incrementse ocupă de recidiviști.- fail2ban nu oprește atacurile distribuite sau parolele slabe și nu vede de la sine porturile Docker.
Test (quiz)
Exercițiu
Exercițiul Z5.3: Citirea unui jurnal de intruziune. Fișierul de exemplu ssh-journal-1.txt conține o porțiune din jurnalul unui server SSH cu fail2ban, plus rezultatul comenzii fail2ban-client status sshd. Răspundeți: ce adresă a încercat cele mai multe nume de utilizator, ce adresă a reușit să se autentifice cu o cheie și ca ce utilizator, ce adresă a fost blocată și la ce oră și ar fi fost blocată acea adresă și cu setările implicite (maxretry = 5, findtime = 10m)? Programul compară răspunsurile cu cheia fixă. Dacă aveți un server propriu cu fail2ban, verificați acolo și fail2ban-client status sshd.
Lecturi suplimentare
- Securizarea VPS-ului dumneavoastră: primele cinci minute
- Sunt blocat? Adresa dumneavoastră IP și firewall-ul nostru
- fail2ban, configurația implicită
jail.conf: https://github.com/fail2ban/fail2ban/blob/master/config/jail.conf - Manualul
jail.conf(5): https://manpages.debian.org/trixie/fail2ban/jail.conf.5.en.html - VPS: de la prima autentificare la un server securizat 3.5: fail2ban împotriva încercărilor de ghicire a parolei
