# Postavitev Fail2ban za spletne strežnike

> Fail2ban za Nginx in Apache: aktivirajte ustrezne jaile, lastne filtre preizkusite s fail2ban-regex, blokirajte ponavljalce in se izognite lastni izključitvi.

Vir: https://phpsos.de/sl/blog/fail2ban-fuer-webserver/  
Stanje: 25.10.2026  
Ponudnik: PHP SOS, Nujna pomoč za PHP in varnost strežnikov. Takojšnja pomoč po WhatsAppu: https://wa.me/491736494914?text=Pozdravljeni%2C%20PHP%20SOS%2C%20potrebujemo%20pomo%C4%8D%20z%20na%C5%A1im%20stre%C5%BEnikom%20PHP.%20Podjetje%3A%20%E2%80%A6%20Spletna%20stran%3A%20%E2%80%A6

**Na kratko:** Fail2ban bere datoteke dnevnikov in v požarnem zidu blokira naslove, ki se v časovnem oknu preveč izpostavijo. Za Nginx in Apache prinaša pripravljene jaile, kot sta `nginx-botsearch` ali `apache-noscript`; lastne filtre preizkusite s `fail2ban-regex`. Nastavitve sodijo v `jail.local`, vaši lastni naslovi v `ignoreip`, ponavljalce ujame jail `recidive`. Proti posameznim ciljnim napadom Fail2ban ne pomaga, proti množičnim skeniranjem pa.

## Ko so dnevniki polni skenerjev

Kdor si te dni ogleda dnevnike dostopov svojih spletnih strežnikov, jih pogosto najde polne zahtev za poti, ki sploh ne obstajajo: stari skrbniški vmesniki, testne datoteke, znane ranljivosti drugih izdelkov. V razmerah, kot je PHP2Shell, se pridruži ciljno iskanje ranljivih strežnikov: Cloudflare in Patchstack sta poročala o poskusih napadov, Unit 42 pa je naštel več kot 22,6 milijona izpostavljenih, potencialno ranljivih instanc.

Fail2ban je preizkušeno orodje proti tej množici. Bere datoteke dnevnikov, s filtri prepozna sumljive vnose in naslov pošiljatelja za določen čas blokira v požarnem zidu. To razbremeni strežnik, zmanjša šum v dnevnikih in sistematično preizkušanje iz enega vira naredi težje.

