# Nastavenie Fail2ban pre webové servery

> Fail2ban pre Nginx a Apache: aktivujte vhodné jaily, vlastné filtre testujte pomocou fail2ban-regex, blokujte opakovaných páchateľov a vyhnite sa vlastnému vylúčeniu.

Zdroj: https://phpsos.de/sk/blog/fail2ban-fuer-webserver/  
Stav: 25.10.2026  
Poskytovateľ: PHP SOS, Núdzová pomoc pri PHP a bezpečnosť serverov. Okamžitá pomoc cez WhatsApp: https://wa.me/491736494914?text=Dobr%C3%BD%20de%C5%88%2C%20PHP%20SOS%2C%20potrebujeme%20pomoc%20s%20na%C5%A1%C3%ADm%20serverom%20s%20PHP.%20Spolo%C4%8Dnos%C5%A5%3A%20%E2%80%A6%20Web%3A%20%E2%80%A6

**Stručne:** Fail2ban číta súbory protokolov a vo firewalle blokuje adresy, ktoré sa v časovom okne objavia príliš často. Pre Nginx a Apache prináša hotové jaily ako `nginx-botsearch` alebo `apache-noscript`; vlastné filtre testujte pomocou `fail2ban-regex`. Nastavenia patria do `jail.local`, vaše vlastné adresy do `ignoreip` a opakovaných páchateľov zachytí jail `recidive`. Proti jednotlivým cieleným útokom Fail2ban nepomáha, proti hromadným skenom áno.

## Keď sú protokoly plné skenerov

Kto si v týchto dňoch pozrie prístupové protokoly svojich webových serverov, často ich nájde plné požiadaviek na cesty, ktoré vôbec neexistujú: staré administrátorské rozhrania, testovacie súbory, známe zraniteľnosti iných produktov. V situácii ako PHP2Shell pribúda cielené hľadanie zraniteľných serverov: Cloudflare a Patchstack hlásili pokusy o útok, Unit 42 napočítal viac než 22,6 milióna exponovaných, potenciálne zraniteľných inštancií.

Fail2ban je osvedčený nástroj proti tejto hmote. Číta súbory protokolov, filtrami rozpoznáva nápadné záznamy a adresu odosielateľa zablokuje vo firewalle na stanovený čas. To odľahčuje server, znižuje šum v protokoloch a systematické skúšanie z jedného zdroja robí namáhavejším.

