424 lines
12 KiB
Markdown
424 lines
12 KiB
Markdown
# 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/) |