Namestitev in nastavitev Fail2ban proti napadom SSH z grobo silo

Linux Branje: 4 min

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/.

Nazaj: Linux – članki (76)