Kar Fail2ban ne zmore, je enako pomembno: posamezna zahteva, ki izkoristi ranljivost, ni preprečena. Proti PHP2Shell pomaga samo posodobitev PHP. Kako samodejni napadi potekajo, opisuje [Množična skeniranja za nepopravljen PHP](https://phpsos.de/sl/blog/automatisierte-massenscans/).

## Fail2ban za Nginx in Apache: priloženi jaili

Jail povezuje filter z datoteko dnevnika in akcijo blokade. Priložena `jail.conf` že vsebuje jaile za spletne strežnike. Privzeto so izklopljeni in se aktivirajo posamično.

| Jail | Spletni strežnik | Prepozna |
|---|---|---|
| `nginx-http-auth` | Nginx | neuspele prijave HTTP Basic |
| `nginx-limit-req` | Nginx | zahteve, ki presegajo omejitev hitrosti Nginx |
| `nginx-botsearch` | Nginx | iskanje tipičnih, neobstoječih poti |
| `nginx-bad-request` | Nginx | napačne zahteve |
| `apache-auth` | Apache | neuspele prijave |
| `apache-badbots` | Apache | znane škodljive oznake botov |
| `apache-noscript` | Apache | klici neobstoječih skriptov |
| `apache-overflows` | Apache | predolge zahteve |
| `apache-botsearch` | Apache | iskanje tipičnih, neobstoječih poti |
| `php-url-fopen` | oba | določeni vzorci poskusov vključevanja URL |
| `recidive` | oba | naslovi, ki jih je Fail2ban večkrat blokiral |

Privzete vrednosti priložene konfiguracije so precej blage: blokada za 10 minut po 5 zadetkih v 10 minutah. Za spletne strežnike z veliko prometa skenerjev se splača daljša blokada in naraščajoči faktor za ponovitve.

## Osnovna konfiguracija v jail.local

`jail.conf` sama pravi, da je ne smete spreminjati, ker jo posodobitve zamenjajo. Lastne vrednosti sodijo v `/etc/fail2ban/jail.local`. Naslednji primer za Nginx nastavi smiselne privzete vrednosti in aktivira ustrezne jaile:

```ini
# /etc/fail2ban/jail.local
[DEFAULT]
# Vnesite lastne stalne naslove (nadomestite vzorčni naslov)
ignoreip = 127.0.0.1/8 ::1 203.0.113.10
bantime  = 1h
findtime = 10m
maxretry = 5
bantime.increment = true

[nginx-http-auth]
enabled = true

[nginx-botsearch]
enabled = true

[recidive]
enabled  = true
bantime  = 1w
findtime = 1d
```

Za Apache namesto tega aktivirate na primer `apache-auth`, `apache-noscript` in `apache-botsearch`. Poti dnevnikov Fail2ban prinese po distribuciji; če se vaše poti razlikujejo, nastavite `logpath` v zadevnem jailu. Če vaš sistem dnevnike bere samo prek journala, pomaga `backend = systemd`.

## Lasten filter za množične zahteve za datoteke PHP

Tipičen vzorec v trenutnih razmerah je veliko zahtev v kratkem času za datoteke PHP, ki ne obstajajo. Lasten filter to prepozna po kodi stanja 404. Opisuje samo to, kar je v vašem lastnem dnevniku:

```ini
# /etc/fail2ban/filter.d/nginx-php-404.conf
[Definition]
failregex = ^<HOST> -.*"(GET|POST|HEAD) [^"]*\.php[^"]*" 404
ignoreregex =
```

```ini
# Dopolnitev v /etc/fail2ban/jail.local
[nginx-php-404]
enabled  = true
port     = http,https
filter   = nginx-php-404
logpath  = /var/log/nginx/access.log
maxretry = 20
findtime = 1m
bantime  = 1h
```

Preden filter aktivirate, ga preverite z resničnim dnevnikom. Tako vidite, koliko vrstic zadene in ali so vmes legitimni dostopi:

```bash
fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-php-404.conf
sudo systemctl restart fail2ban
sudo fail2ban-client status
sudo fail2ban-client status nginx-php-404
# Sprostite pomotoma blokiran naslov
sudo fail2ban-client set nginx-php-404 unbanip 203.0.113.25
```

Prag izberite radodarno. Iskalni pajek, ki obdeluje zastarele povezave, ali storitev za spremljanje ne sme končati v blokadi.

## Najpogostejše pasti

Fail2ban je hitro nameščen, a ga je lahko napačno uporabiti. Te točke preverite pred produktivno uporabo:

1. **Lastna izključitev:** naslovi pisarne, VPN in spremljanja sodijo v `ignoreip`, preden jaili postanejo aktivni.
2. **Predhodne storitve:** za CDN ali uravnoteževalnikom obremenitve Fail2ban brez prilagoditve vidi samo njihove naslove. Več o tem v vodniku [Zaščita skrbniških prijav pred Brute Force](https://phpsos.de/sl/ratgeber/brute-force-login-schutz/).
3. **Rotacija dnevnikov:** po zamenjavi datoteke dnevnika mora Fail2ban brati novo datoteko. Po prvi rotaciji preverite, ali jaili še naprej štejejo zadetke.
4. **Sodelovanje s požarnim zidom:** Fail2ban vnaša blokade v požarni zid. Kdor požarni zid upravlja s popolnim ponovnim nalaganjem pravil, lahko te vnose pri tem izbriše. Kako požarni zid sami zgradite, piše pod [Požarni zid za spletne strežnike: odprite samo potrebna vrata](https://phpsos.de/sl/blog/firewall-fuer-webserver/).
5. **IPv6:** napadi prihajajo tudi prek IPv6. Preverite, ali vaša akcija blokade pokriva obe protokola.

> **Nasvet:**
> Seznama blokad redno ovrednotite. Če se blokade kopičijo iz določenih omrežij ali na določene poti, je to namig na ciljno iskanje in povod, da si prizadeto aplikacijo ogledate natančneje.

## Sklep: orodje proti množici, ne proti vsemu

Fail2ban je hitro postavljen in spletnim strežnikom odvzame del nenehnega obstreljevanja. Priloženi jaili pokrivajo tipične vzorce, lastne filtre je mogoče s `fail2ban-regex` brez tveganja preizkusiti na pravih dnevnikih, jail `recidive` pa poskrbi, da trdovratni viri ostanejo zunaj dlje.

Ne precenjujte ga. Fail2ban se odziva na ponavljanje, ne na prvi zadetek, in vidi samo to, kar je v dnevnikih. Proti ranljivosti, kot je PHP2Shell, pomaga samo posodobitev, proti porazdeljenim napadom iz številnih naslovov Fail2ban komaj pomaga. Svojo vrednost razvije kot ena plast med več: poleg vitkega požarnega zidu, utrjene konfiguracije spletnega strežnika, dvostopenjske prijave in spremljanja, ki nepravilnosti ne samo blokira, ampak tudi javi.

## Kako PHP SOS pomaga konkretno?

- **Ovrednotenje dnevnikov:** pogledamo, kateri vzorci se pojavljajo v vaših dnevnikih dostopov, in izberemo ustrezne jaile.
- **Postavitev in preizkus:** Fail2ban vzpostavimo z lastnimi filtri, vsak filter preizkusimo na pravih dnevnikih in vaše stalne naslove vnesemo kot izjemo.
- **Razjasnitev sodelovanja:** CDN, uravnoteževalnik obremenitve, požarni zid in rotacijo dnevnikov uskladimo tako, da blokade zadenejo prave naslove.
- **Opazovanje:** v okviru [varnostnega nadzora](https://phpsos.de/sl/leistungen/security-monitoring/) sproti ovrednotimo blokade in nepravilnosti.


## Pogosta vprašanja

**Ali Fail2ban ščiti pred PHP2Shell?**  
Ne. Fail2ban se odzove šele, ko se naslov večkrat izpostavi v dnevnikih. En sam uspešen napad s tem ni preprečen. Fail2ban pa zmanjša obremenitev zaradi skenerjev in ponavljajoče poskuse iz istega vira naredi dražje.

**Zakaj ne bi smel neposredno spreminjati jail.conf?**  
Datoteka se pri posodobitvah paketa zamenja in to tudi sama pove. Lastne nastavitve sodijo v jail.local ali v datoteke pod jail.d. Tam ciljno prepišejo privzete vrednosti.

**Kaj je jail recidive?**  
Jail, ki ovrednoti zapisnik samega Fail2ban. Kdor je znova in znova blokiran, dobi občutno daljšo blokado. V priloženi konfiguraciji znaša en teden.

**Ali Fail2ban deluje za Cloudflare ali uravnoteževalnikom obremenitve?**  
Samo z dodatno konfiguracijo. Brez nje je v dnevnikih naslov predhodne storitve in blokada bi zadela vse obiskovalce. Spletni strežnik mora potem prevzeti pravi naslov obiskovalca, blokade pa je bolje nastaviti pri predhodni storitvi.

## Viri

- [Fail2ban: priložena jail.conf](https://github.com/fail2ban/fail2ban/blob/master/config/jail.conf)
- [BSI IT-Grundschutz](https://www.bsi.bund.de/DE/Themen/Unternehmen-und-Organisationen/Standards-und-Zertifizierung/IT-Grundschutz/it-grundschutz_node.html)
- [OWASP Cheat Sheets](https://cheatsheetseries.owasp.org/)
