# 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 ```bash # 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: ```bash 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 ```bash # 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 ```bash crowdsec-ip-analyzer.py --help ``` **Argumente:** - `ip` - Die zu analysierende IP-Adresse (erforderlich) ### Beispiele ```bash # 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: ```python # 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":** 1. **Decisions löschen**: Alle aktiven ban-Decisions werden entfernt 2. **AllowList erstellen**: Falls noch nicht vorhanden, wird die AllowList `temp-whitelist-from-check-if-ip-banned` erstellt 3. **IP hinzufügen**: Die IP wird mit 72h Expiration zur AllowList hinzugefügt 4. **ipset säubern**: Die IP wird aus ipset-Einträgen entfernt (falls vorhanden) 5. **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 allowlist` Befehle - ✅ Automatisches **Ablaufen nach 72h** **Manuelle Verwaltung der AllowList:** ```bash # 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: ```python # 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: ```python # 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: ```python # 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) ```bash # 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: ```bash # 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`: ```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: 1. Forke das Repository 2. Erstelle einen Feature-Branch (`git checkout -b feature/AmazingFeature`) 3. Committe deine Änderungen (`git commit -m 'Add AmazingFeature'`) 4. Push zum Branch (`git push origin feature/AmazingFeature`) 5. Ö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. ## 📚 Weitere Ressourcen - [CrowdSec Dokumentation](https://docs.crowdsec.net/) - [CrowdSec AllowLists Guide](https://docs.crowdsec.net/docs/next/whitelist/create) - [CrowdSec CLI Reference](https://docs.crowdsec.net/docs/next/cscli/)