2025-12-01 21:25:39 +01:00
2025-12-01 21:25:39 +01:00

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":

  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:

# 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:

  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

Description
Überprüft ob eine IP irgendwo gesperrt ist.
Readme 60 KiB
Languages
Python 100%