Trenutno stanje: PHP2Shell. Dvije kritične PHP ranjivosti (CVSS 9.2) omogućuju zlonamjerni kod bez prijave. Zakrpe od 21. 10. 2026.Što sada učiniti →

Postaviti Fail2ban za web-poslužitelje

Fail2ban blokira adrese koje se u zapisnicima više puta ističu. Za web-poslužitelje donosi gotove filtre, a s nekoliko redaka dodaju se vlastiti. Evo kako ga postaviti a da ne zaključate sebe ili svoje kupce.

Stanje 5 min čitanjaOjačavanje i konfiguracija

Ukratko: Fail2ban čita zapisničke datoteke i u vatrozidu blokira adrese koje se unutar vremenskog okvira previše ističu. Za Nginx i Apache donosi gotove jailove poput nginx-botsearch ili apache-noscript; vlastite filtre testirate pomoću fail2ban-regex. Postavke pripadaju u jail.local, Vaše vlastite adrese u ignoreip, a ponavljače hvata recidive jail. Protiv pojedinačnih ciljanih napada Fail2ban ne pomaže, protiv masovnih skeniranja pomaže.

Kad su zapisnici puni skenera

Tko ovih dana pogleda pristupne zapisnike svojih web-poslužitelja, često ih nalazi pune zahtjeva za putove koji uopće ne postoje: stara administratorska sučelja, testne datoteke, poznate slabosti drugih proizvoda. U situaciji poput PHP2Shella dolazi i ciljana potraga za ranjivim poslužiteljima: Cloudflare i Patchstack izvijestili su o pokušajima napada, a Unit 42 izbrojio je više od 22,6 milijuna izloženih, potencijalno ranjivih instanci.

Fail2ban je provjeren alat protiv te mase. Čita zapisničke datoteke, filtrima prepoznaje upadljive unose i adresu pošiljatelja blokira u vatrozidu na određeno vrijeme. To rasterećuje poslužitelj, smanjuje šum u zapisnicima i otežava sustavno isprobavanje iz jednog izvora.

Što Fail2ban ne može, jednako je važno: pojedinačan zahtjev koji iskorištava ranjivost ne sprječava se. Protiv PHP2Shella pomaže samo PHP ažuriranje. Kako teku automatizirani napadi, opisuje članak Masovna skeniranja nezakrpanog PHP-a.

Fail2ban za Nginx i Apache: isporučeni jailovi

Jail povezuje filtar sa zapisničkom datotekom i akcijom blokade. Isporučeni jail.conf već sadrži jailove za web-poslužitelje. Zadano su isključeni i aktiviraju se pojedinačno.

Jail Web-poslužitelj Prepoznaje
nginx-http-auth Nginx neuspjele HTTP Basic prijave
nginx-limit-req Nginx zahtjeve koji premašuju rate limit Nginxa
nginx-botsearch Nginx potragu za tipičnim, nepostojećim putovima
nginx-bad-request Nginx neispravne zahtjeve
apache-auth Apache neuspjele prijave
apache-badbots Apache poznate štetne oznake botova
apache-noscript Apache pozive nepostojećih skripti
apache-overflows Apache preduge zahtjeve
apache-botsearch Apache potragu za tipičnim, nepostojećim putovima
php-url-fopen oba određene obrasce pokušaja uključivanja URL-ova
recidive oba adrese koje je Fail2ban već više puta blokirao

Zadane vrijednosti isporučene konfiguracije prilično su blage: blokada 10 minuta nakon 5 pogodaka u 10 minuta. Za web-poslužitelje s mnogo prometa skenera isplati se dulja blokada i rastući faktor za ponavljanja.

Osnovna konfiguracija u jail.local

jail.conf sam kaže da se ne smije mijenjati jer ga ažuriranja zamjenjuju. Vlastite vrijednosti pripadaju u /etc/fail2ban/jail.local. Sljedeći primjer za Nginx postavlja smislene zadane vrijednosti i aktivira prikladne jailove:

# /etc/fail2ban/jail.local
[DEFAULT]
# Upisati vlastite fiksne adrese (zamijeniti primjer adrese)
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 umjesto toga aktivirajte primjerice apache-auth, apache-noscript i apache-botsearch. Putove zapisnika Fail2ban donosi po distribuciji; ako se Vaši putovi razlikuju, postavite logpath u dotičnom jailu. Ako Vaš sustav zapisnike čita samo preko journala, pomaže backend = systemd.

Vlastiti filtar za masovne zahtjeve za PHP datotekama

Tipičan obrazac u aktualnoj situaciji su mnogi zahtjevi u kratkom vremenu za PHP datotekama koje ne postoje. Vlastiti filtar to prepoznaje po statusnom kodu 404. Opisuje samo ono što stoji u Vašem vlastitom zapisniku:

