Skip to content

Crowdsec - Ein fail2ban Ersatz?

Linux
  • Ich spiele ja die letzte Zeit ein wenig mit Ansible, Semaphore und hcloud herum. Dabei habe ich angefangen einen Server so einzurichten, wie ich das benötige. Eines der Standardtools ist fail2ban.

    Beim Testen fiel mir dann auf, das der Service nicht startet. Alles findet auf einem Debian Bookworm 12 statt, das up to Date ist. Alle Pakete aktuell, neuer Kernel und durchgestartet.

    × fail2ban.service - Fail2Ban Service
         Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; preset: enabled)
         Active: failed (Result: exit-code) since Sun 2023-08-27 11:31:16 UTC; 2min 7s ago
       Duration: 360ms
           Docs: man:fail2ban(1)
        Process: 4830 ExecStart=/usr/bin/fail2ban-server -xf start (code=exited, status=255/EXCEPTION)
       Main PID: 4830 (code=exited, status=255/EXCEPTION)
            CPU: 174ms
    
    Aug 27 11:31:16 test-server systemd[1]: Started fail2ban.service - Fail2Ban Service.
    Aug 27 11:31:16 test-server fail2ban-server[4830]: 2023-08-27 11:31:16,796 fail2ban.configreader   [4830]: WARNING 'allowipv6' not defined in 'Definition'. Using default one: 'auto'
    Aug 27 11:31:16 test-server fail2ban-server[4830]: 2023-08-27 11:31:16,846 fail2ban                [4830]: ERROR   Failed during configuration: Have not found any log file for sshd jail
    Aug 27 11:31:16 test-server fail2ban-server[4830]: 2023-08-27 11:31:16,855 fail2ban                [4830]: ERROR   Async configuration of server failed
    Aug 27 11:31:16 test-server systemd[1]: fail2ban.service: Main process exited, code=exited, status=255/EXCEPTION
    Aug 27 11:31:16 test-server systemd[1]: fail2ban.service: Failed with result 'exit-code'.
    

    Ich hatte dann den Fehler versucht, mit Hilfe des Internets zu fixen. Keine Chance - nix vernünftiges gefunden. Interessanterweise funktionieren alle meinen Server, wo fail2ban drauf war. Naja, wofür kennt man Systemadministratoren 🙂 Mal kurz nachgefragt, kommt CrowdSec als Antwort.

    Und ich stand im Regen, weil es doch ein sehr mächtiges Tool ist, aber es geht - wenn man weiß wie.

    Installation

    Ok, ist in Debian drin

    apt install crowdsec
    

    Am Anfang getestet, aber es bannt nicht!? Doku lesen und dann verstehen, das man Firewall Bouncer installieren muss, damit das klappt.

    apt install crowdsec-firewall-bouncer
    

    Ok, danach bannt er auch. Sieht dann z.B. so aus

    /etc/crowdsec# cscli decisions list
    ╭───────┬──────────┬───────────────────┬──────────────────────┬────────┬─────────┬────┬────────┬────────────────────┬──────────╮
    │  ID   │  Source  │    Scope:Value    │        Reason        │ Action │ Country │ AS │ Events │     expiration     │ Alert ID │
    ├───────┼──────────┼───────────────────┼──────────────────────┼────────┼─────────┼────┼────────┼────────────────────┼──────────┤
    │ 15006 │ crowdsec │ Ip:185.186.129.12 │ crowdsecurity/ssh-bf │ ban    │         │    │ 6      │ 3h55m46.005175855s │ 7        │
    │ 15005 │ crowdsec │ Ip:154.93.3.90    │ crowdsecurity/ssh-bf │ ban    │         │    │ 6      │ 3h32m15.506170007s │ 6        │
    │ 15003 │ crowdsec │ Ip:156.224.22.119 │ crowdsecurity/ssh-bf │ ban    │         │    │ 6      │ 3h3m52.255275177s  │ 4        │
    ╰───────┴──────────┴───────────────────┴──────────────────────┴────────┴─────────┴────┴────────┴────────────────────┴──────────╯
    

    Jetzt weiß man ja auch von fail2ban, das die Loggs dazu geparst werden und an Hand dieser Eintröge, die IPs gebannt werden. Ok, wie funktioniert das bei CrowdSec?

    Nach der Installation auf meinem Vaultwarden-Server, sieht das so aus.

    :/etc/crowdsec# ls collections/
    apache2.yaml  base-http-scenarios.yaml  http-cve.yaml  linux.yaml  nginx.yaml  sshd.yaml
    

    Das sind die Dienste die überwacht werden. Ok, jetzt läuft da drauf aber ein Vaultwarden. Wie sichert man das jetzt ab? Man installiert folgendes

    cscli scenarios install Dominic-Wagner/vaultwarden-bf
    

    Das ist ein Scenario, das alleine bannt aber nicht. Dazu braucht man auch noch den Parser, der die Logs durchsucht.

    cscli parsers install Dominic-Wagner/vaultwarden-logs
    

    cscli ist dabei das Konsolen Tool womit man CrowdSec administriert.

    :/etc/crowdsec# cscli -h
    cscli is the main command to interact with your crowdsec service, scenarios & db.
    It is meant to allow you to manage bans, parsers/scenarios/etc, api and generally manage you crowdsec setup.
    

    Ok, danach bannt er auch bei Attacken auf Vaultwarden.

    :/etc/crowdsec# cscli decisions list
    ╭───────┬──────────┬────────────────────────────────────────┬───────────────────────────────┬────────┬─────────┬────┬────────┬────────────────────┬──────────╮
    │  ID   │  Source  │              Scope:Value               │            Reason             │ Action │ Country │ AS │ Events │     expiration     │ Alert ID │
    ├───────┼──────────┼────────────────────────────────────────┼───────────────────────────────┼────────┼─────────┼────┼────────┼────────────────────┼──────────┤
    │ 15004 │ crowdsec │ Ip:2a00:20:50:4d97:772c:223d:xxxx:xxxx │ Dominic-Wagner/vaultwarden-bf │ ban    │         │    │ 6      │ 3h59m39.152802204s │ 5        │
    │ 15003 │ crowdsec │ Ip:156.224.22.119                      │ crowdsecurity/ssh-bf          │ ban    │         │    │ 6      │ 3h55m56.024683977s │ 4        │
    ╰───────┴──────────┴────────────────────────────────────────┴───────────────────────────────┴────────┴─────────┴────┴────────┴────────────────────┴──────────╯
    

    Kurzer Hinweis. Ich habe ja für Vaultwarden das Logging umgeswitcht, damit das besser mit fail2ban zusammen arbeiten konnte. Das habe ich heute wieder auf die Standardeinstellungen zurückgestellt, damit der Parser auch was findet. Standardpfad ist jetzt wieder /var/log

    Hier noch kurz der Befehl, wie man einen Ban wieder entfernen kann. Standard bleibt der Ban 4 Stunden erhalten.

    cscli decisions delete --id 15004
    

    CrowdSec kann noch viel mehr, da kann man noch ganz viel mit Spielen 🙂 Auf diesem Bild sieht man das Konzept von CrowdSec.

    crowdsec_ecosystem.png
    Bildquelle: https://docs.crowdsec.net/docs/intro

    Die Dokumentation von CrowdSec findet man hier

    Viel Spaß!

    Und wenn jemand Erfahrungen damit hat, würde ich mich über Kommentare freuen.

  • Ich kann jetzt hier von meiner ersten Erfahrung berichten und wie CrowdSec mich gebannt hat 🙂

    Was war passiert? Ich war gestern sehr intensiv mit der Konfiguration von Nextcloud <-> Collabora Online beschäftigt. Nachdem ich irgendwie nicht weiterkam habe ich mich der Erstellung eines Dokumentes gewidmet. Nach einiger Zeit war die Nextcloud nicht mehr erreichbar.

    Ok, hatte ich bei der Konfiguration auch schon mal, den Server einmal neugestartet und fertig. Doch jetzt kam es, Server neugestartet - hilft nicht. Gut, schauen wir mal nach, Der SSH Login ging auch nicht 😞

    Jetzt war guter Rat gefragt. Zu diesem Zeitpunkt ging ich noch davon aus, das auf diesem Server kein CrowdSec installiert war, sondern fail2ban. Und fail2ban hatte eine sehr kurze Bantime vom 10M.

    Also blieb wohl nur noch das Rescue System von Hetzner.

    488866bc-3dcf-4abc-9e98-6107d65aa4c7-grafik.png

    Da hatte ich ja so gut wie gar keine Erfahrung mit. Also mal kurz den Nico angetriggert und es kam folgender Link.

    Das Laufwerk war schnell bestimmt und schnell nach /tmp gemountet. Danach musste man sich noch mit chroot in diese Umgebung anmelden.

    chroot-prepare /mnt
    chroot /mnt
    

    Nachdem das klappte, habe ich eben fail2ban disabled.

    sysmctl disable fail2ban
    

    Danach das Rescue beendet. Der Server startete wieder und ich kam wieder per SSH drauf. Puuh.
    Bei meiner ersten Kontrolle fiel mir was auf

    root@:~# pstree
    systemd─┬─2*[agetty]
            ├─atd
            ├─cron
            ├─crowdsec─┬─journalctl
            │          └─8*[{crowdsec}]
            ├─crowdsec-firewa───9*[{crowdsec-firewa}]
    

    Wie? Da läuft CrowdSec? Da ich dabei bin die Server auf CrowdSec umzustellen, war das wohl hier schon gemacht, aber leider nicht vernünftig. fail2ban hätte mindestens disabled werden müssen und in meiner Dokumentation war das auch nicht enthalten. 6 setzen!

    CrowdSec besteht ja aus zwei Diensten, CrowdSec und dem Firewall-Bouncer. Der CrowdSec Dienst lief aber nicht, der war irgendwie failed. Ok, starten wir ihn und schauen was passiert. Nachdem er gestarte war mal die Banliste angeschaut.

    cscli decisions list
    

    ergab diesen Eintrag.

    2551501 │ crowdsec │ Ip:5.146.xxx.xxx   │ crowdsecurity/http-crawl-non_statics │ ban    │         │    │ 53     │ 1h5m55.391864693s  │ 1671
    

    Meine IP war gebannt. Dann wissen wir ja , woher die Probleme kamen.

    cscli decisions delete --id 2551501
    

    Nach Eingabe war der Ban entfernt. Na gut, aber da ich aktuell immer noch an der richtigen Konfiguration von NC <-> CODE bastel, könnte das ja wieder passieren. Was machen? Kurz gegoogelt. Es gibt eine Whitelist. Aha!

    /etc/crowdsec/parsers/s02-enrich/whitelists.yaml

    name: crowdsecurity/whitelists
    description: "Whitelist events from private ipv4 addresses"
    whitelist:
      reason: "private ipv4/ipv6 ip/ranges"
      ip: 
        - "127.0.0.1"
        - "::1"
        - "5.146.XXX.XXX"
      cidr:
        - "192.168.0.0/16"
        - "10.0.0.0/8"
        - "172.16.0.0/12"
      # expression:
      #   - "'foo.com' in evt.Meta.source_ip.reverse"
    

    Danach den Dienst neustarten. Jetzt hoffen wir mal, das es hilft.

    Zum Schluss noch was, was mir aufgefallen war und was mich auch sehr verwirrt hatte. CrowdSec hatte wegen einem crowdsecurity/http-crawl-non_statics gebannt. Dadurch konnte ich meine
    subdomain.<DOMAIN> nicht erreichen. Ok, logisch, wenn der Ban von da ausgeht. Ich konnte aber gleichzeitig eine andere subdomain mit derselben <DOMAIN> auch nicht erreichen. Komplett verwirrte es mich dann, als ich eine andere <DOMAIN> auf dem selben Server erreichen konnte. Und zum Schluss ging auch der SSH nicht.

    Also, wieder viel gelernt.. 🤓