Fail2ban a CrowdSec
Fail2ban a CrowdSec
Nástroje, které čtou logy a blokují adresy, ze kterých chodí opakované neúspěšné pokusy.
Nejsou náhradou za zabezpečení serveru — když máš vypnutá hesla u SSH, brute force ti nevadí a fail2ban ti jen uklidí log. Hodnotu mají hlavně u služeb, kde přihlašování vypnout nemůžeš.
Fail2ban
Klasika. Sleduje logy, hledá vzory a při překročení počtu pokusů přidá pravidlo do firewallu.
Instalace a základ
apt install fail2ban
Nikdy needituj jail.conf, přepíše se při aktualizaci. Vytvoř /etc/fail2ban/jail.local:
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
backend = systemd
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 10.10.0.0/24
banaction = nftables-multiport
[sshd]
enabled = true
[nginx-http-auth]
enabled = true
logpath = /var/log/nginx/error.log
[nginx-limit-req]
enabled = true
logpath = /var/log/nginx/error.log
ignoreip s vlastními sítěmi je první věc, kterou nastav. Jinak se dřív nebo později zablokuješ sám.
systemctl restart fail2ban
fail2ban-client status
fail2ban-client status sshd
Odblokování
fail2ban-client set sshd unbanip 1.2.3.4
fail2ban-client unban --all
Postupné prodlužování
[DEFAULT]
bantime.increment = true
bantime.factor = 2
bantime.maxtime = 5w
Opakovaný útočník dostává postupně delší tresty. Užitečné proti botnetům, které se vracejí.
Vlastní filtr
Pro aplikaci, kterou fail2ban nezná. Najdi si v logu, jak vypadá neúspěšné přihlášení, a napiš /etc/fail2ban/filter.d/mojeapp.conf:
[Definition]
failregex = ^.*Failed login attempt from <HOST>.*$
ignoreregex =
[mojeapp]
enabled = true
port = http,https
filter = mojeapp
logpath = /var/log/mojeapp/access.log
maxretry = 3
Otestuj regulární výraz proti skutečnému logu, než to nasadíš:
fail2ban-regex /var/log/mojeapp/access.log /etc/fail2ban/filter.d/mojeapp.conf
Past: za reverse proxy blokuješ sám sebe
Tohle je nejdůležitější odstavec na stránce.
Když aplikace běží za reverse proxy, vidí v logu adresu proxy, ne útočníka. Fail2ban tedy zablokuje 127.0.0.1 nebo adresu proxy — a tím odřízne úplně všechny návštěvníky.
Řešení má dva kroky.
1. Proxy musí posílat skutečnou IP. Hlavička X-Forwarded-For, viz nginx nebo Caddy.
2. Aplikace ji musí zapisovat do logu. V nginxu:
log_format proxy '$http_x_forwarded_for - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent';
access_log /var/log/nginx/access.log proxy;
Když je před tebou ještě Cloudflare, potřebuješ navíc set_real_ip_from s jejich rozsahy — viz nginx.
Ověř si po nasazení, že v logu vidíš skutečné adresy návštěvníků, ne pořád tu samou.
Docker
Fail2ban běžící na hostiteli zapisuje pravidla do INPUT, ale provoz do kontejnerů jde přes FORWARD. Blokace tedy nemusí zabrat.
Řešení je nastavit banaction, která zapisuje do DOCKER-USER:
[DEFAULT]
banaction = iptables-allports
chain = DOCKER-USER
Souvislosti v Docker a firewall.
CrowdSec
Modernější alternativa. Rozdíl je v tom, že sdílí informace mezi instalacemi — když někoho zablokuje deset tisíc serverů, dozvíš se to dřív, než k tobě dorazí.
curl -s https://install.crowdsec.net | sh
apt install crowdsec
apt install crowdsec-firewall-bouncer-nftables
cscli metrics
cscli decisions list
cscli collections list
cscli collections install crowdsecurity/nginx
Architektura je oddělená: detektor čte logy a rozhoduje, bouncer blokuje. Bouncerů je víc druhů — firewallový, plugin do nginxu, plugin do Cloudflare.
Fail2ban nebo CrowdSec
Fail2ban je jednodušší, běží všude, nepotřebuje připojení ven, konfigurace je textová a předvídatelná. Pro jeden server je to pořád rozumná volba.
CrowdSec dává předběžnou ochranu díky sdílené databázi, lépe se škáluje a má hezčí přehledy. Cenou je složitější architektura a to, že posílá signály ven.
Pro homelab s pár službami bych zůstal u fail2ban. Když provozuješ něco veřejného a hlučného, CrowdSec dává větší smysl.
Nepouštěj oba naráz — budou si lézt do zelí ve firewallu.
Realistické očekávání
Tyhle nástroje řeší hlučnost, ne cílený útok. Botnet s deseti tisíci adresami je fail2ban neschopný zastavit, protože každá adresa zkusí jednou.
Skutečná obrana je jinde: klíče místo hesel, aktualizace, autentizace před službami a nevystavovat ven nic, co tam nemusí být.