Kamarád si přečetl pár článků na Živě a na dlouhé zimní večery si udělal v cloudu malý linuxový server na hraní. Nicméně poměrně brzy mu jej někdo hacknul – slabé heslo. Rozjel jej znova a zkusil logovat přihlášení – a světe div se byly to stovky, ne-li tisíce pokusů denně.

A když mě požádal o radu co s tím, tip na další článek byl na světě. Již poměrně dlouho existuje služba s názvem fail2ban, kterou jsem mu poradil nasadit. Nějak se totiž ještě necítil na bezpečnější přihlašování ssh klíčem. Fail2ban funguje asi tak jak byste podle názvu očekávali – po určitém, Vámi nastaveném počtu nepovedených pokusů o přihlášení hodí danou IP adresu, ze které pokus probíhal, na block list.

Instalace na Ubuntu

Instalaci provedete jednoduše příkazem:

sudo apt update && sudo apt install fail2ban

Po instalaci se služba rovnou sama spustí a zavede i pro opětovné spouštění po restartu. Zkontrolovat zda běží můžete příkazem:

sudo systemctl status fail2ban

Pokud Status hlásí Active, je všechno v cajku. Nyní si zkopírujeme výchozí konfiguraci, kterou následně upravíme k obrazu svému:

sudo cp /etc/fail2ban/jail.{conf,local}

A potom zmiňovaná úprava:

sudo nano /etc/fail2ban/jail.local

V konfiguračním souboru doporučuji změnit následující položky:

Odkomentujte řádek ignoreip a přidejte do něj svou veřejnou IP adresu, nebo klidně celý subnet, pokud jde o server v lokální síti. Tím dáte explicitně tyto adresy na allow list – tedy nebudou nikdy banované a vy se tak při opětovných pokusech o zadání zapomenutého hesla neodstříhnete. Jednotlivé adresy se oddělují mezerou.

ignoreip = 127.0.0.1/8 ::1 77.88.77.14 192.168.0.0/24

Zásady banování definují následující parametry:

bantime = 1d

Bantime definuje, na jak dlouho bude daná IP blokována – v tomto případě 1 den. Pokud ji chcete zabanovat na vždy, nastavte -1.

findtime = 10m

Findtime spolupracuje s další hodnotu, maxretry. V tomto případě to znamená, že pokud bude pět neúspěšných pokusů (maxretry) během 10 minut (findtime), tak dojde k blokaci.

maxretry = 5

Defaultně (Johnňák by se obracel v hrobě) je nastavena hodnota 5 pokusů, což by mělo být v pohodě, pokud si na první dobrou nevzpomenete.

Nastavení co jsem doporučil kamarádovi – je přísné, používá passwordmanager a tak by heslo neměl zapomenout, současně by měl ale blokovat i pomalejší brute force pokusy o prolomení, které se snaží vyhnout detekci:

bantime = 30d findtime = 1d maxretry = 3

Jaily

V základu je povolen jen jail pro SSH, ale můžete si přidat i další, pro každou službu jiné. Pomocí jailů definujete rozdílně parametry pro každou službu. Jail mají v konfiguračním samostatnou sekci kam je lze definovat a vypadají pak třeba takto:

[proftpd] 
enabled = true 
port = ftp,ftp-data,ftps,ftps-data 
logpath = %(proftpd_log)s 
backend = %(proftpd_backend)s

A jak jsem říkal, každá služba může mít své nastavení a jail vždy povolujete tak že nastavíte enable na true.

[sshd] 
enabled = true 
maxretry = 3 
findtime = 1d 
bantime = 4w 
ignoreip = 127.0.0.1/8 77.88.77.14

Pokud ale plánujete řešit pouze SSH, jako kámoš, tak jaily nemusíte řešit.

Po každé změně v konfiguráku je potřeba službu otočit:

sudo systemctl restart fail2ban

Sledování a ovládání

Asi Vás bude zajímat, jak sledovat kolik adres se Vám pokoušelo přihlásit k vašemu Miláškovi. To zjistíte zadáním příkazu:

sudo fail2ban-client status sshd

Pokud byste chtěli znát třeba stav pro jailové proftpd tak jen na koci příkazu změníte službu. 😉

Pokud byste nějakou adresu chtěli přidat na allow list (ex whitelist), provedete to tímto příkazem:

sudo fail2ban-client set sshd unbanip 77.88.77.14

A pokud byste chtěli někoho zabanovat růčo fůčo, pak zas tímto:

sudo fail2ban-client set sshd banip 77.88.77.14