Actuele situatie: PHP2Shell. Twee kritieke PHP-kwetsbaarheden (CVSS 9.2) maken schadelijke code zonder inloggen mogelijk. Patches sinds 21-10-2026.Wat u nu moet doen →

Fail2ban voor webservers instellen

Fail2ban blokkeert adressen die in de logs herhaaldelijk opvallen. Voor webservers heeft het kant-en-klare filters en met enkele regels voegt u eigen toe. Zo stelt u het in zonder uzelf of uw klanten buiten te sluiten.

Stand 5 min. leestijdHardening en configuratie

Kort gezegd: Fail2ban leest logbestanden en blokkeert in de firewall adressen die binnen een tijdvenster te vaak opvallen. Voor Nginx en Apache heeft het kant-en-klare jails zoals nginx-botsearch of apache-noscript; eigen filters test u met fail2ban-regex. Instellingen horen in de jail.local, uw eigen adressen in ignoreip, recidivisten vangt de recidive-jail op. Tegen afzonderlijke gerichte aanvallen helpt Fail2ban niet, tegen massascans wel.

Als de logs vol scanners staan

Wie dezer dagen de toegangslogs van zijn webservers bekijkt, vindt ze vaak vol met verzoeken naar paden die niet bestaan: oude beheeromgevingen, testbestanden, bekende kwetsbaarheden van andere producten. In een situatie als PHP2Shell komt er gericht zoeken naar kwetsbare servers bij: Cloudflare en Patchstack meldden aanvalspogingen, Unit 42 telde meer dan 22,6 miljoen blootgestelde, potentieel kwetsbare instanties.

Fail2ban is een beproefd hulpmiddel tegen deze massa. Het leest logbestanden, herkent met filters opvallende vermeldingen en blokkeert het afzenderadres voor een vastgelegde tijd in de firewall. Dat ontlast de server, vermindert de logruis en maakt systematisch doorproberen vanuit één bron lastiger.

Wat Fail2ban niet kan, is even belangrijk: een enkel verzoek dat een kwetsbaarheid benut, wordt niet voorkomen. Tegen PHP2Shell helpt alleen de PHP-update. Hoe geautomatiseerde aanvallen verlopen, beschrijft Massascans naar ongepatcht PHP.

Fail2ban voor Nginx en Apache: de meegeleverde jails

Een jail verbindt een filter met een logbestand en een blokkadeactie. De meegeleverde jail.conf bevat al jails voor webservers. Ze zijn standaard uitgeschakeld en worden afzonderlijk geactiveerd.

Jail Webserver Herkent
nginx-http-auth Nginx mislukte HTTP-Basic-aanmeldingen
nginx-limit-req Nginx verzoeken die de rate limit van Nginx overschrijden
nginx-botsearch Nginx zoeken naar typische, niet-bestaande paden
nginx-bad-request Nginx foutieve verzoeken
apache-auth Apache mislukte aanmeldingen
apache-badbots Apache bekende schadelijke botidentificaties
apache-noscript Apache aanroepen van niet-bestaande scripts
apache-overflows Apache overlange verzoeken
apache-botsearch Apache zoeken naar typische, niet-bestaande paden
php-url-fopen beide bepaalde patronen van pogingen tot URL-inbedding
recidive beide adressen die Fail2ban herhaaldelijk heeft geblokkeerd

De standaardwaarden van de meegeleverde configuratie zijn eerder mild: blokkade van 10 minuten na 5 treffers in 10 minuten. Voor webservers met veel scanverkeer loont een langere blokkade en een oplopende factor bij herhaling.

De basisconfiguratie in de jail.local

De jail.conf zegt zelf dat ze niet mag worden gewijzigd, omdat updates haar vervangen. Eigen waarden horen in /etc/fail2ban/jail.local. Het volgende voorbeeld voor Nginx stelt zinvolle standaarden in en activeert passende jails:

# /etc/fail2ban/jail.local
[DEFAULT]
# Eigen vaste adressen invoeren (voorbeeldadres vervangen)
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

Voor Apache activeert u in plaats daarvan bijvoorbeeld apache-auth, apache-noscript en apache-botsearch. De logpaden levert Fail2ban per distributie mee; wijken uw paden af, stel dan logpath in de betreffende jail in. Leest uw systeem logs alleen via het journal, dan helpt backend = systemd.

Een eigen filter voor massaverzoeken naar PHP-bestanden

Een typisch patroon in de huidige situatie zijn veel verzoeken in korte tijd naar PHP-bestanden die niet bestaan. Een eigen filter herkent dat aan de statuscode 404. Het beschrijft alleen wat in uw eigen log staat:

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