Čo Fail2ban nedokáže, je rovnako dôležité: jednotlivej požiadavke, ktorá zneužije zraniteľnosť, nezabráni. Proti PHP2Shell pomáha len aktualizácia PHP. Ako prebiehajú automatizované útoky, opisuje [Hromadné skeny po nezáplatovanom PHP](https://phpsos.de/sk/blog/automatisierte-massenscans/).

## Fail2ban pre Nginx a Apache: dodávané jaily

Jail spája filter so súborom protokolu a akciou blokovania. Dodávaný `jail.conf` už obsahuje jaily pre webové servery. Sú štandardne vypnuté a aktivujú sa jednotlivo.

| Jail | Webový server | Rozpoznáva |
|---|---|---|
| `nginx-http-auth` | Nginx | neúspešné prihlásenia HTTP Basic |
| `nginx-limit-req` | Nginx | požiadavky, ktoré prekračujú rate limit Nginx |
| `nginx-botsearch` | Nginx | hľadanie typických, neexistujúcich ciest |
| `nginx-bad-request` | Nginx | chybné požiadavky |
| `apache-auth` | Apache | neúspešné prihlásenia |
| `apache-badbots` | Apache | známe identifikátory škodlivých botov |
| `apache-noscript` | Apache | otvorenia neexistujúcich skriptov |
| `apache-overflows` | Apache | príliš dlhé požiadavky |
| `apache-botsearch` | Apache | hľadanie typických, neexistujúcich ciest |
| `php-url-fopen` | oba | určité vzory pokusov o vloženie URL |
| `recidive` | oba | adresy, ktoré Fail2ban opakovane zablokoval |

Štandardné hodnoty dodávanej konfigurácie sú skôr mierne: blokovanie na 10 minút po 5 zásahoch za 10 minút. Pre webové servery s veľkým skenovacím prenosom sa oplatí dlhšie blokovanie a rastúci faktor pre opakovania.

## Základná konfigurácia v jail.local

`jail.conf` sám uvádza, že sa nemá meniť, pretože ho aktualizácie nahrádzajú. Vlastné hodnoty patria do `/etc/fail2ban/jail.local`. Nasledujúci príklad pre Nginx nastavuje rozumné štandardy a aktivuje vhodné jaily:

```ini
# /etc/fail2ban/jail.local
[DEFAULT]
# Zapísať vlastné pevné adresy (nahradiť vzorovú adresu)
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
```

Pre Apache aktivujete namiesto toho napríklad `apache-auth`, `apache-noscript` a `apache-botsearch`. Cesty k protokolom prináša Fail2ban podľa distribúcie; ak sa vaše cesty líšia, nastavte `logpath` v príslušnom jaile. Ak váš systém číta protokoly len cez žurnál, pomôže `backend = systemd`.

## Vlastný filter pre hromadné požiadavky na súbory PHP

Typickým vzorom v aktuálnej situácii je veľa požiadaviek v krátkom čase na súbory PHP, ktoré neexistujú. Vlastný filter to rozpozná podľa stavového kódu 404. Popisuje len to, čo je vo vašom vlastnom protokole:

```ini
# /etc/fail2ban/filter.d/nginx-php-404.conf
[Definition]
failregex = ^<HOST> -.*"(GET|POST|HEAD) [^"]*\.php[^"]*" 404
ignoreregex =
```

```ini
# Doplnenie 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
```

Skôr než filter aktivujete, otestujte ho proti skutočnému protokolu. Uvidíte, koľko riadkov zachytí a či sú medzi nimi legitímne prístupy:

```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
# Uvoľniť omylom zablokovanú adresu
sudo fail2ban-client set nginx-php-404 unbanip 203.0.113.25
```

Prah zvoľte štedro. Prehľadávač, ktorý spracúva zastarané odkazy, alebo monitorovacia služba nesmie skončiť v blokovaní.

## Najčastejšie pasce

Fail2ban sa nainštaluje rýchlo, ale ľahko sa nasadí nesprávne. Tieto body by ste mali pred produkčným nasadením skontrolovať:

1. **Vlastné vylúčenie:** adresy kancelárie, VPN a monitoringu patria do `ignoreip`, skôr než sa jaily aktivujú.
2. **Predradené služby:** za CDN alebo load balancerom vidí Fail2ban bez úpravy len ich adresy. Viac v sprievodcovi [Ochrana prihlásení administrátorov proti brute force](https://phpsos.de/sk/ratgeber/brute-force-login-schutz/).
3. **Rotácia protokolov:** po zmene súboru protokolu musí Fail2ban čítať nový súbor. Po prvej rotácii skontrolujte, či jaily naďalej počítajú zásahy.
4. **Súhra s firewallom:** Fail2ban zapisuje blokovania do firewallu. Kto spravuje firewall úplným opätovným načítaním súboru pravidiel, môže tieto záznamy zmazať. Ako firewall zostaviť, uvádza [Firewall pre webové servery: otvárať len potrebné porty](https://phpsos.de/sk/blog/firewall-fuer-webserver/).
5. **IPv6:** útoky prichádzajú aj cez IPv6. Skontrolujte, či vaša akcia blokovania pokrýva oba protokoly.

> **Tip:**
> Zoznamy blokovaní pravidelne vyhodnocujte. Ak sa blokovania z určitých sietí alebo na určité cesty hromadia, je to náznak cieleného hľadania a dôvod pozrieť sa na dotknutú aplikáciu podrobnejšie.

## Záver: nástroj proti hmote, nie proti všetkému

Fail2ban sa nastaví rýchlo a odoberá webovým serverom časť trvalého ostreľovania. Dodávané jaily pokrývajú typické vzory, vlastné filtre sa dajú bez rizika testovať pomocou `fail2ban-regex` proti skutočným protokolom a jail `recidive` zabezpečí, že húževnaté zdroje zostanú vonku dlhšie.

Nepreceňujte ho však. Fail2ban reaguje na opakovanie, nie na prvý zásah, a vidí len to, čo je v protokoloch. Proti zraniteľnosti ako PHP2Shell pomáha jedine aktualizácia, proti distribuovaným útokom z mnohých adries Fail2ban pomáha sotva. Svoju hodnotu prejavuje ako jedna vrstva z viacerých: popri štíhlom firewalle, sprísnenej konfigurácii webového servera, dvojfaktorovom prihlasovaní a monitoringu, ktorý nápadnosti nielen blokuje, ale aj hlási.

## Ako konkrétne pomáha PHP SOS?

- **Vyhodnotiť protokoly:** pozrieme sa, aké vzory sa vyskytujú vo vašich prístupových protokoloch, a vyberieme vhodné jaily.
- **Zriadiť a otestovať:** Fail2ban nastavíme s vlastnými filtrami, každý filter otestujeme proti skutočným protokolom a vaše pevné adresy zapíšeme ako výnimku.
- **Objasniť súhru:** CDN, load balancer, firewall a rotáciu protokolov zosúladíme tak, aby blokovania zasahovali správne adresy.
- **Sledovať:** v rámci [sledovania bezpečnosti](https://phpsos.de/sk/leistungen/security-monitoring/) priebežne vyhodnocujeme blokovania a nápadnosti.


## Časté otázky

**Chráni Fail2ban pred PHP2Shell?**  
Nie. Fail2ban reaguje až potom, čo sa adresa v protokoloch objavila opakovane. Jednotlivý úspešný útok tým nezabráni. Fail2ban však znižuje zaťaženie od skenerov a opakované pokusy z toho istého zdroja robí nákladnejšími.

**Prečo nemám meniť jail.conf priamo?**  
Súbor sa pri aktualizáciách balíka nahrádza a sám to uvádza. Vlastné nastavenia patria do jail.local alebo do súborov pod jail.d. Tam štandardné hodnoty prepisujú cielene.

**Čo je jail recidive?**  
Jail, ktorý vyhodnocuje protokol samotného Fail2ban. Kto je opakovane blokovaný, dostane výrazne dlhšie blokovanie. V dodávanej konfigurácii je to jeden týždeň.

**Funguje Fail2ban za Cloudflare alebo load balancerom?**  
Len s dodatočnou konfiguráciou. Bez nej je v protokoloch adresa predradenej služby a blokovanie by postihlo všetkých návštevníkov. Webový server potom musí preberať skutočnú adresu návštevníka a blokovania sa lepšie nastavujú u predradenej služby.

## Zdroje

- [Fail2ban: dodávaný 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/)
