In dieser Anleitung zeige ich euch, wie ihr den Firewall Bouncer für CrowdSec installieren könnt. Dieser ermöglicht es neben dem Traefik Bouncer, dass ihr Angreifer blockieren könnt über Ports, welche nicht von Traefik kontrolliert werden. So ist es euch beispielsweise möglich SSH abzusichern.
Datum | Änderungen |
---|---|
25.10.2022 | Erstellung dieser Anleitung |
13.12.2022 | Kapitel 8 hinzugefügt |
23.12.2022 | Kapitel 4 angepasst an die neue CrowdSec Anleitung von @psycho0verload |
0. Grundidee
Die Grundidee dieser Anleitung ist, dass wir auf unserem Server direkt (bei mir Debian 11) den CrowdSec Firewall Bouncer installieren. Diesen wollen wir dann mit unserem CrowdSec Dienst (in Docker) verbinden. So soll unserer Bouncer immer neue Regeln erhalten und dann per iptables die Firewall des Hosts Systems (Debian 11) anpassen.
1. Grundvoraussetzung
- Docker & Docker Compose v2 (Debian / Ubuntu)
- Traefik v2 – Reverse-Proxy mit CrowdSec einrichten
2. CrowdSec Firewall Bouncer installieren
2.1 Repository hinzufügen
Dazu müssen wir zuerst das Repository einbinden. Für Ubuntu / Debian gebt ihr nachfolgenden Code ein. Für andere Systeme könnt ihr direkt beim Hersteller schauen.
curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | bash
2.2 CrowdSec Firewall Bouncer installieren
Dazu gebt ihr dann nur noch folgenden Befehl ein:
apt install crowdsec-firewall-bouncer-iptables
3. Api Key generieren
Nun generieren wir uns noch einen API Key. Dazu gebt ihr folgendes ein:
docker exec crowdsec cscli bouncers add iptablesFirewallBouncer
So sieht die Ausgabe bei mir aus:
Api key for 'iptablesFirewallBouncer': b5aa52a9c2e28f7e16dcc9f6xxxxxxx Please keep this key since you will not be able to retrieve it!
4. Konfiguration anpassen
Dazu gebt ihr einfach folgenden Befehl ein:
nano /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml
Folgende Zeilen müsst ihr nun anpassen:
vorher: api_url: http://127.0.0.1:8080/ api_key: nachher: api_url: http://172.31.0.2:8080/ api_key: b5aa52a9c2e28f7e16dcc9f6xxxxxxx
5. CrowdSec Firewall Bouncer starten
Nun starten wir mittels folgenden Befehl den Bouncer:
systemctl start crowdsec-firewall-bouncer
Anschließend kontrollieren wir noch den Status:
systemctl status crowdsec-firewall-bouncer
Hier sollte jetzt so etwas stehen:
crowdsec-firewall-bouncer.service - The firewall bouncer for CrowdSec Loaded: loaded (/etc/systemd/system/crowdsec-firewall-bouncer.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2022-10-24 23:51:09 CEST; 21s ago Process: 14877 ExecStartPre=/usr/sbin/crowdsec-firewall-bouncer -c /etc/crowdsec/bouncers/crowd .. ..
6. CrowdSec Bouncer List anzeigen
Nun lassen wir uns noch alle CrowdSec Bouncer anzeigen. Dort müsste ja unser Firewall Bouncer auftauchen.
docker exec crowdsec cscli bouncers list
Das Ergebnis:
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Name IP Address Valid Last API pull Type Version Auth Type ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- bouncer-traefik 172.31.0.3 ✔️ 2022-12-23T20:01:33Z Go-http-client 1.1 api-key iptablesFirewallBouncer 172.31.0.1 ✔️ 2022-12-23T20:01:33Z crowdsec-firewall-bouncer v0.0.24-debian-pragmatic-8e00af2c9e83af22deab8c0c49a4ad9b8f- api-key c57a3f ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Hat also alles funktioniert.
7. CrowdSec Firewall Bouncer Log auslesen
Nun wollen wir uns noch das Log anschauen. Dies kann auch im Fehlerfall sehr hilfreich sein. Gebt dazu folgendes ein:
cat /var/log/crowdsec-firewall-bouncer.log
Bei mir steht in den letzten Zeilen, dass unser Bouncer neue Entscheidungen von CrowdSec hinzugefügt bekommen hat.
time="24-10-2022 23:51:09" level=info msg="Using API key auth" time="24-10-2022 23:51:09" level=info msg="Processing new and deleted decisions . . ." time="24-10-2022 23:51:09" level=info msg="14 decisions added" time="24-10-2022 23:52:59" level=info msg="1 decision added" time="24-10-2022 23:54:29" level=info msg="1 decision added"
8. CrowdSec Firewall Bouncer automatisch starten
Nun könnt ihr noch einen Cron Eintrag machen, damit bei jedem Serverneustart euer Firewall Bouncer automatisch gestartet wird. Solltet ihr dies nicht tun, so müsst ihr ihn nach jedem Neustart von Hand starten. Danke an @ice-cue für den Tipp.
Ihr gebt also einfach folgenden Befehl ein um Cron zu starten:
crontab -e
Nun wählt ihr euren Editor aus. Bei mir also “1”.
Anschließend gebt ihr folgendes ein:
@reboot sleep 120 && systemctl start crowdsec-firewall-bouncer
Jetzt sollte es so bei euch aussehen:
Dieser Befehl bewirkt, dass 120 Sekunden nach dem Serverneustart euer CrowdSec Firewall Bouncer gestartet wird.
9. Praxistest durchführen
9.1 gebannte IPs anschauen
Ihr könnt euch mit einem Befehl alle aktuellen Bans anschauen:
docker exec crowdsec cscli decisions list
9.2 eigene IP bannen
Wir wollen uns zum Testen nun selbst bannen. Wenn alles funktioniert, haben wir dann EINE MINUTE KEINEN Zugriff mehr auf unseren Server. Dazu ermitteln wir unsere eigene IP Adresse mit folgender Webseite: https://www.wieistmeineip.de/
Anschließend gebt ihr folgenden Befehl ein. Wichtig dabei ist, dass ihr die “1.2.3.4” durch eure eigene IP abändern müsst.
docker exec crowdsec cscli decisions add --ip 1.2.3.4 --duration 1m
Wenn ihr alles richtig gemacht habt, dann sollte eure SSH Verbindung sowie alle anderen Verbindungen zu eurem Server nun eine Minute blockiert / gesperrt sein.
Ich habe auf einem Debian 11 ein Update für den crowdsec-firewall-bouncer-iptables angeboten bekommen. Das fehlt aber fehl mit der Meldung »installiertes crowdsec-firewall-bouncer-iptables-Skript des Paketes post-installation«-Unterprozess gab den Fehlerwert 1 zurück. Ein Deinstallieren und wieder installieren brachte nichts. Kennt einer von euch eine Lösung?
Hi,
habe mit einem plain minimal 22.04 ubuntu gestartet. Traefik,Crowdsec und Mailcow laufen soweit nach den Anleitungen hier. Ich scheitere am firewall bouncer. Dieser läst sich nicht starten. Was an sich ja nicht ganz so tragisch wäre, wenn ich denn wenigstens eine brauchbare Fehlermeldung bekommen würde. Selbst verbose mit -v bringt nichts.
Ich habe lediglich den API Key in die Standard /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml eingetragen. Bin nun an diesem Punkt am Ende meines Lateins… Beim Starten vom Bouncer kommt eine SSHD Meldung “error: kex_exchange_identification: client sent invalid protocol identifier “GET /v1/decisions/stream?startup=true HTTP/1.1″”
Vielleicht hat ja jemand einen Tipp.
Vielen Dank für diese gute Anleitung und auch für die zur Installation von Traefik mit CrowdSec!!
Ich hatte zunächst wie beschrieben den traefik-bouncer eingerichtet, funktionierte auch alles prima.
Erst anschließend bin ich auf diesen Beitrag gestoßen und habe dann auch den firewall-bouncer eingerichtet.
Dieser funktioniert nun wie gewünscht, allerdings wird mit “docker exec crowdsec cscli bouncers list” in der Tabelle nur der iptablesFirewallBouncer mit einer IP-Adresse angezeigt. Beim bouncer-traefik fehlt die IP-Adresse.
In der CrowdSec-Console werden für meine Instanz zwar ebenfalls 2 Bouncer angezeigt, der bouncer-traefik aber auch hier als inactive bzw. unknown.
Wo kann der Haken sein?
172.31.0.2 und 172.10.0.3 beide auf port 8080, vielleicht hier?
Beste Grüße
Olaf
Herzlichen Dank für die Top anleitung.
Mir ist nur aufgefallen das die IP Adresse die ich in der Anleitung auslesen und in der Config hinterlegen muss sich bei jedem Serverneustart oder Containerneustart sich neu generiert und dadurch eine neue IP entsteht. ist es möglich diese IP im Crowdsec container Statisch zu hinterlegen?
Greets,
Caspar
Servus, die Installation hat super geklappt. Nur eine Verständnisfrage (bin Neuling in Sachen Linux): Ich setze ufw als Firewall ein. Da diese auf iptables basiert, ist diese Anleitung auch für meinen Anwendungsfall passend, oder?
Hallo, bei mir startet der Firewall Bouncer leider nicht.
crowdsec-firewall-bouncer[1413287]: time=”31-10-2022 22:06:14″ level=fatal msg=”iptables init failed: error while creating set : exit status 1 –> ipset
Hi Christian das ging jetzt ja fix 🙂 Ich hab dazu noch ein Anmerkung, was auch deine Frage an mich aus dem anderen Kommentar betrifft. Ich habe es bei mir so gelöst, dass ich beim crowsdsec Container den Port 8080 auf 127.0.0.1:8080 per ports Direktive exponiert habe. Hatte bei mir schon öfters den Fall, dass die internen Docker IPs sich ändern (z.B. stack down/up, Docker Engine Update, usw.), daher hab ich mich für die sicherere Variante entschieden.
Gleich mal ausprobiert. Anleitung funktioniert einwandfrei. Vielen Dank Christian.