Einführung: Das Internet ist ein Schlachtfeld
Sobald du einen Server mit Port 80 oder 443 ins Internet stellst, dauert es keine 5 Minuten, bis die ersten Bots anklopfen. Sie suchen nach veralteten WordPress-Versionen, offenen Admin-Interfaces oder versuchen, Passwörter zu erraten (Brute Force).
Ein normaler Firewall-Schutz reicht hier nicht, denn diese Angriffe kommen über den ganz normalen Web-Traffic rein. Wir brauchen eine intelligente Analyse. Früher nutzte man dafür Fail2Ban. Heute nutzen wir Crowdsec.
Crowdsec funktioniert ähnlich wie die Navigations-App Waze: Wenn ein Nutzer einen Stau (oder hier: einen Angriff) meldet, werden alle anderen gewarnt.
Wenn eine IP-Adresse meinen Server angreift, meldet mein Crowdsec dies an die zentrale Datenbank. Sobald genügend Meldungen vorliegen, landet diese IP auf einer globalen Blocklist. Dein Server profitiert also von den Angriffen auf tausende andere Server und blockiert Bösewichte, bevor sie dich überhaupt das erste Mal scannen.
Die Architektur: Gehirn und Muskel
Crowdsec trennt strikt zwischen Erkennung und Abwehr. Das macht es so flexibel.
1. Der Agent (LAPI) – Das Gehirn
Der Crowdsec-Container ist unser Detektiv. Er liest Logdateien (z.B. von Traefik) und analysiert sie in Echtzeit.
- Parser: Verstehen das Log-Format („Ah, das ist ein Traefik-Log, hier ist die IP, da der Status-Code“).
- Szenarien: Erkennen Muster („Diese IP hat 50x in 10 Sekunden eine nicht existierende Seite aufgerufen -> Das ist ein Web-Scanner!“).
Wenn ein Szenario zutrifft, trifft der Agent eine Entscheidung („Decision“): IP 1.2.3.4 wird für 4 Stunden gebannt.
2. Der Bouncer – Der Muskel
Der Agent selbst blockiert nichts. Er sagt nur „Das ist böse“. Für das Blockieren brauchen wir einen Bouncer. In unserem Fall ist das ein Plugin direkt in Traefik. Traefik fragt bei jeder Anfrage kurz beim Agenten nach: „Darf diese IP rein?“
Die Installation (crowdsec-docker-compose.yml)
Schauen wir uns unsere Konfiguration im Detail an:
services:
crowdsec:
image: crowdsecurity/crowdsec:v1.7.3
container_name: crowdsec_lapi
restart: always
environment:
# Wir sagen Crowdsec, welche Regel-Pakete es laden soll
- COLLECTIONS=crowdsecurity/traefik crowdsecurity/http-cve
networks:
- crowdsec
volumes:
# Konfiguration und Datenbank persistent speichern
- /opt/containers/crowdsec/config:/etc/crowdsec
- /opt/containers/crowdsec/data:/var/lib/crowdsec/data
# WICHTIG: Zugriff auf die Logs der anderen Container!
- /var/log/traefik:/var/log/traefik:ro
healthcheck:
test: ["CMD", "cscli", "lapi", "status"]
Wichtige Details:
- COLLECTIONS: Hier laden wir fertige Intelligenz herunter.
crowdsecurity/traefikbringt alles mit, um Traefik-Logs zu verstehen.http-cveerkennt Versuche, bekannte Sicherheitslücken auszunutzen. - Volumes (Logs): Crowdsec muss die Logs lesen können. Deshalb mounten wir
/var/log/traefikin den Container. (Hinweis: Das setzt voraus, dass Traefik so konfiguriert ist, dass es Logs in eine Datei schreibt, nicht nur nach stdout).
Die Konfiguration: Traefik als Log-Schreiber
Damit Crowdsec etwas zu lesen hat, müssen wir Traefik sagen, dass es Logs schreiben soll. Ein Blick zurück in unsere traefik.yml:
accessLog: filePath: "/var/log/traefik/access.log" format: json bufferingSize: 50
Wir nutzen das JSON-Format, weil Crowdsec das extrem schnell und fehlerfrei parsen kann. Die bufferingSize sorgt dafür, dass die Festplatte nicht bei jedem einzelnen Request belastet wird.
Die Konfiguration: Traefik als Bouncer
Jetzt verbinden wir den Muskel. In der traefik-docker-compose.yml haben wir diese Labels gesetzt:
labels:
- "traefik.http.middlewares.crowdsec.plugin.crowdsec.crowdsecLapiUrl=http://crowdsec_lapi:8080"
- "traefik.http.middlewares.crowdsec.plugin.crowdsec.crowdsecLapiKey=${CROWDSEC_LAPI_KEY}"
- "traefik.http.routers.traefik.middlewares=crowdsec"
Hier definieren wir eine Middleware namens crowdsec. Sie verbindet sich mit unserem Crowdsec-Container (LAPI).
Wichtig: Damit das funktioniert, müssen beide Container im selben Docker-Netzwerk (crowdsec) sein!
Den API-Key generieren
Du fragst dich sicher: „Woher bekomme ich den CROWDSEC_LAPI_KEY?“ Den müssen wir einmalig generieren.
1. Starte den Crowdsec-Container: docker compose up -d crowdsec
2. Gehe in den Container: docker exec -it crowdsec_lapi bash
3. Generiere den Key: cscli bouncers add traefik-bouncer
Den Key, den du erhältst, trägst du in deine .env Datei ein.
Crowdsec im Alltag: Wichtige Befehle
Crowdsec läuft im Hintergrund, aber manchmal willst du wissen, was passiert. Hier sind die wichtigsten Befehle für die Konsole (innerhalb des Containers):
1. Wer wurde gebannt?
cscli decisions list
Zeigt dir eine Liste aller aktuell blockierten IPs und den Grund (z.B. „http-crawl-non_statics“).
2. Wie ist die Lage?
cscli metrics
Zeigt dir Statistiken: Wie viele Logs wurden gelesen? Wie viele Angriffe erkannt?
3. Einen Freund entbannen
Du hast dich selbst ausgesperrt? Kein Problem:
cscli decisions delete --ip 1.2.3.4
Fazit & Ausblick
Mit Crowdsec haben wir eine aktive Verteidigungslinie. Unser Server „lernt“ aus Angriffen und schützt sich selbst.
Jetzt ist unsere Infrastruktur sicher und stabil. Im nächsten Teil kümmern wir uns um das Thema „Identität“. Wir installieren Authentik, damit wir uns nicht für jeden Dienst ein neues Passwort merken müssen.

Sei der Erste der einen Kommentar abgibt