Poznámky k instalaci Fail2ban

Aplikace fail2ban je nainstalovaná na bis.vse.cz, v adresáři /etc/fail2ban se můžete inspirovat. Lokální úpravy se zapisují do souborů s koncovkou .local. Např. k souboru jail.conf jsou lokální úpravy v jail.local či k souboru common.conf v souboru common.local. Obvykle soubor zkopíruji do .local a poté upravím.

U log souborů vytvářených přes syslog jsou na studentských serverech dvě úpravy proti standardu

  1. datum a čas jsou ve formátu ISO 8601. Např. místo Fri Dec 29 14:25:59.883277 2023 je čas 2023-12-29T14:25:59.883277+01:00. Záznamy dle času ISO 8601 lze řadit, obsahují časovou zónu, nejsou závislé na nastavení národního prostředí.
  2. záznamy obsahují prioritu (severity). Místo záznamu Fri Dec 29 14:25:59.883277 2023 auth sshd[2354015]: Connection from 146.102.18.88 port 49656 on 146.102.18.5 port 22 rdomain „“ je záznam 2023-12-29T14:25:59.883277+01:00 info auth sshd[2354015]: Connection from 146.102.18.88 port 49656 on 146.102.18.5 port 22 rdomain „“. Za časem je položka priorita (severity) označující závažnost upozornění z pohledu autora aplikace, jedna z hodnot debug, info, notice, warning, err, crit, alert, emerg.

První úpravu fail2ban akceptuje, pro druhou je potřeba upravit regulární výraz ve filter.d/common.conf, tj. vytvořit soubor filter.d/common.local s následujícím obsahem (můžete zkopírovat i z bis.vse.cz):

[DEFAULT]

__prefix_line = \s*\S+\s+\S+\s+%(__daemon_combs_re)s?\s(?:%(__daemon_extra_re)s\s+)?

Při neúspěšných přihlášení může fail2ban zablokovat přístup z příslušné IP adresy. Je vhodné nastavit IP adresy, které se nikdy nezablokují - já obvykle nastavuji celý školní IP rozsah. K souboru jail.conf vytvořím soubor jail.local s následujícím obsahem:

[DEFAULT]

# "ignoreip" can be an IP address, a CIDR mask or a DNS host. Fail2ban will not
# ban a host which matches an address in this list. Several addresses can be
# defined using space separator.
ignoreip = 127.0.0.1/8 146.102.0.0/16 ::1/128 2001:718:1e02::/48

Aplikace CrowdSec z https://www.crowdsec.net/ je alternativou k fail2ban. Má několik výhod:

  • automaticky sdílí údaje se službou CrowdSec - na www.crowdsec.net si můžete zřídit účet a po registraci serveru vidíte základní údaje na dashboardu,
  • automaticky získáváte seznam podezřelých IP adres (community-blocklist) - IP adresy, které detekovali ostatní. Tento seznam můžete použít k filtrování. Vámi detekované podezřelé přihlášení se započítávají do seznamu podezřelých IP adres. Fail2ban umí odesílat údaje na obdobné služby blocklist.de či abuseipdb, ale stahování seznamů IP adres pro nastavení firewallu musíte udělat mimo.
  • základní nastavení včetně filtrování mi přijde trochu jednodušší. Při instalaci se spustí wizard, který zjistí spuštěné služby a na základě toho nastaví detekci.
  • podporuje specifické akce - např. vynucení captcha při přihlášení z problematické IP adresy,
  • můžete získat další seznamy IP adres a ty použít k blokování či jiné akci,
  • lze získávat externí informace (tzv. enrichers), např. k IP adrese stát, kde je pravděpodobně umístěna.

Má také několik nevýhod:

  • součástí distribuce Debianu je zastaralá verze, nainstalujte aktuální z crowdsec.net (viz https://docs.crowdsec.net/docs/next/getting_started/install_crowdsec/)
  • používá odlišné pojmy, má odlišnou strukturu aplikace,
  • některé funkce jsou placené - jedná se ale o funkcionality, které fail2ban nemá (firemní dashboard, centralizovaná konfigurace, některé seznamy IP adres, …),

Akce provádí tzv. bouncer - je potřeba je instalovat samostatně, může jich být více. Pro firewall použijte nftables, konkrétně následující balíček
apt install crowdsec-firewall-bouncer-nftables

Není potřeba dále upravovat. Pravidla nftables si zobrazíte příkazem nft list ruleset.

Stejně jako u fail2ban je potřeba upravit parser. Nestudoval jsem, jak to lze udělat trvale (tj. aby se při aktualizaci změna nepřepsala). Rychlá cesta je upravit soubor /etc/crowdsec/patterns/linux-syslog - zakomentovat stávající definici SYSLOGBASE2 a nahradit ji novou

#SYSLOGBASE2 (?:%{SYSLOGTIMESTAMP:timestamp}|%{TIMESTAMP_ISO8601:timestamp8601}) (?:%{SYSLOGFACILITY} )?%{SYSLOGHOST:logsource}+(?: %{SYSLOGPROG}:|)
SYSLOGBASE2 (?:%{SYSLOGTIMESTAMP:timestamp}|%{TIMESTAMP_ISO8601:timestamp8601}) %{WORD:priority} (?:%{SYSLOGFACILITY} )?%{SYSLOGHOST:logsource}+(?: %{SYSLOGPROG}:|)

Ověřit úpravy můžete následujícím příkazem pro vysvětlení analýzy řádků:

cscli explain --log '2023-12-28T16:13:26.26013+01:00 info authpriv sshd[4962]: Failed password for invalid user root from 128.199.150.10 port 52826 ssh2' --type syslog --verbose

Ke konci výpisu by měla být informace, že řádek spadá pod čtyři scénáře

      ├ Scenarios
              ├ 🟢 crowdsecurity/ssh-bf
              ├ 🟢 crowdsecurity/ssh-bf_user-enum
              ├ 🟢 crowdsecurity/ssh-slow-bf
              └ 🟢 crowdsecurity/ssh-slow-bf_user-enum

Viz https://docs.crowdsec.net/docs/whitelist/format a https://docs.crowdsec.net/docs/whitelist/create/ Tj. vytvořit soubor /etc/crowdsec/parsers/s02-enrich/vsewhitelist.yaml s následujícím obsahem (jedná se o formát yaml, závisí na odsazení):

name: crowdsecurity/whitelists
description: "Whitelist events from vse addresses"
whitelist:
  reason: "VSE ipv4/ipv6 ip/ranges"
  ip:
    - "127.0.0.1"
    - "::1"
  cidr:
    - "146.102.0.0/16"
    - "193.84.68.0/24"
    - "2001:718:1e02::/48"
    - "2001:4de8:5e:1000::/64"

Poté znovunačíst konfiguraci pomocí systemctl reload crowdsec Použité parsery lze vypsat pomocí cscli parsers list

  • Poslední úprava: 2024/05/24 15:20
  • autor: pavlicek