Automatické blokování návštěvníků webu, kteří způsobují chyby 40x – Apache + Fail2ban

Pravidelně sleduji statistiky webových stránek, včetně neplatných volání, které generují chyby 404 (stránka nenalezena) i 403 (nedostatečné oprávnění). Takové chyby většinou pochází z automatizovaných robotů, kteří se snaží najít na webu zneužitelný soubor – např. konfigurační ve kterém je uveden přístup do databáze nebo různé vygenerované PDF soubory jako jsou faktury a smlouvy. Také se snaží najít zálohy webu, nové chystané vývojové verze nebo napadnutelné balíčky třetích stran, které nejsou včas opravené.

Rozhodl jsem se takové požadavky blokovat globálně v rámci celého Linuxového serveru – pomocí Fail2ban. Nastavení je velice jednoduché. Stačí vytvořit pravidlo dle kterého se bude detekovat takový požadavek v systémovém logu serveru a nastavit logiku blokování.

Rozhodl jsem se zveřejnit stručný návod pro ty, kteří by také chtěli toto blokování používat. Návod byl vyzkoušený na Linuxové distribuci Debian 11 – Bullseye.

Nejprve nainstalujeme Fail2ban, pokud ještě na serveru nemáme.

apt fail2ban install

Následně vytvoříme nový soubor pro pravidlo, na základě kterého se budou detekovat problémové požadavky.

nano /etc/fail2ban/filter.d/apache-40x.conf

Do souboru vložíme text níže (nebudeme odchytávat neplatné požadavky na sitemap.xml, robots.txt a favicon.ico + obrázky jpg a png):

[Definition]
failregex = ^.{2,100}:(443|80) <HOST>.*"(GET|POST).*" (404|403|400) .*$
ignoreregex =.*(sitemap.xml|robots.txt|favicon.ico|jpg|png)

Upravíme lokální konfigurační soubor Fail2ban:

nano /etc/fail2ban/jail.local

Na konec souboru přidáme novou sekci, díky které se začne blokovat IP adresa zařízení, ze kterého požadavky přicházejí. Pokud během 5 minut dojde k 10 voláním, které způsobí chybu 404, 403 nebo 400, dojde k zablokování IP adresy na 10 minut (samozřejmě si můžete libovolně upravit dle svého uvážení, toto je pouze příklad):

[apache-40x]
enabled = true
findtime = 300
port = http,https
filter = apache-40x
logpath = /var/log/apache2/other_vhosts_access.log
bantime = 600
maxretry = 10

Před aplikováním změn restartováním Fail2ban si můžeme ověřit, zda blokovací pravidlo najde nějaké takové požadavky:

fail2ban-regex /var/log/apache2/other_vhosts_access.log /etc/fail2ban/filter.d/apache-40x.conf

Fail2ban restartujeme a je hotovo:

service fail2ban restart

Upozorňuji, že lokální nastavení blokování provádíme záměrně v souboru jail.local a ne v jail.conf, který může být přepsán při jakékoliv aktualizaci Fail2ban. A jelikož jail.local vlastně jen přepisuje/doplňuje nastavení uvedené v jail.conf, tak zřejmě bude možné některé zde uvedené řádky vynechat. Aneb vždy záleží na konfiguraci daného serveru.

Dále upozorňuji, že pravidlo, dle kterého se hledají IP adresy k blokování, je specifické pro log /var/log/apache2/other_vhosts_access.log, pokud budete chtít použít jiný log,bude potřeba upravit i výše uvedené blokovací pravidlo – regex.

Napsat komentář

Tyto stránky jsou chráněny reCAPTCHA a platí zásady ochrany osobních údajů a smluvní podmínky společnosti Google.