TL;DR — Kurzzusammenfassung
CrowdSec vollständige Anleitung: Installation, Bouncer-Konfiguration, eigene Szenarien, Community-Blocklisten und Nginx+SSH-Schutz unter Linux.
Jeder mit dem Internet verbundene Server steht unter konstantem Beschuss: SSH-Scanner, Web-Vulnerability-Crawler, Credential-Stuffing-Bots und API-Missbraucher erzeugen jede Stunde Millionen von bösartigen Anfragen. CrowdSec ist ein modernes Open-Source-Intrusion-Prevention-System, das über die einfache Log-Überwachung auf einem einzelnen Server hinausgeht: Es analysiert Ihre Logs lokal, erkennt Angriffsmuster mithilfe verhaltensbasierter Szenarien und teilt anonymisierte Angreifer-IPs mit einer globalen Community, um kollaborative Blocklisten aufzubauen. Dieser Leitfaden deckt das vollständige CrowdSec-Setup ab: Architektur, Installation auf Debian/Ubuntu und RHEL/Rocky, Collections, Bouncer, benutzerdefinierte Szenarien, Whitelists, Multi-Server-Deployment und einen vollständigen Produktions-Hardening-Walkthrough zum Schutz von Nginx und SSH.
Voraussetzungen
Stellen Sie vor dem Start sicher, dass Sie haben:
- Einen Linux-Server mit Ubuntu 20.04/22.04/24.04, Debian 11/12 oder RHEL/Rocky/AlmaLinux 8/9
- Root- oder sudo-Zugang
- systemd als Init-System
- iptables, nftables oder firewalld für den Firewall-Bouncer verfügbar
- Grundlegende Kenntnisse mit YAML-Konfigurationsdateien
Wie CrowdSec Funktioniert
CrowdSec trennt die Bedrohungserkennung von ihrer Durchsetzung in drei Schichten:
1. Agent (Erkennung)
Der CrowdSec-Agent liest Logs aus Dateien, journald, Docker, Kafka oder Syslog. Logs durchlaufen eine mehrstufige Parsing-Pipeline: S00-raw normalisiert den Rohtext, S01-parse extrahiert strukturierte Felder (IP, Zeitstempel, HTTP-Methode, Pfad) und S02-enrich fügt GeoIP- und CTI-Daten hinzu. Analysierte Ereignisse speisen Szenarien — YAML-Zustandsmaschinen, die Leaky-Bucket-, Trigger- oder Zähler-Logik implementieren, um Angriffsmuster zu identifizieren.
2. Local API (Koordination) Die Local API (LAPI) empfängt Entscheidungen vom Agenten, speichert sie in SQLite oder PostgreSQL und stellt sie Bouncern zur Verfügung. In einem Multi-Server-Setup betreibt ein Server die LAPI, während alle anderen Agenten und Bouncer sich per HTTPS mit ihr verbinden.
3. Central API (Community-Intelligenz)
Bei der Registrierung Ihrer Instanz überträgt die Central API auf api.crowdsec.net Community-Blocklisten an Ihre LAPI und empfängt anonymisierte IP-Berichte von Ihnen. Dies macht jedes CrowdSec-Deployment zu einem Sensor, der das globale Bedrohungsnetzwerk speist.
4. Bouncer (Durchsetzung) Bouncer fragen die LAPI nach aktiven Entscheidungen ab und setzen diese durch: Der Firewall-Bouncer fügt iptables/nftables-Regeln hinzu, der Nginx-Bouncer gibt HTTP-403-Antworten oder CAPTCHA-Herausforderungen aus, und der Cloudflare-Bouncer erstellt Edge-Firewall-Regeln über die Cloudflare-API.
Installation
Ubuntu / Debian
curl -s https://install.crowdsec.net | sudo bash
sudo apt install crowdsec -y
sudo systemctl enable --now crowdsec
sudo systemctl status crowdsec
RHEL / Rocky / AlmaLinux
curl -s https://install.crowdsec.net | sudo bash
sudo dnf install crowdsec -y
sudo systemctl enable --now crowdsec
Docker
services:
crowdsec:
image: crowdsecurity/crowdsec:latest
restart: unless-stopped
environment:
COLLECTIONS: "crowdsecurity/linux crowdsecurity/nginx crowdsecurity/sshd"
volumes:
- /var/log:/var/log:ro
- crowdsec_data:/var/lib/crowdsec/data
- crowdsec_config:/etc/crowdsec
ports:
- "8080:8080"
volumes:
crowdsec_data:
crowdsec_config:
Kubernetes (Helm)
helm repo add crowdsec https://crowdsecurity.github.io/helm-charts
helm repo update
helm install crowdsec crowdsec/crowdsec \
--set agent.acquisition[0].namespace=default \
--set agent.acquisition[0].podName="*" \
--set agent.acquisition[0].program=nginx
Collections Installieren
Collections bündeln Parser und Szenarien für einen bestimmten Dienst. Installieren Sie sie mit cscli:
# Linux-Basis-Collection (auth, syslog)
sudo cscli collections install crowdsecurity/linux
# SSH-Brute-Force-Erkennung
sudo cscli collections install crowdsecurity/sshd
# Nginx-Angriffserkennung
sudo cscli collections install crowdsecurity/nginx
# Apache
sudo cscli collections install crowdsecurity/apache2
# WordPress
sudo cscli collections install crowdsecurity/wordpress
# Nach Installation neuer Collections neu laden
sudo systemctl reload crowdsec
Installierte Hub-Inhalte auflisten:
sudo cscli hub list
sudo cscli collections list
sudo cscli scenarios list
sudo cscli parsers list
Log-Erfassung
CrowdSec entdeckt Log-Quellen über /etc/crowdsec/acquis.yaml. Mehrere Erfassungsmethoden werden unterstützt:
Datei-Quelle
filenames:
- /var/log/nginx/access.log
- /var/log/nginx/error.log
labels:
type: nginx
# --- (next source)
filenames:
- /var/log/auth.log
labels:
type: syslog
journald / systemd
source: journalctl
journalctl_filter:
- "_SYSTEMD_UNIT=sshd.service"
labels:
type: syslog
Docker-Container
source: docker
container_name:
- nginx
- myapp
labels:
type: nginx
Nach Bearbeitung von acquis.yaml den Agenten neu starten:
sudo systemctl restart crowdsec
Szenarien und Parser
Szenario-Typen
| Typ | Beschreibung | Anwendungsfall |
|---|---|---|
leakybucket | Zählt Ereignisse in einem gleitenden Fenster; Überlauf löst Entscheidung aus | Brute-Force (N Fehler in T Sekunden) |
trigger | Ein einzelnes Ereignis löst sofort aus | Einzelne kritische Ereignisse |
counter | Zählt unterschiedliche Werte (z.B. gescannte URLs) | Scanner, Enumeratoren |
Beispiel eines benutzerdefinierten Szenarios
Erstellen Sie /etc/crowdsec/scenarios/myapp-bruteforce.yaml:
type: leakybucket
name: myapp/bruteforce
description: "Brute-Force auf myapp-Login-Endpunkt erkennen"
filter: "evt.Meta.service == 'myapp' && evt.Meta.log_type == 'auth_failed'"
groupby: "evt.Meta.source_ip"
distinct: "evt.Meta.username"
capacity: 5
leakspeed: "10s"
blackhole: "5m"
labels:
service: myapp
type: bruteforce
remediation: true
Schlüsselfelder:
| Feld | Bedeutung |
|---|---|
capacity | Maximale Bucket-Füllung vor Überlauf |
leakspeed | Rate, mit der der Bucket entleert wird |
blackhole | Mindestzeit zwischen wiederholten Überläufen für dieselbe IP |
groupby | Gruppierungskriterium für Ereignisse (meist Quell-IP) |
distinct | Zählt unterschiedliche Werte, um Ausweichen durch mehrere Benutzernamen zu verhindern |
remediation: true | Überlauf erzeugt eine Sperrentscheidung |
Bouncer Installieren und Konfigurieren
Firewall-Bouncer (iptables/nftables)
# iptables-Backend
sudo apt install crowdsec-firewall-bouncer-iptables -y
# nftables-Backend
sudo apt install crowdsec-firewall-bouncer-nftables -y
sudo systemctl enable --now crowdsec-firewall-bouncer
Registrierung prüfen:
sudo cscli bouncers list
Nginx-Bouncer
sudo apt install crowdsec-nginx-bouncer -y
Konfiguration in /etc/crowdsec/bouncers/crowdsec-nginx-bouncer.conf:
API_KEY=<automatisch-generiert>
API_URL=http://localhost:8080
MODE=ban # ban | captcha | throttle
CAPTCHA_SITE_KEY=<recaptcha-v2-site-key>
CAPTCHA_SECRET_KEY=<recaptcha-v2-secret>
CAPTCHA_GRACE_TIME=1800
Cloudflare-Bouncer
sudo apt install crowdsec-cloudflare-bouncer -y
sudo crowdsec-cloudflare-bouncer -g <CF_API_TOKEN> -o /etc/crowdsec/bouncers/crowdsec-cloudflare-bouncer.yaml
sudo systemctl enable --now crowdsec-cloudflare-bouncer
cscli-Referenz
# Entscheidungen
sudo cscli decisions list # Alle aktiven Sperren
sudo cscli decisions add -i 203.0.113.42 # Manuelle Sperre
sudo cscli decisions add -r 10.0.0.0/8 -t ban -d 1h # CIDR sperren
sudo cscli decisions delete -i 203.0.113.42 # Sperre entfernen
# Alarme
sudo cscli alerts list # Kürzlich ausgelöste Szenarien
sudo cscli alerts inspect <id> # Vollständiger Alarmkontext
# Hub-Verwaltung
sudo cscli hub list
sudo cscli hub update
sudo cscli collections upgrade crowdsecurity/nginx
# Maschinenverwaltung (Multi-Server)
sudo cscli machines list
sudo cscli machines add agent-web-02 --auto
# Bouncer-Verwaltung
sudo cscli bouncers list
sudo cscli bouncers add mein-bouncer
# Metriken
sudo cscli metrics
Community-Blocklisten und Central API
Registrieren Sie sich bei der Central API, um Community-Blocklisten freizuschalten:
sudo cscli console enroll <ihr-token-von-app.crowdsec.net>
sudo systemctl restart crowdsec
Community-Listen umfassen:
- CrowdSec IP-Reputationsliste — IPs, die CrowdSec-Deployments weltweit angreifen
- Firehol Level 1 — bekannte bösartige IPs
- Tor-Ausgangsnodes — optional, um anonymen Datenverkehr zu blockieren
- Proxy/VPN-Listen — Cloud-Provider-Exit-IPs, die von Bots verwendet werden
Jede Entscheidung der Central API trägt einen type: ban (harte Sperre), captcha (CAPTCHA-Herausforderung) oder throttle (Ratenbegrenzung).
Whitelists
Parser-Whitelist (vor dem Szenario)
Erstellen Sie /etc/crowdsec/parsers/s02-enrich/whitelist.yaml:
name: meinunternehmen/whitelists
description: "Büro- und Monitoring-IPs"
whitelist:
reason: "Interne und vertrauenswürdige IPs"
ip:
- "192.168.1.0/24"
- "10.0.0.0/8"
cidr:
- "172.16.0.0/12"
Post-Overflow-Whitelist
name: meinunternehmen/postoverflow-whitelist
description: "Synthetisches Monitoring von bekannten IPs erlauben"
whitelist:
reason: "Verfügbarkeits-Monitoring"
expression:
- "evt.Overflow.Alert.Source.IP in ['203.0.113.100', '203.0.113.101']"
Multi-Server-Setup
LAPI-Server
# /etc/crowdsec/config.yaml
api:
server:
listen_uri: 0.0.0.0:8080
tls:
cert_file: /etc/crowdsec/ssl/cert.pem
key_file: /etc/crowdsec/ssl/key.pem
Registrierung zusätzlicher Agenten
Auf jedem weiteren Server:
sudo apt install crowdsec -y
sudo cscli lapi register -u https://lapi-server:8080
# Auf dem LAPI-Server validieren:
sudo cscli machines validate <machine-id>
Bouncer mit Remote-LAPI verbinden
# /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml
api_url: https://lapi-server:8080
api_key: <bouncer-schluessel-vom-lapi-server>
Überwachung: Prometheus und Grafana
CrowdSec stellt Prometheus-Metriken unter http://localhost:6060/metrics bereit. Importieren Sie das offizielle CrowdSec Grafana-Dashboard (ID 14584) für eine visuelle Übersicht über:
- Ausgegebene Entscheidungen pro Stunde
- Am häufigsten angegriffene Dienste
- Parser-Trefferquoten
- Häufigkeit des Szenario-Überlaufs
Schnelle CLI-Überprüfung:
sudo cscli metrics
CrowdSec vs. Alternativen
| Tool | Mechanismus | Sprache | Multi-Server | Community-Intelligenz | Bouncer |
|---|---|---|---|---|---|
| CrowdSec | Verhaltensszenarien | Go | Nativer LAPI | Ja (Central API) | Firewall, Nginx, CF, benutzerdefiniert |
| Fail2Ban | Log-Regex | Python | Manuelle Sync | Nein | iptables, nftables, firewalld |
| Suricata | Netzwerk-IDS/IPS | C | Cluster-Modus | Regelabonnements | NFQueue |
| OSSEC/Wazuh | HIDS + Log-Analyse | C | Manager-Agent | Wazuh Cloud-Regeln | Aktive Antwort |
| ModSecurity | WAF (HTTP-Schicht) | C | Reverse Proxy | OWASP CRS | Nginx/Apache-Modul |
| Cloudflare WAF | Edge-Firewall | N/A | Globales CDN | CF-Bedrohungs-Intel | Nur CF-Edge |
Produktions-Deployment: Nginx + SSH
Schritt 1 — CrowdSec und Collections installieren:
curl -s https://install.crowdsec.net | sudo bash
sudo apt install crowdsec -y
sudo cscli collections install crowdsecurity/linux \
crowdsecurity/sshd \
crowdsecurity/nginx
Schritt 2 — Log-Erfassung konfigurieren in /etc/crowdsec/acquis.yaml:
filenames:
- /var/log/nginx/access.log
- /var/log/nginx/error.log
labels:
type: nginx
# --- (next source)
source: journalctl
journalctl_filter:
- "_SYSTEMD_UNIT=sshd.service"
labels:
type: syslog
Schritt 3 — Firewall-Bouncer installieren:
sudo apt install crowdsec-firewall-bouncer-nftables -y
sudo systemctl enable --now crowdsec-firewall-bouncer
Schritt 4 — Vertrauenswürdige IPs auf die Whitelist setzen:
# /etc/crowdsec/parsers/s02-enrich/whitelist.yaml
name: meinserver/whitelist
description: "Vertrauenswürdige IPs"
whitelist:
reason: "Büro und VPN"
ip:
- "192.168.1.0/24"
Schritt 5 — Bei der Central API registrieren:
sudo cscli console enroll <token-von-app.crowdsec.net>
sudo systemctl restart crowdsec
Schritt 6 — Prüfen, dass der Schutz aktiv ist:
sudo cscli decisions list
sudo cscli metrics
sudo cscli bouncers list
Sonderfälle und Warnungen
- False Positives von Load Balancern: Wenn der gesamte Datenverkehr über einen Reverse Proxy ankommt, sieht CrowdSec nur die Proxy-IP. Konfigurieren Sie das
X-Forwarded-For-Parsing oder fügen Sie die Proxy-IP zur Whitelist hinzu. - Docker-Logs: Docker-Logs erfordern den Erfassungstyp
source: docker. Das Einbinden von/var/logfunktioniert nicht für Container, die in stdout/stderr schreiben. - Parser-Abdeckungslücken: Prüfen Sie
sudo cscli metricsauf hoheunparsed-Werte — diese zeigen Log-Zeilen ohne installierten Parser an. - Bouncer-API-Schlüssel: Falls Sie Schlüssel regenerieren (z.B. nach einer LAPI-Neuinstallation), aktualisieren Sie die Konfigurationsdatei jedes Bouncers und starten Sie den Dienst neu.
Zusammenfassung
CrowdSec bietet ein mehrschichtiges, community-gespeistes Intrusion-Prevention-System, das vom einzelnen VPS bis zur Multi-Datacenter-Flotte skaliert:
- Der Agent analysiert Logs durch eine mehrstufige Parser-Pipeline und wertet Ereignisse mit YAML-Szenarien vom Typ Leaky-Bucket, Trigger und Zähler aus
- Die Local API koordiniert Entscheidungen und verbindet Bouncer mit Agenten in Multi-Server-Deployments
- Bouncer setzen Entscheidungen auf Firewall- (iptables/nftables), Anwendungs- (Nginx) oder CDN-Ebene (Cloudflare) durch
cscliverwaltet Collections, Entscheidungen, Alarme, Maschinen, Bouncer und Metriken über die Befehlszeile- Community-Blocklisten über die Central API ergänzen globale Bedrohungsintelligenz ohne zusätzlichen Konfigurationsaufwand
- Benutzerdefinierte Szenarien und Whitelists ermöglichen präzise Schutzanpassungen für Ihre Umgebung