# 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

```bash
apt install fail2ban
```

Nikdy needituj `jail.conf`, přepíše se při aktualizaci. Vytvoř `/etc/fail2ban/jail.local`:

```ini
[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.

```bash
systemctl restart fail2ban
fail2ban-client status
fail2ban-client status sshd
```

### Odblokování

```bash
fail2ban-client set sshd unbanip 1.2.3.4
fail2ban-client unban --all
```

### Postupné prodlužování

```ini
[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`:

```ini
[Definition]
failregex = ^.*Failed login attempt from <HOST>.*$
ignoreregex =
```

```ini
[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íš:

```bash
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](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:

```nginx
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](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-allports
chain = 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í.

```bash
curl -s https://install.crowdsec.net | sh
apt install crowdsec
apt install crowdsec-firewall-bouncer-nftables
```

```bash
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](Zabezpeceni-serveru), aktualizace, [autentizace před službami](Autentizace-pred-sluzbami) a nevystavovat ven nic, co tam nemusí být.
