markdown
Fail2ban-a-CrowdSec.md
markdown
# 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](Zabezpeceni-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](Linux-firewall). ### Instalace a základ ```bashapt install fail2ban``` Nikdy needituj `jail.conf`, přepíše se při aktualizaci. Vytvoř `/etc/fail2ban/jail.local`: ```ini[DEFAULT]bantime = 1hfindtime = 10mmaxretry = 5backend = systemdignoreip = 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 = truelogpath = /var/log/nginx/error.log [nginx-limit-req]enabled = truelogpath = /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. ```bashsystemctl restart fail2banfail2ban-client statusfail2ban-client status sshd``` ### Odblokování ```bashfail2ban-client set sshd unbanip 1.2.3.4fail2ban-client unban --all``` ### Postupné prodlužování ```ini[DEFAULT]bantime.increment = truebantime.factor = 2bantime.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`: ```ini[Definition]failregex = ^.*Failed login attempt from <HOST>.*$ignoreregex =``` ```ini[mojeapp]enabled = trueport = http,httpsfilter = mojeapplogpath = /var/log/mojeapp/access.logmaxretry = 3``` Otestuj regulární výraz proti skutečnému logu, než to nasadíš: ```bashfail2ban-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](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](Nginx) nebo [Caddy](Caddy). **2. Aplikace ji musí zapisovat do logu.** V nginxu: ```nginxlog_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](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`: ```ini[DEFAULT]banaction = iptables-allportschain = DOCKER-USER``` Souvislosti v [Docker a firewall](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í. ```bashcurl -s https://install.crowdsec.net | shapt install crowdsecapt install crowdsec-firewall-bouncer-nftables``` ```bashcscli metricscscli decisions listcscli collections listcscli 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](Zabezpeceni-serveru), aktualizace, [autentizace před službami](Autentizace-pred-sluzbami) a nevystavovat ven nic, co tam nemusí být.