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.

Náhled výpisu blokací

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.

Další nastavení pro SSH + UFW

Aby fail2ban spolupracoval s ufw, je potřeba definovat akci banaction = ufw.

V souboru /etc/fail2ban/jail.local stačí poeditovat část sshd:

[sshd]

enabled = true
mode   = aggressive
logpath = %(sshd_log)s
backend = %(sshd_backend)s
port = 20022
filter = sshd
maxretry = 1
findtime = 32d
bantime = 400w
ignoreip = 192.168.1.10/16 10.10.10.1. 81.100.105.98
banaction = ufw

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

Detailnější výpis stavu:

fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed:	0
|  |- Total failed:	3614
|  `- Journal matches:	_SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned:	1
   |- Total banned:	1
   `- Banned IP list:	179.60.147.157

Výpis pouze zablokovaných adres:

fail2ban-client banned
[{'sshd': ['122.175.32.226', '179.60.147.157', '182.70.116.97', '213.136.81.246', '103.122.201.124']}]

Za asi hodinu jsem měl hned zablokovaných 5 IP adres, které se pokoušely přihlásit na mém serveru.

Mohu zkontrolovat pomocí ufw:

To                         Action      From
--                         ------      ----
Anywhere                   REJECT IN   131.100.36.21              # by Fail2Ban after 1 attempts against sshd
Anywhere                   REJECT IN   85.152.57.61               # by Fail2Ban after 1 attempts against sshd
Anywhere                   REJECT IN   103.122.201.124            # by Fail2Ban after 1 attempts against sshd
Anywhere                   REJECT IN   213.136.81.246             # by Fail2Ban after 1 attempts against sshd
Anywhere                   REJECT IN   182.70.116.97              # by Fail2Ban after 1 attempts against sshd
Anywhere                   REJECT IN   179.60.147.157             # by Fail2Ban after 1 attempts against sshd
Anywhere                   REJECT IN   122.175.32.226             # by Fail2Ban after 1 attempts against sshd

Každou chvíli mi v "žaláři" přistane nová zablokovaná IP adresa.

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.