# /etc/fail2ban/filter.d/nginx-php-404.conf
[Definition]
failregex = ^<HOST> -.*"(GET|POST|HEAD) [^"]*\.php[^"]*" 404
ignoreregex =
# Dopuna u /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

Prije aktivacije filtra provjerite ga na stvarnom zapisniku. Tako vidite koliko redaka pogađa i ima li među njima legitimnih pristupa:

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
# Odblokirati nehotice blokiranu adresu
sudo fail2ban-client set nginx-php-404 unbanip 203.0.113.25

Prag odaberite velikodušno. Crawler koji obrađuje zastarjele poveznice ili usluga nadzora ne smije završiti u blokadi.

Najčešće zamke

Fail2ban se brzo instalira, ali lako pogrešno primjenjuje. Ove točke provjerite prije produkcijske uporabe:

  1. Zaključavanje samih sebe: adrese ureda, VPN-a i nadzora pripadaju u ignoreip prije nego jailovi postanu aktivni.
  2. Usluge ispred poslužitelja: iza CDN-a ili load balancera Fail2ban bez prilagodbe vidi samo njihove adrese. Više o tome u vodiču Zaštititi administratorske prijave od brute forcea.
  3. Rotacija zapisnika: nakon promjene zapisničke datoteke Fail2ban mora čitati novu datoteku. Nakon prve rotacije provjerite broje li jailovi i dalje pogotke.
  4. Suradnja s vatrozidom: Fail2ban blokade upisuje u vatrozid. Tko svoj vatrozid održava potpunim ponovnim učitavanjem skupa pravila, može pritom obrisati te unose. Kako sam vatrozid izgraditi, piše u članku Vatrozid za web-poslužitelje: otvoriti samo nužne portove.
  5. IPv6: napadi stižu i putem IPv6. Provjerite pokriva li Vaša akcija blokade oba protokola.
Savjet

Redovito analizirajte popise blokada. Ako se blokade nagomilavaju iz određenih mreža ili na određene putove, to je znak ciljane potrage i povod da se pogođena aplikacija pomnije pogleda.

Zaključak: alat protiv mase, a ne protiv svega

Fail2ban se brzo postavlja i web-poslužiteljima skida dio stalne paljbe. Isporučeni jailovi pokrivaju tipične obrasce, vlastiti filtri mogu se bez opasnosti testirati naredbom fail2ban-regex na stvarnim zapisnicima, a recidive jail brine da ustrajni izvori dulje ostanu vani.

Ne precjenjujte ga. Fail2ban reagira na ponavljanje, a ne na prvi pogodak, i vidi samo ono što stoji u zapisnicima. Protiv ranjivosti poput PHP2Shella pomaže samo ažuriranje, a protiv distribuiranih napada s mnogo adresa Fail2ban jedva pomaže. Svoju vrijednost razvija kao jedan sloj među više njih: uz vitak vatrozid, ojačanu konfiguraciju web-poslužitelja, dvofaktorsku prijavu i nadzor koji neobičnosti ne samo blokira nego i prijavljuje.

Kako PHP SOS konkretno pomaže?

  • Analizirati zapisnike: pregledavamo koji se obrasci pojavljuju u Vašim pristupnim zapisnicima i biramo prikladne jailove.
  • Postaviti i testirati: postavljamo Fail2ban s vlastitim filtrima, svaki filtar testiramo na stvarnim zapisnicima i Vaše fiksne adrese upisujemo kao iznimku.
  • Uskladiti suradnju: CDN, load balancer, vatrozid i rotaciju zapisnika usklađujemo tako da blokade pogađaju prave adrese.
  • Promatrati: u sklopu sigurnosnog nadzora kontinuirano analiziramo blokade i neobičnosti.

Česta pitanja

Štiti li Fail2ban od PHP2Shella?

Ne. Fail2ban reagira tek nakon što se adresa više puta istakne u zapisnicima. Pojedinačan uspješan napad time se ne sprječava. Fail2ban ipak smanjuje opterećenje od skenera i poskupljuje ponovljene pokušaje iz istog izvora.

Zašto jail.conf ne bih mijenjao izravno?

Datoteka se pri ažuriranju paketa zamjenjuje, a to i sama kaže. Vlastite postavke pripadaju u jail.local ili u datoteke pod jail.d. Tamo ciljano nadjačavaju zadane vrijednosti.

Što je recidive jail?

Jail koji analizira zapisnik samog Fail2bana. Tko se stalno iznova blokira, dobiva znatno dulju blokadu. U isporučenoj konfiguraciji ona iznosi tjedan dana.

Radi li Fail2ban iza Cloudflarea ili load balancera?

Samo uz dodatnu konfiguraciju. Bez nje se u zapisnicima nalazi adresa usluge ispred poslužitelja i blokada bi pogodila sve posjetitelje. Web-poslužitelj tada mora preuzeti stvarnu adresu posjetitelja, a blokade je bolje postavljati kod usluge ispred poslužitelja.

Izvori

Hitni kontakt

Svaki sat se računa. Pišite nam odmah.

Ukratko opišite sustav, verziju PHP-a i opažanje. Javit ćemo Vam se, razjasniti situaciju i raditi na daljinu dok incident nije zaključen i dokumentiran.

Hitna pomoć