CrowdSec IP Analyzer
Ein umfassendes Analysewerkzeug für CrowdSec-Blockierungen, das alle relevanten Logs, Konfigurationen und Firewall-Regeln durchsucht.
📋 Übersicht
Der CrowdSec IP Analyzer ist ein Python-Skript, das eine vollständige Analyse einer IP-Adresse durchführt und folgende Informationen sammelt:
- CrowdSec Decisions und Alerts mit Zeitstempeln
- Ausgelöste Szenarien und deren Häufigkeit
- Firewall-Regeln (iptables, ip6tables, nftables, ipset)
- System-Logs und Service-Logs
- VHost-Logs inkl. komprimierter Archive (.gz)
- Die auslösenden Log-Zeilen, die zu Bans geführt haben
✨ Hauptfunktionen
- Parallele Verarbeitung: Nutzt mehrere CPU-Cores für schnelles Durchsuchen großer Log-Mengen
- Zeitstempel-Analyse: Zeigt wann und warum IPs blockiert wurden
- VHost-Support: Durchsucht alle VHost-Logs inkl. komprimierter Archive
- Moderne AllowLists: Nutzt CrowdSec AllowLists (v1.6.8+) für temporäres Whitelisting
- Intelligente Erkennung: Unterscheidet zwischen aktiven Bans und Whitelist-Einträgen
- Farbige Ausgabe: Übersichtliche, farbcodierte Darstellung der Ergebnisse
🚀 Installation
Voraussetzungen
- Linux-System (Ubuntu/Debian getestet)
- Python 3.6+
- CrowdSec v1.6.8+ (für AllowList-Feature)
- Root-Rechte für vollständige Funktionalität
Script installieren
# Script herunterladen
wget https://raw.githubusercontent.com/DEIN_USER/DEIN_REPO/main/crowdsec-ip-analyzer.py
# Ausführbar machen
chmod +x crowdsec-ip-analyzer.py
# Optional: In PATH verschieben
sudo mv crowdsec-ip-analyzer.py /usr/local/bin/check-if-ip-banned
Optionale Abhängigkeit
Für bessere Zeitstempel-Formatierung:
pip install python-dateutil --break-system-packages
Hinweis: Das Skript funktioniert auch ohne diese Bibliothek, aber Zeitstempel werden dann weniger formatiert angezeigt.
📖 Verwendung
Grundlegende Verwendung
# Als root ausführen (empfohlen)
sudo ./crowdsec-ip-analyzer.py 78.43.28.75
# Oder wenn in PATH installiert
sudo check-if-ip-banned 192.168.1.100
Optionen
crowdsec-ip-analyzer.py --help
Argumente:
ip- Die zu analysierende IP-Adresse (erforderlich)
Beispiele
# IPv4-Adresse analysieren
sudo check-if-ip-banned 203.0.113.42
# IPv6-Adresse analysieren
sudo check-if-ip-banned 2001:db8::1
# Ausgabe in Datei umleiten
sudo check-if-ip-banned 78.43.28.75 > analyse.txt 2>&1
🔍 Was wird analysiert?
1. CrowdSec Decisions
- Aktive Blockierungen (nur ban-Decisions)
- Whitelist-Einträge (werden separat angezeigt)
- Zeitstempel (Erstellung, Ablauf)
- Decision-Typ (ban, whitelist)
- Dauer der Sperre
2. CrowdSec Alerts
- Chronologische Übersicht aller Alerts
- Auslösende Szenarien
- Event-Anzahl pro Alert
- Zeitstempel der Vorfälle
3. Firewall-Regeln
- iptables: Filter, NAT, Mangle Tables
- ip6tables: Alle IPv6-Regeln
- nftables: Komplettes Ruleset
- ipset: IP-Sets mit Timeout-Informationen
4. System-Logs
- Systemd Journal (journalctl)
- Alle Log-Dateien in
/var/log/ - Service-spezifische Logs:
- CrowdSec & Bouncers
- Nginx
- Apache
- Dovecot
- Postfix
- Fail2ban
5. VHost-Logs
- Alle VHosts unter
/var/www/vhosts/ - Verschiedene Log-Typen:
- Access-Logs
- Error-Logs
- PHP-FPM-Logs
- Proxy-Logs
- Transfer-Logs
- Inklusive komprimierter Archive (.gz)
- Statistiken pro VHost
6. Auslösende Log-Zeilen
Zeigt die tatsächlichen Log-Einträge, die zu Bans geführt haben:
- Postfix Relay-Versuche
- Ungültige SMTP-Befehle
- Dovecot Auth-Failures
- HTTP Probing/Scanning
- Backdoor-Versuche
📊 Ausgabe-Beispiel
================================================================================
CrowdSec IP Analyse für: 78.43.28.75
================================================================================
>>> CrowdSec Decisions
❌ Gefunden: 1 Decision(s)
→ │ 12345 │ 78.43.28.75 │ ban │ crowdsecurity/postfix-relay-denied │ ...
Zeitstempel der Decisions:
→ [ban] crowdsecurity/postfix-relay-denied - Erstellt: 2024-11-27 10:30:15 - Dauer: 4h
>>> Firewall Regeln
❌ IP gefunden in ipset:
→ Set: crowdsec-blacklists-0
→ 78.43.28.75 timeout 14280
⚠️ Hinzugefügt um: 2024-11-27 10:30:15 (läuft ab in 3h 58m)
>>> VHost Logs durchsuchen (parallel, inkl. .gz Archive)
✓ Durchsuche 45 VHosts parallel...
⚠️ IP in 3 VHost(s) gefunden:
example.com: 847 Einträge
access: 820
error: 27
Beispiel-Zeilen:
[access_log] 78.43.28.75 - - [27/Nov/2024:10:25:33] "POST /wp-login.php HTTP/1.1" 404
================================================================================
ZUSAMMENFASSUNG
================================================================================
BLOCKIERUNGEN GEFUNDEN:
❌ CrowdSec hat aktive ban-Decisions für diese IP
❌ IP ist in Firewall-Regeln vorhanden
❌ IP wird von Bouncers aktiv blockiert
ZEITLICHE ÜBERSICHT:
⚠️ Erste Sperrung: 2024-11-27 10:30:15 (vor 3h 45m)
⚠️ Grund: crowdsecurity/postfix-relay-denied
WARUM WURDE GEBLOCKT:
⚠️ crowdsecurity/postfix-relay-denied (5x)
⚠️ crowdsecurity/http-probing (12x)
🎯 Features im Detail
Parallele Verarbeitung
Das Skript nutzt automatisch CPU-Cores - 6 für die parallele Log-Durchsuchung:
# Bei 16 CPUs werden 10 Worker verwendet
# Bei 8 CPUs werden 2 Worker verwendet
# Minimum ist immer 1 Worker
Dies beschleunigt die Analyse erheblich, besonders bei vielen VHost-Logs.
Interaktive AllowList-Erstellung
Am Ende der Analyse bietet das Skript an, die IP temporär zu entsperren mittels CrowdSec AllowLists (verfügbar seit v1.6.8):
⚠️ IP ist AKTUELL blockiert!
Möchtest du diese IP für 72 Stunden entsperren?
Dies wird:
1. Alle aktuellen CrowdSec Decisions löschen
2. IP zur AllowList 'temp-whitelist-from-check-if-ip-banned' hinzufügen (72h)
3. Die IP aus der Firewall entfernen (falls vorhanden)
Hinweis: AllowLists funktionieren sofort (kein Neustart nötig)
AllowList erstellen? [j/n]:
Was passiert bei "ja":
- Decisions löschen: Alle aktiven ban-Decisions werden entfernt
- AllowList erstellen: Falls noch nicht vorhanden, wird die AllowList
temp-whitelist-from-check-if-ip-bannederstellt - IP hinzufügen: Die IP wird mit 72h Expiration zur AllowList hinzugefügt
- ipset säubern: Die IP wird aus ipset-Einträgen entfernt (falls vorhanden)
- Verifizierung: Der neue Status wird überprüft und angezeigt
Vorteile von AllowLists:
- ✅ Änderungen wirken sofort (kein CrowdSec-Restart nötig)
- ✅ Funktioniert mit allen CrowdSec-Komponenten (AppSec, Bouncers, etc.)
- ✅ Zentrale Verwaltung über
cscli allowlistBefehle - ✅ Automatisches Ablaufen nach 72h
Manuelle Verwaltung der AllowList:
# AllowList anzeigen
cscli allowlist inspect temp-whitelist-from-check-if-ip-banned
# Weitere IP hinzufügen
cscli allowlist add temp-whitelist-from-check-if-ip-banned 192.168.1.100 --expiration 72h
# IP aus AllowList entfernen
cscli allowlist delete temp-whitelist-from-check-if-ip-banned 78.43.28.75
# Komplette AllowList löschen
cscli allowlist delete temp-whitelist-from-check-if-ip-banned
Intelligente Ban-Erkennung
Das Skript unterscheidet zwischen:
- Ban-Decisions: Aktive Blockierungen (werden als kritisch markiert)
- Whitelist-Decisions: Erlaubte IPs (werden nicht als Blockierung gewertet)
Beispiel:
# IP mit Whitelist-Decision wird NICHT als blockiert angezeigt
KEINE AKTIVEN BLOCKIERUNGEN GEFUNDEN
# IP mit Ban-Decision wird korrekt erkannt
BLOCKIERUNGEN GEFUNDEN:
❌ CrowdSec hat aktive ban-Decisions für diese IP
❌ IP wird von Bouncers aktiv blockiert
Zeitstempel-Analyse
Mit der optionalen python-dateutil Bibliothek zeigt das Skript:
- Wann die erste Sperrung erfolgte
- Wie lange die IP bereits gesperrt ist
- Wann die Sperre abläuft
- Verbleibende Zeit in ipset
Szenario-spezifische Log-Suche
Für häufige Szenarien sucht das Skript gezielt nach relevanten Log-Zeilen:
| Szenario | Log-Dateien | Such-Pattern |
|---|---|---|
| postfix-relay-denied | mail.log | "Relay access denied" |
| postfix-non-smtp-command | mail.log | "non-SMTP command" |
| dovecot-spam | mail.log | "auth failed" |
| http-probing | access.log | "404", "403" |
| http-backdoors-attempts | access.log | "php", "admin", "wp-" |
⚙️ Konfiguration
CPU-Worker anpassen
Die Anzahl der Worker kann im Code angepasst werden:
# In der __init__ Methode der IPAnalyzer Klasse:
self.worker_count = max(1, total_cpus - 6) # Standard: CPUs - 6
# Beispiel für fixe Worker-Anzahl:
self.worker_count = 4 # Immer 4 Worker verwenden
VHost-Pfad anpassen
Falls VHosts an einem anderen Ort liegen:
# In der search_vhost_logs Methode:
vhosts_path = '/var/www/vhosts' # Standard
# Anpassen auf z.B.:
vhosts_path = '/home/vhosts'
AllowList-Name anpassen
Der Name der temporären AllowList kann geändert werden:
# In der prompt_unblock Methode:
allowlist_name = "temp-whitelist-from-check-if-ip-banned" # Standard
# Anpassen auf z.B.:
allowlist_name = "my-custom-allowlist"
🐛 Fehlerbehandlung
Das Skript enthält umfangreiche Fehlerbehandlung:
- Timeouts: Befehle werden nach 30 Sekunden abgebrochen
- Berechtigungen: Warnung bei fehlenden Root-Rechten
- Fehlende Dateien: Überspringt nicht-existierende Log-Verzeichnisse
- Große Dateien: Überspringt Dateien >100MB
- Encoding-Fehler: Behandelt ungültige UTF-8-Zeichen
- AllowList-Fehler: Zeigt hilfreiche Fehlermeldungen bei AllowList-Problemen
📝 Empfehlungen für permanente Whitelists
Für dauerhafte Whitelists gibt es zwei Methoden:
Methode 1: AllowList ohne Expiration (empfohlen)
# Permanente AllowList erstellen
cscli allowlist create permanent-whitelist -d "Permanent whitelisted IPs"
# IP ohne Expiration hinzufügen
cscli allowlist add permanent-whitelist 78.43.28.75 \
--comment "Trusted customer IP"
# Verifizieren
cscli allowlist inspect permanent-whitelist
Methode 2: Parser-basierte Whitelist (traditionell)
Für Parser-basierte Whitelists:
# Custom Whitelist erstellen
sudo nano /etc/crowdsec/parsers/s02-enrich/jtl_whitelist.yaml
# CrowdSec neu laden (erforderlich!)
sudo systemctl reload crowdsec
Beispiel jtl_whitelist.yaml:
name: crowdsecurity/jtl-whitelist
description: "JTL specific whitelist"
whitelist:
reason: "Trusted JTL IP"
ip:
- "78.43.28.75"
- "192.168.1.0/24"
Wichtig: Parser-basierte Whitelists erfordern einen CrowdSec-Reload, AllowLists wirken sofort!
🔒 Sicherheitshinweise
- Root-Rechte erforderlich: Für vollständigen Zugriff auf alle Logs und Firewall-Regeln
- Sensible Daten: Die Ausgabe kann sensitive Informationen enthalten (IPs, URLs, Pfade)
- Vorsicht beim Whitelisten: Stelle sicher, dass die IP vertrauenswürdig ist
- 72h Limit: Temporäre AllowLists laufen automatisch ab - für dauerhafte Freigaben andere Methoden nutzen
🆕 Changelog
Version 2.0 (2024-12)
- ✨ Unterstützung für CrowdSec AllowLists (v1.6.8+)
- ✨ Intelligente Unterscheidung zwischen Ban- und Whitelist-Decisions
- ✨ Korrekte Bouncer-Warnung nur bei aktiven Bans
- 🐛 Behoben: AllowList expiration verwendet jetzt korrekte Duration (72h statt Timestamp)
- 📝 Verbesserte Ausgabe und Zusammenfassungen
Version 1.0 (2024-11)
- 🎉 Erste Version mit paralleler Verarbeitung
- 🎉 VHost-Log-Durchsuchung
- 🎉 Szenario-spezifische Log-Analyse
🤝 Beitragen
Contributions sind willkommen! Bitte:
- Forke das Repository
- Erstelle einen Feature-Branch (
git checkout -b feature/AmazingFeature) - Committe deine Änderungen (
git commit -m 'Add AmazingFeature') - Push zum Branch (
git push origin feature/AmazingFeature) - Öffne einen Pull Request
📜 Lizenz
Dieses Projekt ist Open Source. Details siehe LICENSE-Datei.
🙏 Credits
Entwickelt für effiziente CrowdSec-Analysen in Multi-VHost-Umgebungen.