Voordat u het filter activeert, controleert u het tegen het echte log. Zo ziet u hoeveel regels het raakt en of er legitieme toegangen bij zitten:

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
# Een per ongeluk geblokkeerd adres vrijgeven
sudo fail2ban-client set nginx-php-404 unbanip 203.0.113.25

Kies de drempel ruim. Een crawler die verouderde links afwerkt of een monitoringdienst mag niet in de blokkade terechtkomen.

De meest voorkomende valkuilen

Fail2ban is snel geïnstalleerd, maar gemakkelijk verkeerd ingezet. Deze punten moet u vóór de productieve inzet controleren:

  1. Jezelf buitensluiten: kantoor-, VPN- en monitoringadressen horen in ignoreip voordat jails actief worden.
  2. Voorgeschakelde diensten: achter een CDN of load balancer ziet Fail2ban zonder aanpassing alleen hun adressen. Meer daarover in de gids Beheerlogins beschermen tegen brute force.
  3. Logrotatie: na het wisselen van het logbestand moet Fail2ban het nieuwe bestand lezen. Controleer na de eerste rotatie of de jails nog treffers tellen.
  4. Samenspel met de firewall: Fail2ban voert blokkades in de firewall in. Wie zijn firewall beheert met een volledig opnieuw laden van het regelwerk, kan deze vermeldingen daarbij wissen. Hoe u de firewall zelf opbouwt, staat onder Firewall voor webservers: alleen noodzakelijke poorten openen.
  5. IPv6: aanvallen komen ook via IPv6. Controleer of uw blokkadeactie beide protocollen dekt.
Tip

Analyseer de blokkadelijsten regelmatig. Stapelen blokkades uit bepaalde netwerken of op bepaalde paden zich op, dan wijst dat op gericht zoeken en is het een aanleiding om de getroffen applicatie nader te bekijken.

Conclusie: een hulpmiddel tegen de massa, niet tegen alles

Fail2ban is snel ingesteld en neemt webservers een deel van de voortdurende beschieting uit handen. De meegeleverde jails dekken typische patronen, eigen filters zijn met fail2ban-regex zonder gevaar tegen echte logs te testen en de recidive-jail zorgt ervoor dat hardnekkige bronnen langer buiten blijven.

Overschat het niet. Fail2ban reageert op herhaling, niet op de eerste treffer, en ziet alleen wat in de logs staat. Tegen een kwetsbaarheid als PHP2Shell helpt alleen de update, tegen verspreide aanvallen vanuit veel adressen helpt Fail2ban nauwelijks. Zijn waarde komt tot zijn recht als één laag onder meerdere: naast een slanke firewall, een geharde webserverconfiguratie, tweefactorauthenticatie en een bewaking die afwijkingen niet alleen blokkeert maar ook meldt.

Hoe helpt PHP SOS concreet?

  • Logs analyseren: wij bekijken welke patronen in uw toegangslogs optreden en kiezen passende jails.
  • Instellen en testen: wij richten Fail2ban in met eigen filters, testen elk filter tegen echte logs en nemen uw vaste adressen op als uitzondering.
  • Samenspel regelen: CDN, load balancer, firewall en logrotatie stemmen wij zo op elkaar af dat blokkades de juiste adressen treffen.
  • Observeren: in het kader van de security-monitoring analyseren wij blokkades en afwijkingen doorlopend.

Veelgestelde vragen

Beschermt Fail2ban tegen PHP2Shell?

Nee. Fail2ban reageert pas nadat een adres meerdere keren in de logs is opgevallen. Een enkele geslaagde aanval wordt daardoor niet voorkomen. Fail2ban verlaagt wel de belasting door scanners en maakt herhaalde pogingen uit dezelfde bron duurder.

Waarom moet ik jail.conf niet rechtstreeks wijzigen?

Het bestand wordt bij pakketupdates vervangen en zegt dat zelf ook. Eigen instellingen horen in een jail.local of in bestanden onder jail.d. Daar overschrijven ze de standaardwaarden gericht.

Wat is de recidive-jail?

Een jail die het logboek van Fail2ban zelf analyseert. Wie steeds opnieuw wordt geblokkeerd, krijgt een aanzienlijk langere blokkade. In de meegeleverde configuratie bedraagt die een week.

Werkt Fail2ban achter Cloudflare of een load balancer?

Alleen met extra configuratie. Zonder die configuratie staat in de logs het adres van de voorgeschakelde dienst en zou een blokkade alle bezoekers treffen. De webserver moet dan het echte bezoekersadres overnemen en blokkades worden beter bij de voorgeschakelde dienst ingesteld.

Bronnen

Direct contact

Elk uur telt. Schrijf ons nu.

Beschrijf kort het systeem, de PHP-versie en wat u opmerkt. Wij nemen contact op, brengen de situatie in kaart en werken op afstand tot het incident is afgerond en gedocumenteerd.

Directe hulp