Logo

Fail2ban

„Selži a máš ban!“

Fail2ban je utilita, která provádí jak říká název: selži a máš ban. Je to souhrn konfiguračních souborů pro různé protokoly a služby. Slouží k limitování útoků na počítač hrubou silou pomocí ověřování. Monitoruje logy a podle jejich údajů vydává „rozkaz k zatčení“, takový rozkaz způsobí, že IP adresa útočníka je zablokována na danou dobu (dle nastavení). Na obrázku je vidět výpis stavu služby sshd a její úspěch v podobě zablokovaných IP adres během měsíčního provozu webového serveru.

Instalace

Alpine Linux apk add fail2ban
Arch Linux pacman -S fail2ban
CentOS yum install fail2ban
Debian/Ubuntu apt get install fail2ban
FreeBSD pkg install fail2ban
OpenSUSE zypper in fail2ban

Po instalaci se musí zapnout služba fail2ban běžící v pozadí, která bude vše řídit, to udělám u modernějších systémů příkazem:

systemctl enable fail2ban.service
systemctl start fail2ban.service

Nastavení

Příkaz pro spuštění je fail2ban. Soubory s nastavením jsou uložené v adresáři /etc/fail2ban. Nastavení cest k logům anebo různé názvy se mohou lišit podle systému. Nápověda se vyvolá příkazem fail2ban -h. Zrestartováním služby se okamžitě provedou změny.

Jail.conf

Jail nebo-li žalář slouží k nastavení aktivních služeb ochrany. Pokud chci vytvořit aktivní ochranu některého z mnoha typů, edituji soubor /etc/fail2ban/jail.d/jail.conf.

Hodnoty se do konfiguračního souboru zapisují malými písmeny a mohou být následující:

enabledZapne a vypne službu.
filterUrčuje protokol či služby, které chceme chránit.
actionDefinuje vykonavatele (firewall) rozsudku blokace, může mít ještě hodnotu iptables apod.
backendŘekne programu jak funguje systém a z čeho brát data.
logpathZnačí cestu k souboru záznamů(logů).
maxretryUdává počet pokusů k zablokování.
portZnačí číslo portu služby (SSH=22, FTP=21 atd.).
bantimeUrčuje dobu pro blokaci v jednotkách: h, d, w (hodiny, dny, týdny).
findtimeJe doba po kterou se sledují pokusy, opět udáváme v jednotkách: h, d, w (hodiny, dny, týdny).
ignoreipJsou IP adresy, které chceme vynechat (mé a bezpečné IP adresy), oddělujeme mezerou.

Nastavení pro SSH

Sleduje neúspěšná přihlášení z protokolu SSH.

V konfiguračním souboru protokolu SSH je třeba změnit u parametru LogLevel hodnotu na VERBOSE. Fail2ban potřebuje upovídaný log, aby mohl shromažďovat data.

LogLevel VERBOSE

Službu sshd(časté označení pro službu u unixových OS) zrestartuji pomocí:

sudo systemctl restart sshd.service

Do konfiguračního souboru jail.conf přidat pravidla a zrestartovat PC nebo službu fail2ban. Pravidla zapíšeme do souboru(cesta se může u některých systémů opět lišit) /etc/fail2ban/jail.d/jail.conf a mohou(počítá se s firewallem UFW a SSH na portu 22) být následující:

[sshd] enabled = true filter = sshd action = ufw backend = systemd maxretry = 2 port = 22 bantime = 12w findtime = 5d ignoreip = 198.168.40.50/16 10.21.45.09/24

Co předchozí nastavení dělá? Jestliže během pěti dnů dojde k dvěma nezdařeným pokusům o přihlášení z protokolu SSH a portu 22, nástroj je vyhodnotí jako nežádoucí a zablokuje danou IP adresu na dobu dvanácti týdnů. Ignoruje IP adresy: 198.168.40.50/16, 10.21.45.09/24.

Zrestartujeme službu fail2ban. Ve většině případů pomocí příkazu sudo systemctl restart fail2ban.service. Jestliže bychom chtěli obnovit a aplikovat nastavení pouze pro nějakou službu, můžeme použít příkaz: sudo fail2ban-client restart sshd.

Jak ověříme, že jsou nějaká nastavení aktivní? Jednoduše pomocí:

sudo fail2ban-client status

Status
|- Number of jail: 2
`- Jail list: apache-noscript, sshd

Nastavení pro Apache-noscript

Pokud provozuji server, bude se mi jistě hodit eliminovat nesmyslné a chybné požadavky pro přístup k serveru. Na základě chyb URL budou blokovány přístupy s danou specifikací a počtem chyb.

Nastavím si LogLevel pro Apache (httpd) alespoň na hodnotu warn, to provedu v souboru /etc/httpd/conf/httpd.conf do kterého nastavím:

nano /etc/httpd/conf/httpd.conf

LogLevel warn

V souboru /etc/fail2ban/jail.d/jail.conf musí být něco jako:

[apache-noscript] enabled = true port = http, https filter = apache-noscript logpath = /var/log/httpd/error_log maxretry = 2 bantime = 8w findtime = 1h

Co přesně nastavení znamená? Po zadání dvou chybných URL během jedné hodiny bude příslušná IP adresa zablokována po dobu osmi týdnů. Pravidlo platí pro protokoly HTTP a HTTPS.

Nakonec zrestartuji službu fail2ban.service příkazem:

systemctl restart fail2ban.service

Anebo můžeme restartovat jen modul pomocí příkazu: sudo fail2ban-client restart apache-noscript.