Na vrata SSH strežnika, povezanega z internetom, lahko vsako minuto prihajajo avtomatizirani poskusi prijave, ki preizkušajo pogosta uporabniška imena in gesla. Fail2ban spremlja dnevniške datoteke, in če z naslova IP v kratkem času pride preveč neuspešnih prijav, ga za nekaj časa blokira v požarnem zidu.
Fail2ban ne nadomešča močnega gesla in prijave s ključem (glej: Varnostne nastavitve strežnika SSH), znatno pa zmanjša število poskusov in šum v dnevnikih.
Ta članek je namenjen tistim, ki upravljajo lasten VPS ali namenski strežnik. Na strežnik s cPanelom ga ne nameščaj: tam isto nalogo opravljata cPHulk in CSF/LFD, sistema pa bi bila v navzkrižju.
Namestitev
AlmaLinux, Rocky Linux (iz repozitorija EPEL):
sudo dnf install epel-release
sudo dnf install fail2ban fail2ban-firewalld
Paket fail2ban-firewalld nastavi, da Fail2ban blokira prek firewalld (banaction = firewallcmd-rich-rules), kot odvisnost pa namesti tudi firewalld. Ne zažene pa ga. Na cloud image AlmaLinux 10 v preizkusu firewalld ni tekel: Fail2ban je tudi takrat zabeležil blokado (Ban 10.0.2.15), blokirani naslov pa je še vedno dosegel SSH. Zato po namestitvi vklopi požarni zid, pred tem pa v njem dovoli uporabljena vrata (storitev ssh, torej vrata 22, je privzeto dovoljena):
sudo firewall-offline-cmd --add-port=2255/tcp # če SSH teče na drugih vratih
sudo firewall-offline-cmd --add-service=http --add-service=https # če teče tudi spletni strežnik
sudo systemctl enable --now firewalld
sudo firewall-cmd --list-all
Dokler firewalld ne teče, firewall-cmd ni mogoče uporabiti (v preizkusu: FirewallD is not running), zato je treba pravila pred zagonom dodati z ukazom firewall-offline-cmd; po zagonu pa že delujeta običajna firewall-cmd --permanent … in firewall-cmd --reload. Več o nastavitvi požarnega zidu piše članek Kako nastavim požarni zid na svojem VPS?.
Ubuntu, Debian:
sudo apt update
sudo apt install fail2ban
Nastavitev
Tovarniške nastavitve Fail2ban so v datoteki /etc/fail2ban/jail.conf, vendar je ne spreminjaj, ker se lahko ob posodobitvi prepiše. Lastne nastavitve zapiši v novo datoteko:
sudo nano /etc/fail2ban/jail.local
Dobro uporabno izhodišče:
[DEFAULT]
# Toliko časa ostane naslov IP blokiran
bantime = 1h
# V tem času...
findtime = 10m
# ...po toliko neuspešnih poskusih
maxretry = 5
# Teh naslovov nikoli ne blokira (ločeni s presledkom)
ignoreip = 127.0.0.1/8 ::1 203.0.113.10
[sshd]
enabled = true
V vrstico ignoreip vpiši svoj stalni naslov IP (v primeru 203.0.113.10), da se zaradi napačno vtipkanega gesla ne zakleneš zunaj. Lastnih naslovov strežnika Fail2ban privzeto nikoli ne blokira (ignoreself = true), zato poskusov, ki jih strežnik zažene sam nase, ne šteje; v preizkusu je v dnevniku takrat pisalo Ignore 10.0.2.15 by ignoreself rule.
Če SSH ne teče na privzetih vratih 22, v razdelku [sshd] navedi tudi vrata (več vrat lahko ločiš z vejico):
[sshd]
enabled = true
port = 22,2255
V preizkusu je s tem blokada veljala za oboja vrata: v firewalld sta se pojavili dve rich rule (source address="…" port port="22" in port="2255", reject).
Debian 12 in novejši: ker v teh sistemih privzeto ni /var/log/auth.log, se Fail2ban s tovarniško nastavitvijo sploh ne zažene. V preizkusu je storitev po namestitvi ostala v stanju failed, v dnevniku: ERROR Failed during configuration: Have not found any log file for sshd jail. Rešitev je, da Fail2ban bere iz dnevnika systemd (potrebni paket python3-systemd se namesti skupaj s Fail2ban). Dopolni razdelek [sshd]:
[sshd]
enabled = true
backend = systemd
V preizkusu se je s tem zagnal tudi v Debianu 12 in zaznal neuspešne prijave. V AlmaLinux 10 tega ni treba: tam Fail2ban privzeto bere dnevnik systemd (v izpisu status sshd: Journal matches: _SYSTEMD_UNIT=sshd.service …).
Naslovi, ki se vračajo
Z vklopom razdelka [recidive] naslove IP, ki jih je bilo treba v enem dnevu blokirati večkrat, izključi za dlje časa (privzeto za en teden):
[recidive]
enabled = true
Zagon
sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban
Po spremembi nastavitve storitev znova naloži:
sudo fail2ban-client reload
Preverjanje in upravljanje
# Delujoči nabori pravil (jaili)
sudo fail2ban-client status
# Podrobnosti jaila SSH: neuspešni poskusi in blokirani naslovi
sudo fail2ban-client status sshd
# Odprava blokade naslova IP
sudo fail2ban-client set sshd unbanip 198.51.100.25
# Ročna blokada naslova IP
sudo fail2ban-client set sshd banip 198.51.100.25
Po blokadi je bil v preizkusu izpis status sshd:
Status for the jail: sshd
|- Filter
| |- Currently failed: 1
| |- Total failed: 6
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd + _COMM=sshd-session
`- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: 10.0.2.15
Lastni dnevnik Fail2ban je v datoteki /var/log/fail2ban.log; tu vidiš, kdaj in kateri naslov je blokiral (NOTICE [sshd] Ban …, nato ob izteku bantime Unban …). V AlmaLinuxu dejanska pravila požarnega zidu pokaže sudo firewall-cmd --list-rich-rules; če tu ni vnosa za blokirani naslov, blokada ne deluje.
Si se zaklenil zunaj?
Če je na seznam blokad prišel tvoj naslov IP in se prek SSH ne moreš prijaviti:
- počakaj, da poteče
bantime, ali - se prijavi z drugega naslova IP (npr. prek mobilnega interneta) in blokado odstrani z zgornjim ukazom
unbanip, ali - se na strežnik prijavi po poti, ki ni odvisna od SSH, na primer prek konzole VNC.
Zaščita drugih storitev
Fail2ban vsebuje pripravljene filtre tudi za številne druge storitve, na primer ječe (jail) [nginx-http-auth], [apache-auth], [postfix] ali [dovecot]. Vklopiš jih v datoteki jail.local, podobno kot razdelek [sshd], z vrstico enabled = true. Razpoložljivi filtri so v imeniku /etc/fail2ban/filter.d/.