Initialer Import

This commit is contained in:
2026-03-11 16:49:45 +01:00
parent ab9d9870dd
commit efb11a0bfa
12 changed files with 3442 additions and 8 deletions

2
.gitattributes vendored Normal file
View File

@@ -0,0 +1,2 @@
# Enforce LF line endings for all text files
* text=auto eol=lf

24
.gitignore vendored Normal file
View File

@@ -0,0 +1,24 @@
# Backup-Dateien
*.bak
backups/
# Log-Dateien
*.log
*.log.*
# Lock-File
*.lock
# Temporäre Dateien
*.tmp
*.swp
*.swo
*~
# OS-Dateien
.DS_Store
Thumbs.db
# Editor
.vscode/
.idea/

293
README.md
View File

@@ -1,16 +1,293 @@
# template_repository
# CrowdSec Manager
Automatische Verwaltung einer CrowdSec-Allowlist und interaktive CrowdSec-Administration über ein Menü.
## Übersicht
Der **CrowdSec Manager** ist ein Bash-Script, das:
- Domains und Subdomains automatisch zu IPv4/IPv6-Adressen auflöst
- Die aufgelösten IPs in eine CrowdSec-Allowlist einträgt
- Veraltete Einträge automatisch entfernt wenn sich IPs ändern
- Per Cron regelmäßig ausgeführt werden kann (automatischer Sync)
- Ein **interaktives Menü** für die CrowdSec-Administration bereitstellt
- Benachrichtigungen über Änderungen senden kann (Desktop, Ntfy, **Gotify**, E-Mail)
Wichtig: Link für Lizenz anpassen.
### Features
- **Interaktives Menü** als Standard-Modus (für manuelle Verwaltung)
- **CrowdSec Admin-Funktionen**: Decisions, Alerts, Bouncers, Machines, Metriken, IP-Info
- **Gotify** als zusätzlicher Benachrichtigungskanal
- **`--run`-Flag** für automatischen Cron-Betrieb
- **Eigene cscli-Befehle** direkt aus dem Menü ausführen
## Features
<p align="center">
<img src="https://assets.techniverse.net/f1/git/graphics/gray0-catonline.svg" alt="">
</p>
| Feature | Beschreibung |
|---------|-------------|
| **Interaktives Menü** | Grafische Administration von CrowdSec via Menü |
| **DNS-Auflösung** | Automatische Auflösung von Domains zu IPv4 und IPv6 |
| **CIDR-Support** | Ganze Subnetze können allowgelistet werden |
| **Auto-Cleanup** | Entfernt IPs die nicht mehr zu konfigurierten Domains gehören |
| **Decisions verwalten** | Anzeigen, Suchen, Hinzufügen, Entfernen von Decisions |
| **Alerts verwalten** | Anzeigen, Inspizieren, Löschen von Alerts |
| **IP-Info** | Komplett-Check einer IP (rDNS, Decisions, Alerts, Details) |
| **Flexible CrowdSec-Anbindung** | Unterstützt direkte Installation, Docker, Podman, etc. |
| **Benachrichtigungen** | Desktop, Ntfy, Gotify, E-Mail |
| **Logging** | Konfigurierbares Log-Level mit Log-Rotation |
| **Dry-Run** | Testmodus ohne tatsächliche Änderungen |
| **Lock-File** | Verhindert parallele Ausführung |
| **Backup** | Sichert den Zustand vor Änderungen |
| **Cron-fähig** | Optimiert für automatische Ausführung mit `--run` |
<p align="center">
<img src="https://assets.techniverse.net/f1/logos/small/license.png" alt="License" width="15" height="15"> <a href="./LICENSE">License</a> | <img src="https://assets.techniverse.net/f1/logos/small/matrix2.svg" alt="Matrix" width="15" height="15"> <a href="https://matrix.to/#/#community:techniverse.net">Matrix</a> | <img src="https://assets.techniverse.net/f1/logos/small/mastodon2.svg" alt="Mastodon" width="15" height="15"> <a href="https://social.techniverse.net/@donnerwolke">Mastodon</a>
</p>
## Schnellstart
### 1. Repository klonen
```bash
git clone https://git.techniverse.net/scriptos/crowdsec-manager.git
cd crowdsec-manager
chmod +x crowdsec-manager.sh
```
### 2. Abhängigkeiten installieren
```bash
# Debian / Ubuntu
sudo apt install -y dnsutils curl
# RHEL / CentOS / Fedora
sudo dnf install -y bind-utils curl
```
### 3. Konfiguration anpassen
```bash
nano config/crowdsec-manager.conf
```
**Mindestens anpassen:**
- `CSCLI_CMD` Der Befehl um CrowdSec CLI aufzurufen
- `ALLOWLIST_ENTRIES` Die Domains/IPs für die Allowlist
### 4. Testen & Verwenden
```bash
# Konfiguration prüfen
./crowdsec-manager.sh --test
# Interaktives Menü starten (Standard)
./crowdsec-manager.sh
# Allowlist-Sync (für Cron)
./crowdsec-manager.sh --run
# Testlauf ohne Änderungen
./crowdsec-manager.sh --run --dry-run
```
### 5. Cron einrichten
```bash
crontab -e
```
```cron
*/30 * * * * /opt/crowdsec-manager/crowdsec-manager.sh --run >> /var/log/crowdsec-manager-cron.log 2>&1
```
> **Wichtig:** `--run` muss angegeben werden, da ohne Parameter das interaktive Menü startet.
## Interaktives Menü
```
╔═══════════════════════════════════════════════════════╗
║ CrowdSec Manager v0.1.0 ║
╚═══════════════════════════════════════════════════════╝
── ALLOWLIST MANAGEMENT ──
1) Allowlist synchronisieren 2) Dry-Run
3) Allowlist anzeigen 4) Config testen
5) Flush (alle Einträge entfernen)
── DECISIONS ──
10) Alle anzeigen 11) Suchen 12) Hinzufügen 13) Entfernen
── ALERTS ──
20) Alle anzeigen 21) Inspizieren 22) Löschen
── INFORMATIONEN ──
30) IP-Info (Komplett) 31) Metriken 32) Status
33) Bouncers 34) Machines 35) Parsers
36) Scenarios 37) Collections
── ERWEITERT ──
40) Eigener cscli-Befehl 0) Beenden
```
## Konfiguration
Die gesamte Konfiguration erfolgt über: [`config/crowdsec-manager.conf`](config/crowdsec-manager.conf)
### CrowdSec Basisbefehl
```bash
# Direkt installiert
CSCLI_CMD="cscli"
# Docker
CSCLI_CMD="docker exec crowdsec cscli"
# Docker Compose
CSCLI_CMD="docker compose exec crowdsec cscli"
```
### Domains & IPs
```bash
ALLOWLIST_ENTRIES=(
"example.com" # Domain (wird aufgelöst)
"cdn.example.com"
"203.0.113.50" # Einzelne IP
"10.0.0.0/8" # CIDR-Bereich
"2001:db8::1" # IPv6
)
```
### Benachrichtigungen
```bash
NOTIFY_ENABLED=true
NOTIFY_ON="changes" # always | changes | errors
# Ntfy
NOTIFY_NTFY_ENABLED=true
NOTIFY_NTFY_URL="https://ntfy.sh"
NOTIFY_NTFY_TOPIC="mein-crowdsec"
# Gotify
NOTIFY_GOTIFY_ENABLED=true
NOTIFY_GOTIFY_URL="https://gotify.meinedomain.de"
NOTIFY_GOTIFY_TOKEN="AbCdEf12345"
NOTIFY_GOTIFY_PRIORITY=5
# E-Mail
NOTIFY_EMAIL_ENABLED=true
NOTIFY_EMAIL_TO="admin@example.com"
NOTIFY_EMAIL_SMTP_SERVER="smtp.example.com"
```
## Verwendung (CLI)
```
Verwendung:
crowdsec-manager.sh [OPTIONEN]
Modi:
(ohne Optionen) Startet das interaktive Menü
--run Allowlist synchronisieren (für Cron)
Optionen:
-c, --config FILE Konfigurationsdatei angeben
-d, --dry-run Testlauf ohne Änderungen
-v, --verbose Ausführliche Ausgabe (DEBUG)
-q, --quiet Minimale Ausgabe (nur ERROR)
-l, --list Aktuelle Allowlist anzeigen
-f, --flush Alle verwalteten Einträge entfernen
-t, --test Konfiguration testen
-i, --interactive Interaktives Menü starten
-h, --help Hilfe anzeigen
-V, --version Version anzeigen
```
## Ablaufdiagramm (Allowlist-Sync)
```
┌─────────────────────────┐
│ Script: --run │
└────────────┬────────────┘
┌───────▼────────┐
│ Config laden │
│ Lock erwerben │
│ Health-Check │
└───────┬────────┘
┌───────▼────────┐
│ Aktuelle Liste │
│ abrufen + Backup│
└───────┬────────┘
┌───────▼────────┐
│ DNS-Auflösung │
│ aller Einträge │
└───────┬────────┘
┌───────▼────────┐
│ Vergleich & │
│ Synchronisation │
└───────┬────────┘
┌───────▼────────┐
│ Report & │
│ Notifications │
└───────┬────────┘
┌───────▼────────┐
│ Lock lösen │
│ Aufräumen │
└─────────────────┘
```
## Abhängigkeiten
| Paket | Erforderlich | Zweck |
|-------|:---:|--------|
| `bash` (≥ 4.0) | ✅ | Script-Ausführung |
| `dig` (dnsutils / bind-utils) | ✅ | DNS-Auflösung |
| `curl` | ⚡ | Ntfy-, Gotify- und E-Mail-Benachrichtigungen |
| `python3` | ⚡ | JSON-Escaping für Gotify (Fallback: sed) |
| `notify-send` | ⚡ | Desktop-Benachrichtigungen |
| `mail` | ⚡ | E-Mail-Fallback |
✅ = Erforderlich | ⚡ = Optional (je nach Konfiguration)
## Dateien & Struktur
```
crowdsec-manager/
├── crowdsec-manager.sh # Hauptscript
├── config/
│ └── crowdsec-manager.conf # Konfigurationsdatei
├── examples/
│ └── crontab.example # Crontab-Beispiele
├── docs/
│ ├── DOCUMENTATION.md # Dokumentationsindex
│ ├── CONFIGURATION.md # Konfigurationsreferenz
│ ├── ALLOWLIST.md # Allowlist-Verwaltung & Cron
│ ├── ADMIN.md # Interaktives Menü & Admin
│ ├── NOTIFICATIONS.md # Benachrichtigungssystem
│ └── TROUBLESHOOTING.md # Fehlerbehebung & FAQ
├── README.md # Diese Datei
├── LICENSE # MIT Lizenz
└── .gitignore
```
## Dokumentation
Die detaillierte Dokumentation ist aufgeteilt in:
| Dokument | Beschreibung |
|----------|-------------|
| [docs/CONFIGURATION.md](docs/CONFIGURATION.md) | Alle Konfigurationsoptionen |
| [docs/ALLOWLIST.md](docs/ALLOWLIST.md) | Allowlist-Verwaltung, CLI, Cron |
| [docs/ADMIN.md](docs/ADMIN.md) | Interaktives Menü & Administration |
| [docs/NOTIFICATIONS.md](docs/NOTIFICATIONS.md) | Ntfy, Gotify, E-Mail, Desktop |
| [docs/TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md) | Fehlerbehebung & FAQ |
## Lizenz
MIT License siehe [LICENSE](LICENSE) Datei.
## Beitragen
Pull Requests und Issues sind willkommen! Bitte stelle sicher, dass deine Änderungen die bestehende Funktionalität nicht brechen.

View File

@@ -0,0 +1,183 @@
#!/bin/bash
# ============================================================================
# CrowdSec Manager - Konfigurationsdatei
# ============================================================================
# Diese Datei enthält alle konfigurierbaren Parameter für das Script.
# Passe die Werte an deine Umgebung an.
# ============================================================================
# ----------------------------------------------------------------------------
# CrowdSec Basis-Konfiguration
# ----------------------------------------------------------------------------
# Basisbefehl für CrowdSec CLI (cscli)
# Beispiele:
# Direkt installiert: CSCLI_CMD="cscli"
# Docker: CSCLI_CMD="docker exec crowdsec cscli"
# Docker Compose: CSCLI_CMD="docker compose exec crowdsec cscli"
# Podman: CSCLI_CMD="podman exec crowdsec cscli"
CSCLI_CMD="docker exec crowdsec cscli"
# Name der Allowlist-Decision-Liste in CrowdSec
# Diese Liste wird vom Script angelegt und verwaltet
ALLOWLIST_NAME="crowdsec-manager"
# Beschreibung der Allowlist
ALLOWLIST_DESCRIPTION="Managed by crowdsec-manager script"
# Dauer für die Allowlist-Einträge (wie lange ein Eintrag gültig ist)
# Format: s=Sekunden, m=Minuten, h=Stunden
# Empfehlung: Etwas länger als das Cron-Intervall setzen
ALLOWLIST_DURATION="25h"
# Typ der Allowlist-Einträge
# Mögliche Werte: "allow" (Whitelist)
ALLOWLIST_REASON="allowlist-manager-auto"
# ----------------------------------------------------------------------------
# Domains / DNS / IPs zum Allowlisten
# ----------------------------------------------------------------------------
# Liste der Domains, Subdomains und einzelnen IPs
# Trenne mehrere Einträge mit Leerzeichen
# Unterstützte Formate:
# - Domains: example.com
# - Subdomains: subdomain.example.com
# - IPv4-Adressen: 192.168.1.100
# - IPv6-Adressen: 2001:db8::1
# - CIDR-Notation: 192.168.1.0/24
# - CIDR IPv6: 2001:db8::/32
ALLOWLIST_ENTRIES=(
# === Domains & Subdomains ===
"example.com"
"subdomain.example.com"
# === Einzelne IPs ===
# "192.168.1.100"
# "2001:db8::1"
# === CIDR-Bereiche ===
# "10.0.0.0/8"
# "2001:db8::/32"
)
# ----------------------------------------------------------------------------
# DNS-Auflösung
# ----------------------------------------------------------------------------
# Eigenen DNS-Server verwenden (leer lassen für System-DNS)
# Beispiele: "1.1.1.1", "8.8.8.8", "9.9.9.9"
DNS_SERVER=""
# IPv6-Adressen ebenfalls auflösen? (true/false)
RESOLVE_IPV6=true
# DNS-Auflösungs-Timeout in Sekunden
DNS_TIMEOUT=5
# Anzahl DNS-Auflösungsversuche bei Fehler
DNS_RETRIES=3
# ----------------------------------------------------------------------------
# Logging
# ----------------------------------------------------------------------------
# Log-Level: DEBUG, INFO, WARN, ERROR
LOG_LEVEL="INFO"
# Pfad zur Log-Datei (leer = nur stdout)
LOG_FILE="/var/log/crowdsec-manager.log"
# Maximale Größe der Log-Datei in KB bevor rotiert wird (0 = keine Rotation)
LOG_MAX_SIZE_KB=5120
# Anzahl der aufzubewahrenden rotierten Log-Dateien
LOG_ROTATE_COUNT=3
# ----------------------------------------------------------------------------
# Backup
# ----------------------------------------------------------------------------
# Backup vor Änderungen erstellen? (true/false)
BACKUP_ENABLED=true
# Verzeichnis für Backups
BACKUP_DIR="/var/backup/crowdsec-manager"
# Anzahl aufzubewahrende Backups (ältere werden gelöscht)
BACKUP_RETAIN_COUNT=7
# ----------------------------------------------------------------------------
# Lock-File (verhindert parallele Ausführung)
# ----------------------------------------------------------------------------
# Lock-File aktivieren? (true/false)
LOCK_ENABLED=true
# Pfad zum Lock-File
LOCK_FILE="/tmp/crowdsec-manager.lock"
# Timeout für Lock in Sekunden (0 = sofort abbrechen wenn gesperrt)
LOCK_TIMEOUT=300
# ----------------------------------------------------------------------------
# Benachrichtigungen
# ----------------------------------------------------------------------------
# Benachrichtigungen aktivieren? (true/false)
NOTIFY_ENABLED=false
# Wann benachrichtigen?
# "always" - Immer nach Ausführung
# "changes" - Nur wenn Änderungen vorgenommen wurden
# "errors" - Nur bei Fehlern
NOTIFY_ON="changes"
# --- Notify-Send (Desktop-Benachrichtigungen) ---
NOTIFY_DESKTOP_ENABLED=false
# --- Ntfy (https://ntfy.sh) ---
NOTIFY_NTFY_ENABLED=false
NOTIFY_NTFY_URL="https://ntfy.sh"
NOTIFY_NTFY_TOPIC="crowdsec-manager"
NOTIFY_NTFY_PRIORITY="default"
NOTIFY_NTFY_TOKEN=""
# Tags/Emojis für Ntfy-Nachrichten
NOTIFY_NTFY_TAGS="shield,white_check_mark"
# --- Gotify (https://gotify.net) ---
NOTIFY_GOTIFY_ENABLED=false
# URL deiner Gotify-Instanz (mit Protokoll, ohne trailing slash)
NOTIFY_GOTIFY_URL="https://gotify.example.com"
# App-Token aus Gotify (unter Apps -> Token erstellen)
NOTIFY_GOTIFY_TOKEN=""
# Priorität der Nachricht (1-10, höher = wichtiger)
# 1-3: Niedrig, 4-7: Normal, 8-10: Hoch/Kritisch
NOTIFY_GOTIFY_PRIORITY=5
# --- E-Mail ---
NOTIFY_EMAIL_ENABLED=false
NOTIFY_EMAIL_TO="admin@example.com"
NOTIFY_EMAIL_FROM="crowdsec@example.com"
NOTIFY_EMAIL_SUBJECT="CrowdSec Manager Report"
# SMTP-Server Konfiguration
NOTIFY_EMAIL_SMTP_SERVER="smtp.example.com"
NOTIFY_EMAIL_SMTP_PORT="587"
NOTIFY_EMAIL_SMTP_USER=""
NOTIFY_EMAIL_SMTP_PASS=""
NOTIFY_EMAIL_SMTP_TLS=true
# ----------------------------------------------------------------------------
# Erweiterte Optionen
# ----------------------------------------------------------------------------
# Automatische Bereinigung: Entfernt IPs aus der Allowlist, die nicht mehr
# zu den konfigurierten Domains/IPs gehören (true/false)
AUTO_CLEANUP=true
# Health-Check vor Ausführung (true/false)
HEALTH_CHECK=true
# Dry-Run Modus als Standard (kann mit --dry-run überschrieben werden)
DRY_RUN=false

1716
crowdsec-manager.sh Normal file

File diff suppressed because it is too large Load Diff

198
docs/ADMIN.md Normal file
View File

@@ -0,0 +1,198 @@
# Interaktive Administration
Dokumentation der interaktiven CrowdSec-Administrationsfunktionen im CrowdSec Manager v0.1.0.
---
## Übersicht
Ab Version 0.1.0 startet das Script standardmäßig ein **interaktives Menü**, über das CrowdSec-Funktionen direkt verwaltet werden können ohne manuell `cscli`-Befehle absetzen zu müssen.
```bash
# Interaktives Menü starten (Standard)
./crowdsec-manager.sh
# Oder explizit:
./crowdsec-manager.sh --interactive
```
---
## Menü-Struktur
```
╔═══════════════════════════════════════════════════════╗
║ CrowdSec Manager v0.1.0 ║
╚═══════════════════════════════════════════════════════╝
── ALLOWLIST MANAGEMENT ──────────────────────────────
1) Allowlist synchronisieren (DNS auflösen & updaten)
2) Allowlist synchronisieren (Dry-Run)
3) Aktuelle Allowlist anzeigen
4) Konfiguration testen
5) Alle verwalteten Einträge entfernen (Flush)
── DECISIONS ─────────────────────────────────────────
10) Alle Decisions anzeigen
11) Decision suchen (nach IP)
12) Decision manuell hinzufügen
13) Decision entfernen
── ALERTS ────────────────────────────────────────────
20) Alle Alerts anzeigen
21) Alert inspizieren (Detail-Ansicht)
22) Alerts löschen
── INFORMATIONEN ─────────────────────────────────────
30) IP-Informationen (Komplett-Check)
31) CrowdSec Metriken
32) CrowdSec Status & Version
33) Bouncers anzeigen
34) Machines anzeigen
35) Parsers anzeigen
36) Scenarios anzeigen
37) Collections anzeigen
── ERWEITERT ─────────────────────────────────────────
40) Eigenen cscli-Befehl ausführen
0) Beenden
```
---
## Funktionen im Detail
### Allowlist Management (1-5)
| Nr. | Funktion | Beschreibung |
|-----|----------|-------------|
| 1 | Sync | Führt die komplette Allowlist-Synchronisation aus (DNS auflösen, Vergleich, Update) |
| 2 | Dry-Run | Wie 1, aber ohne tatsächliche Änderungen an CrowdSec |
| 3 | Anzeigen | Zeigt alle aktuellen Allowlist-Einträge |
| 4 | Test | Prüft Config, DNS-Auflösung und CrowdSec-Verbindung |
| 5 | Flush | Entfernt alle vom Script verwalteten Einträge (mit Bestätigung) |
### Decisions (10-13)
#### 10) Alle Decisions anzeigen
Zeigt alle aktiven CrowdSec Decisions an (Ban, Allow, Captcha, Throttle).
Entspricht: `cscli decisions list`
#### 11) Decision suchen
Sucht alle Decisions für eine bestimmte IP-Adresse.
Entspricht: `cscli decisions list -i <IP>`
#### 12) Decision manuell hinzufügen
Interaktiver Assistent zum Hinzufügen einer Decision:
1. **IP/CIDR eingeben** Die zu behandelnde IP-Adresse oder CIDR-Range
2. **Typ wählen:**
- `ban` IP sperren
- `allow` IP erlauben (Allowlist)
- `captcha` Captcha anzeigen
- `throttle` Traffic drosseln
3. **Dauer** z.B. `10m`, `1h`, `24h`, `7d` (Standard: 4h)
4. **Grund** Optionaler Kommentar
5. **Bestätigung** Zusammenfassung mit Ja/Nein-Abfrage
#### 13) Decision entfernen
Entfernt eine Decision entweder nach:
- **IP-Adresse** Alle Decisions für diese IP
- **Decision-ID** Spezifische Decision
---
### Alerts (20-22)
#### 20) Alle Alerts anzeigen
Zeigt alle aktuellen Alerts an.
Entspricht: `cscli alerts list`
#### 21) Alert inspizieren
Zeigt Detail-Informationen zu einem spezifischen Alert (nach Alert-ID).
Entspricht: `cscli alerts inspect <ID> -d`
#### 22) Alerts löschen
Löscht Alerts nach:
- **Einzelne Alert-ID** Spezifischen Alert löschen
- **IP-Adresse** Alle Alerts für eine IP
- **Zeitraum** Alle Alerts älter als z.B. `24h`, `7d`
Jede Löschung erfordert eine Bestätigung.
---
### Informationen (30-37)
#### 30) IP-Informationen (Komplett-Check)
Sammelt umfassende Informationen zu einer IP-Adresse in 4 Schritten:
```
[1/4] Reverse-DNS: PTR-Record Lookup
[2/4] Aktive Decisions: Alle Decisions für diese IP
[3/4] Alerts: Alle Alerts für diese IP
[4/4] Alert-Details: Detail-Inspektion der letzten 5 Alerts
```
Nützlich für schnelle Untersuchung verdächtiger IPs.
#### 31) CrowdSec Metriken
Zeigt aktuelle CrowdSec-Metriken (Acquisition, Parser, Scenarios, etc.).
Entspricht: `cscli metrics`
#### 32) CrowdSec Status & Version
Zeigt die CrowdSec-Version und den Hub-Status.
#### 33-37) Hub-Komponenten
| Nr. | Komponente | cscli-Befehl |
|-----|-----------|-------------|
| 33 | Bouncers | `cscli bouncers list` |
| 34 | Machines | `cscli machines list` |
| 35 | Parsers | `cscli parsers list` |
| 36 | Scenarios | `cscli scenarios list` |
| 37 | Collections | `cscli collections list` |
---
### Erweitert (40)
#### 40) Eigener cscli-Befehl
Ermöglicht die Ausführung beliebiger `cscli`-Befehle über den konfigurierten `CSCLI_CMD`.
```
Basis: docker exec crowdsec cscli
Gib nur die Argumente nach 'cscli' ein.
Beispiel: decisions list -o json
cscli> decisions list -o json
```
Der eingegebene Befehl wird an den konfigurierten Basisbefehl angehängt und ausgeführt.
---
## Tipps
- Das Menü merkt sich den Kontext nicht zwischen Aufrufen. Jede Funktion ist eigenständig.
- Bei allen destruktiven Aktionen (Flush, Decisions/Alerts löschen) wird eine Bestätigung abgefragt.
- Die Navigation erfolgt rein über Nummern-Eingabe.
- Nach jeder Funktion wird auf Enter gewartet, bevor das Menü neu angezeigt wird.
- Mit `0`, `q` oder `exit` wird das Programm beendet.

202
docs/ALLOWLIST.md Normal file
View File

@@ -0,0 +1,202 @@
# Allowlist Management
Dokumentation der automatischen Allowlist-Verwaltung im CrowdSec Manager v0.1.0.
---
## Funktionsweise
Das Script arbeitet nach dem **Desired-State-Prinzip**: Du definierst WAS allowgelistet sein soll (Domains/IPs), und das Script sorgt dafür, dass der IST-Zustand in CrowdSec dem SOLL-Zustand entspricht.
### Ablauf einer Synchronisation
```
1. Vorbereitung
├── Abhängigkeiten prüfen (dig, curl)
├── Lock-File erwerben
├── Temporäre Dateien erstellen
└── CrowdSec Health-Check
2. Datenerfassung
├── Aktuelle CrowdSec-Allowlist abrufen → current_ips.txt
├── Backup der aktuellen Liste erstellen
└── DNS-Auflösung aller Einträge → new_ips.txt
3. Synchronisation
├── Vergleich: current_ips.txt vs. new_ips.txt
├── Neue IPs hinzufügen (in new, nicht in current)
├── Veraltete IPs entfernen (in current, nicht in new)
└── Statistiken aktualisieren
4. Abschluss
├── Zusammenfassung ausgeben
├── Benachrichtigungen senden
├── Lock-File freigeben
└── Temporäre Dateien aufräumen
```
---
## Kommandozeilen-Optionen
### Startmodi (v0.1.0)
| Aufruf | Beschreibung |
|--------|-------------|
| `./script.sh` | Startet das **interaktive Menü** (Standard) |
| `./script.sh --run` | Führt Allowlist-Sync aus (für **Cron**) |
| `./script.sh --interactive` | Startet das interaktive Menü (explizit) |
> **Wichtig für Cron:** Ab v0.1.0 muss `--run` angegeben werden, da ohne Parameter das interaktive Menü startet.
### Alle Optionen
| Option | Kurz | Beschreibung |
|--------|------|-------------|
| `--run` | | Allowlist-Sync ausführen (nicht-interaktiv, für Cron) |
| `--interactive` | `-i` | Interaktives Menü starten |
| `--config FILE` | `-c` | Eigene Konfigurationsdatei laden |
| `--dry-run` | `-d` | Simuliert alle Aktionen ohne CrowdSec zu ändern |
| `--verbose` | `-v` | Setzt Log-Level auf DEBUG |
| `--quiet` | `-q` | Setzt Log-Level auf ERROR |
| `--list` | `-l` | Zeigt aktuelle CrowdSec-Allowlist an |
| `--flush` | `-f` | Entfernt ALLE vom Script verwalteten Einträge |
| `--test` | `-t` | Testet Config, DNS und CrowdSec-Verbindung |
| `--help` | `-h` | Zeigt Hilfe an |
| `--version` | `-V` | Zeigt Version an |
---
## Dry-Run Modus
Im Dry-Run Modus werden alle Schritte normal durchgeführt (DNS-Auflösung, Vergleich), aber die CrowdSec-Befehle werden **nicht** ausgeführt:
```bash
./crowdsec-manager.sh --run --dry-run
```
Ausgabe:
```
[INFO] [DRY-RUN] Würde hinzufügen: 203.0.113.50
[INFO] [DRY-RUN] Würde entfernen: 198.51.100.20
```
Auch im interaktiven Menü (Punkt 2) kann ein Dry-Run gestartet werden.
---
## Test-Modus
Prüft die gesamte Konfiguration ohne etwas zu ändern:
```bash
./crowdsec-manager.sh --test
```
Ausgabe:
```
Konfigurationstest:
[OK] Konfigurationsdatei geladen
CrowdSec-Erreichbarkeit... [OK]
DNS-Auflösung... [OK] dig gefunden
Konfigurierte Einträge (3):
[Domain] example.com -> 93.184.216.34, 2606:2800:220:1:...
[Domain] cdn.example.com -> 104.16.132.229
[IP/CIDR] 192.168.1.0/24
Benachrichtigungen:
Aktiviert: true
Desktop: false
Ntfy: true
Gotify: false
E-Mail: false
```
---
## Flush-Modus
Entfernt **alle** vom Script verwalteten Einträge aus CrowdSec (identifiziert über `ALLOWLIST_REASON`):
```bash
./crowdsec-manager.sh --flush
```
> **Achtung:** Manuell mit `cscli decisions add` erstellte Einträge werden NICHT entfernt.
---
## Cron-Integration
### Empfohlene Intervalle
| Anwendungsfall | Intervall | Cron-Ausdruck |
|:---:|:---:|:---:|
| Dynamische DNS (DynDNS) | 15 Minuten | `*/15 * * * *` |
| Cloud-Dienste / CDN | 30 Minuten | `*/30 * * * *` |
| Statische Infrastruktur | Stündlich | `0 * * * *` |
| Feste IPs | Täglich | `0 3 * * *` |
### Einrichtung
```bash
crontab -e
```
Empfohlener Eintrag:
```cron
# CrowdSec Manager - alle 30 Minuten
*/30 * * * * /opt/crowdsec-manager/crowdsec-manager.sh --run >> /var/log/crowdsec-manager-cron.log 2>&1
```
### ALLOWLIST_DURATION vs. Cron-Intervall
Die `ALLOWLIST_DURATION` muss **immer größer** als das Cron-Intervall sein:
```
Cron: */30 * * * * → ALLOWLIST_DURATION="1h" ✅
Cron: 0 * * * * → ALLOWLIST_DURATION="2h" ✅
Cron: 0 * * * * → ALLOWLIST_DURATION="30m" ❌ Zu kurz!
```
### Cron-spezifisches Verhalten
Das Script erkennt automatisch ob es im Terminal oder per Cron läuft:
- **Terminal:** Farbige Ausgabe
- **Cron:** Plain-Text Ausgabe (keine Escape-Codes)
---
## Exit-Codes
| Exit-Code | Bedeutung |
|:---:|---------|
| `0` | Erfolgreich |
| `1` | Kritischer Fehler (Config fehlt, CrowdSec nicht erreichbar) |
| `2` | Teilweise erfolgreich (mit nicht-kritischen Fehlern) |
---
## Mehrere Konfigurationen
Du kannst mehrere Konfigurationsdateien für verschiedene Allowlists verwenden:
```bash
# Webserver-Allowlist
./crowdsec-manager.sh --run --config config/webserver.conf
# Monitoring-Allowlist
./crowdsec-manager.sh --run --config config/monitoring.conf
```
Jede Konfiguration sollte einen eigenen `ALLOWLIST_REASON` verwenden:
```bash
# webserver.conf
ALLOWLIST_REASON="allowlist-webserver"
# monitoring.conf
ALLOWLIST_REASON="allowlist-monitoring"
```

278
docs/CONFIGURATION.md Normal file
View File

@@ -0,0 +1,278 @@
# Konfigurationsreferenz
Dokumentation aller Konfigurationsoptionen für den CrowdSec Manager v0.1.0.
> **Datei:** `config/crowdsec-manager.conf`
> Die Konfigurationsdatei ist ein Bash-Script und wird per `source` eingebunden.
---
## Inhaltsverzeichnis
1. [CrowdSec Basis-Konfiguration](#crowdsec-basis-konfiguration)
2. [Allowlist-Einträge](#allowlist-einträge)
3. [DNS-Konfiguration](#dns-konfiguration)
4. [Logging](#logging)
5. [Backup](#backup)
6. [Lock-File](#lock-file)
7. [Auto-Cleanup](#auto-cleanup)
---
## CrowdSec Basis-Konfiguration
### `CSCLI_CMD`
Der Befehl zum Aufrufen von CrowdSec CLI. Ermöglicht die Unterstützung verschiedener Installationsarten:
```bash
# Native Installation
CSCLI_CMD="cscli"
# Docker (Container-Name: crowdsec)
CSCLI_CMD="docker exec crowdsec cscli"
# Docker Compose (Service-Name: crowdsec)
CSCLI_CMD="docker compose exec crowdsec cscli"
# Docker Compose mit eigenem Compose-File
CSCLI_CMD="docker compose -f /opt/crowdsec/docker-compose.yml exec crowdsec cscli"
# Podman
CSCLI_CMD="podman exec crowdsec cscli"
# SSH auf Remote-Server
CSCLI_CMD="ssh user@server cscli"
```
**Tipp:** Teste den Befehl manuell, bevor du ihn in die Config einträgst:
```bash
docker exec crowdsec cscli version
```
### `ALLOWLIST_NAME`
Name der verwalteten Allowlist. Wird zur Identifizierung in CrowdSec verwendet.
```bash
ALLOWLIST_NAME="crowdsec-manager"
```
### `ALLOWLIST_DURATION`
Gültigkeitsdauer eines Allowlist-Eintrags. Sollte **etwas länger als das Cron-Intervall** sein.
| Cron-Intervall | Empfohlene Duration |
|:---:|:---:|
| Alle 15 Minuten | `30m` |
| Alle 30 Minuten | `1h` |
| Stündlich | `2h` |
| Alle 6 Stunden | `12h` |
| Täglich | `25h` |
```bash
ALLOWLIST_DURATION="25h"
```
### `ALLOWLIST_REASON`
Der `origin`-Tag für die verwalteten Decisions. Damit unterscheidet das Script seine eigenen Einträge von manuell erstellten.
```bash
ALLOWLIST_REASON="allowlist-manager-auto"
```
> **Wichtig:** Ändere diesen Wert NICHT nach der ersten Ausführung, da sonst bestehende Einträge nicht mehr zugeordnet werden können.
### `HEALTH_CHECK`
Ob vor dem Sync ein CrowdSec-Health-Check durchgeführt werden soll.
```bash
HEALTH_CHECK=true
```
### `DRY_RUN`
Global aktivierbarer Dry-Run Modus. Kann auch per CLI mit `--dry-run` aktiviert werden.
```bash
DRY_RUN=false
```
---
## Allowlist-Einträge
### `ALLOWLIST_ENTRIES`
Bash-Array mit allen zu verwaltenden Einträgen:
```bash
ALLOWLIST_ENTRIES=(
# === Webserver & CDN ===
"meinedomain.de"
"www.meinedomain.de"
"cdn.meinedomain.de"
# === Mail-Server ===
"mail.meinedomain.de"
# === Monitoring ===
"monitoring.example.com"
# === Feste IPs ===
"203.0.113.10"
"203.0.113.20"
# === Büro-Netzwerk (CIDR) ===
"192.168.1.0/24"
# === IPv6 ===
"2001:db8::1"
"2001:db8:1::/48"
)
```
**Regeln für Einträge:**
- Ein Eintrag pro Zeile (in Anführungszeichen)
- Kommentare mit `#` sind direkt in der Zeile möglich
- Leere Zeilen werden ignoriert
- Domains werden automatisch per DNS aufgelöst
- IPs und CIDRs werden direkt eingetragen
- IPv4 und IPv6 werden unterstützt
**Erkennung von Eintragstypen:**
| Eintragstyp | Beispiel | Aktion |
|-------------|----------|--------|
| IPv4 | `192.168.1.1` | Direkt eintragen |
| IPv6 | `2001:db8::1` | Direkt eintragen |
| IPv4-CIDR | `10.0.0.0/8` | Als `range` eintragen |
| IPv6-CIDR | `2001:db8::/32` | Als `range` eintragen |
| Domain | `example.com` | DNS auflösen → IPs eintragen |
---
## DNS-Konfiguration
### `DNS_SERVER`
Eigenen DNS-Server für die Auflösung verwenden. Leer lassen für den System-DNS (aus `/etc/resolv.conf`).
```bash
# System-DNS (Standard)
DNS_SERVER=""
# Cloudflare
DNS_SERVER="1.1.1.1"
# Google
DNS_SERVER="8.8.8.8"
# Quad9
DNS_SERVER="9.9.9.9"
# Eigener DNS
DNS_SERVER="10.0.0.53"
```
### `RESOLVE_IPV6`
Ob auch AAAA-Records (IPv6) aufgelöst werden sollen:
```bash
RESOLVE_IPV6=true # IPv4 + IPv6
RESOLVE_IPV6=false # Nur IPv4
```
### `DNS_TIMEOUT` und `DNS_RETRIES`
```bash
DNS_TIMEOUT=5 # Timeout in Sekunden pro DNS-Anfrage
DNS_RETRIES=3 # Wiederholungsversuche bei Fehler
```
---
## Logging
### `LOG_LEVEL`
Steuert die Ausführlichkeit der Ausgabe:
| Level | Beschreibung |
|-------|-------------|
| `DEBUG` | Alles loggen (jede DNS-Anfrage, jeder Vergleich) |
| `INFO` | Standard: Wichtige Schritte und Ergebnisse |
| `WARN` | Nur Warnungen und Fehler |
| `ERROR` | Nur Fehler |
```bash
LOG_LEVEL="INFO"
```
**Tipp:** Verwende `--verbose` beim manuellen Aufruf und `--quiet` für Cron.
### `LOG_FILE`
Pfad zur Log-Datei. Leer lassen wenn nur auf stdout ausgegeben werden soll.
```bash
LOG_FILE="/var/log/crowdsec-manager.log"
```
### Log-Rotation
```bash
LOG_MAX_SIZE_KB=5120 # Rotation bei 5 MB
LOG_ROTATE_COUNT=3 # 3 alte Dateien aufbewahren
```
Rotierte Dateien:
```
crowdsec-manager.log ← Aktuell
crowdsec-manager.log.0 ← Vorherige
crowdsec-manager.log.1
crowdsec-manager.log.2 ← Älteste
```
---
## Backup
```bash
BACKUP_ENABLED=true
BACKUP_DIR="/var/backup/crowdsec-manager"
BACKUP_RETAIN_COUNT=7 # 7 Backups aufbewahren
```
Backup-Dateien werden im Format `allowlist_YYYYMMDD_HHMMSS.bak` gespeichert. Ältere Backups werden automatisch gelöscht.
---
## Lock-File
Das Lock-File verhindert parallele Ausführung (z.B. wenn ein Cron-Lauf länger dauert als das Intervall).
```bash
LOCK_ENABLED=true
LOCK_FILE="/tmp/crowdsec-manager.lock"
LOCK_TIMEOUT=300 # 5 Minuten warten, dann abbrechen
```
**Verwaiste Lock-Files:** Das Script erkennt automatisch, ob der im Lock-File referenzierte Prozess noch läuft. Wenn nicht, wird das Lock-File entfernt.
---
## Auto-Cleanup
```bash
AUTO_CLEANUP=true
```
Wenn aktiviert, entfernt das Script IPs aus der CrowdSec-Allowlist, die:
- In der aktuellen Allowlist vorhanden sind (mit dem Origin `ALLOWLIST_REASON`)
- NICHT mehr in der aufgelösten IP-Liste enthalten sind
Wenn also eine Domain ihre IP ändert, wird die alte IP automatisch aus der Allowlist entfernt.

182
docs/DOCUMENTATION.md Normal file
View File

@@ -0,0 +1,182 @@
# CrowdSec Manager Dokumentation
## Version 0.1.0
Umfassende Dokumentation für den CrowdSec Manager.
---
## Dokumentationsübersicht
| Dokument | Beschreibung |
|----------|-------------|
| [CONFIGURATION.md](CONFIGURATION.md) | Alle Konfigurationsoptionen im Detail |
| [ALLOWLIST.md](ALLOWLIST.md) | Allowlist-Verwaltung, CLI-Optionen, Cron-Integration |
| [ADMIN.md](ADMIN.md) | Interaktives Menü & CrowdSec-Administration |
| [NOTIFICATIONS.md](NOTIFICATIONS.md) | Benachrichtigungen (Ntfy, Gotify, E-Mail, Desktop) |
| [TROUBLESHOOTING.md](TROUBLESHOOTING.md) | Fehlerbehebung & FAQ |
---
## Schnellstart
### 1. Installation
```bash
cd /opt
git clone https://github.com/dein-user/crowdsec-manager.git
cd crowdsec-manager
chmod +x crowdsec-manager.sh
```
### 2. Abhängigkeiten
```bash
# Debian / Ubuntu
sudo apt update && sudo apt install -y dnsutils curl
# RHEL / CentOS / Fedora
sudo dnf install -y bind-utils curl
# Alpine
apk add --no-cache bind-tools curl
```
### 3. Konfiguration
```bash
nano config/crowdsec-manager.conf
```
Mindestens setzen:
- `CSCLI_CMD` CrowdSec CLI Befehl
- `ALLOWLIST_ENTRIES` Domains/IPs für die Allowlist
### 4. Test
```bash
./crowdsec-manager.sh --test
```
### 5. Verwendung
```bash
# Interaktives Menü (Standard)
./crowdsec-manager.sh
# Allowlist-Sync (für Cron)
./crowdsec-manager.sh --run
```
### 6. Cron einrichten
```bash
crontab -e
```
```cron
*/30 * * * * /opt/crowdsec-manager/crowdsec-manager.sh --run >> /var/log/crowdsec-manager-cron.log 2>&1
```
---
## Architektur
### Dateien
| Datei | Aufgabe |
|-------|---------|
| `crowdsec-manager.sh` | Hauptscript (Allowlist-Sync + Interaktives Admin-Menü) |
| `config/crowdsec-manager.conf` | Zentrale Konfigurationsdatei |
| `examples/crontab.example` | Vorlagen für Cron-Einträge |
| `docs/` | Dokumentation (aufgeteilt nach Themen) |
### Voraussetzungen
- **Bash 4.0+** (für assoziative Arrays)
- **dig** (DNS-Auflösung) Teil von `dnsutils` / `bind-utils`
- **CrowdSec** mit CLI-Zugriff
- Optional: **curl** (für Ntfy/Gotify/E-Mail-Benachrichtigungen)
- Optional: **python3** (für JSON-Escaping bei Gotify)
### Sicherheitsaspekte
- **Lock-File** verhindert Race Conditions bei paralleler Ausführung
- **Temporäre Dateien** werden nach Ausführung automatisch gelöscht (auch bei Abbruch)
- **Keine sensiblen Daten** in der Log-Ausgabe
- Config-Datei sollte nur vom Script-Benutzer lesbar sein: `chmod 600 config/crowdsec-manager.conf`
- Für DNS-Spoofing Schutz: DNSSEC-validierende DNS-Server verwenden
---
## Logging & Monitoring
### Log-Datei analysieren
```bash
# Letzte Ausführung anzeigen
grep "$(date '+%Y-%m-%d')" /var/log/crowdsec-manager.log
# Nur Fehler
grep "\[ERROR\]" /var/log/crowdsec-manager.log
# Nur Änderungen
grep -E "Hinzugefügt|Entfernt" /var/log/crowdsec-manager.log
```
### Exit-Codes für Monitoring
| Exit-Code | Bedeutung |
|:---:|---------|
| `0` | Erfolgreich |
| `1` | Kritischer Fehler |
| `2` | Teilweise erfolgreich (mit Fehlern) |
---
## Integration
### Ansible
```yaml
- name: Deploy CrowdSec Manager
hosts: crowdsec_servers
tasks:
- name: Clone repository
git:
repo: https://github.com/user/crowdsec-manager.git
dest: /opt/crowdsec-manager
- name: Deploy config
template:
src: crowdsec-manager.conf.j2
dest: /opt/crowdsec-manager/config/crowdsec-manager.conf
mode: '0600'
- name: Setup cron
cron:
name: "CrowdSec Manager"
minute: "*/30"
job: "/opt/crowdsec-manager/crowdsec-manager.sh --run >> /var/log/crowdsec-manager-cron.log 2>&1"
```
### Docker Compose Sidecar
```yaml
services:
crowdsec:
image: crowdsecurity/crowdsec
container_name: crowdsec
allowlist-manager:
image: alpine
volumes:
- ./crowdsec-manager:/app
- /var/run/docker.sock:/var/run/docker.sock
command: >
sh -c "apk add --no-cache bash bind-tools curl docker-cli &&
while true; do
/app/crowdsec-manager.sh --run;
sleep 1800;
done"
```

205
docs/NOTIFICATIONS.md Normal file
View File

@@ -0,0 +1,205 @@
# Benachrichtigungen
Dokumentation des Benachrichtigungssystems im CrowdSec Manager v0.1.0.
---
## Übersicht
Das Benachrichtigungssystem ist modular aufgebaut. Vier Kanäle können gleichzeitig aktiv sein:
```
┌── Desktop (notify-send)
├── Ntfy (HTTP POST)
should_notify? ─────┤
├── Gotify (HTTP POST / JSON)
└── E-Mail (SMTP via curl / mail)
```
---
## Allgemeine Konfiguration
### Benachrichtigungen aktivieren
```bash
NOTIFY_ENABLED=true
```
### Benachrichtigungs-Bedingungen
```bash
NOTIFY_ON="changes"
```
| Wert | Bedingung |
|------|-----------|
| `always` | Nach jeder Ausführung |
| `changes` | Wenn IPs hinzugefügt, entfernt oder Fehler aufgetreten sind |
| `errors` | Nur bei Fehlern |
### Benachrichtigungs-Inhalt
Jede Benachrichtigung enthält:
```
=== CrowdSec Manager Report ===
Status: OK
Zeitpunkt: 2026-03-11 14:30:00
---
Domains aufgelöst: 5
IPs gesamt: 12
Hinzugefügt: 3
Entfernt: 1
Unverändert: 8
Fehler: 0
```
Bei Fehlern werden zusätzliche Details angehängt:
```
Details:
WARN: Keine Auflösung für broken-domain.com
ERROR: Konnte 203.0.113.50 nicht hinzufügen: ...
```
---
## Desktop-Benachrichtigung (notify-send)
Verwendet `notify-send` für Desktop-Notifications auf Linux.
```bash
NOTIFY_DESKTOP_ENABLED=true
```
**Voraussetzungen:**
- `notify-send` muss installiert sein (Teil von `libnotify-bin` auf Debian/Ubuntu)
- Desktop-Session muss aktiv sein
**Verhalten:**
- Bei Fehlern: Urgency wird auf `critical` gesetzt
- Ansonsten: `normal`
---
## Ntfy
[Ntfy](https://ntfy.sh) ist ein Open-Source Benachrichtigungsdienst. Du kannst die öffentliche Instanz oder eine eigene nutzen.
### Konfiguration
```bash
NOTIFY_NTFY_ENABLED=true
NOTIFY_NTFY_URL="https://ntfy.sh" # oder eigene Instanz
NOTIFY_NTFY_TOPIC="mein-crowdsec" # Dein Topic
NOTIFY_NTFY_PRIORITY="default" # low, default, high, urgent
NOTIFY_NTFY_TOKEN="tk_xxxxxxxx" # Access Token (optional)
NOTIFY_NTFY_TAGS="shield,white_check_mark" # Emoji-Tags
```
### Prioritäten
- Bei Fehlern wird automatisch `high` verwendet
- Ansonsten der konfigurierte Wert
### Tags
- Bei Fehlern werden automatisch `warning,shield` verwendet
- Ansonsten der konfigurierte Wert
### Voraussetzungen
- `curl` muss installiert sein
- Ntfy-Server muss erreichbar sein
### Ntfy-App
Du kannst die [Ntfy-App](https://ntfy.sh) auf Android/iOS installieren und das Topic abonnieren, um Push-Benachrichtigungen zu erhalten.
---
## Gotify
[Gotify](https://gotify.net) ist ein Self-Hosted Push-Benachrichtigungsdienst.
### Konfiguration
```bash
NOTIFY_GOTIFY_ENABLED=true
NOTIFY_GOTIFY_URL="https://gotify.meinedomain.de" # Gotify-Server URL
NOTIFY_GOTIFY_TOKEN="AbCdEf12345" # App-Token
NOTIFY_GOTIFY_PRIORITY=5 # Priorität (0-10)
```
### Einrichtung in Gotify
1. Melde dich in deinem Gotify-Webinterface an
2. Erstelle eine neue **Application** (z.B. "CrowdSec Manager")
3. Kopiere den generierten **Token**
4. Trage URL und Token in die Config ein
### Prioritäten
| Bereich | Bedeutung |
|---------|-----------|
| 0 | Minimale Priorität |
| 1-3 | Niedrig |
| 4-7 | Normal |
| 8-10 | Hoch |
- Konfigurierte Priorität wird als Standard verwendet
- Bei Fehlern wird automatisch Priorität `8` (hoch) gesetzt
### Voraussetzungen
- `curl` muss installiert sein
- Gotify-Server muss erreichbar sein
- Für JSON-Escaping wird `python3` bevorzugt (Fallback: `sed`)
---
## E-Mail
E-Mails werden bevorzugt über SMTP mit `curl` gesendet. Fallback ist der `mail`-Befehl.
### Konfiguration
```bash
NOTIFY_EMAIL_ENABLED=true
NOTIFY_EMAIL_TO="admin@example.com"
NOTIFY_EMAIL_FROM="crowdsec@meinserver.de"
NOTIFY_EMAIL_SUBJECT="CrowdSec Manager Report"
NOTIFY_EMAIL_SMTP_SERVER="smtp.example.com"
NOTIFY_EMAIL_SMTP_PORT="587" # 587 für STARTTLS, 465 für SSL
NOTIFY_EMAIL_SMTP_USER="mailuser"
NOTIFY_EMAIL_SMTP_PASS="mailpass"
NOTIFY_EMAIL_SMTP_TLS=true
```
### SMTP-Ports
| Port | Protokoll | `SMTP_TLS` |
|------|-----------|-----------|
| 587 | STARTTLS | `true` (verwendet `smtps://`) |
| 465 | Implicit TLS/SSL | `true` |
| 25 | Unverschlüsselt | `false` |
### Fallback
Wenn `curl` nicht verfügbar ist, wird versucht den `mail`-Befehl zu verwenden. Dieser muss auf dem System konfiguriert sein (z.B. mit Postfix/Sendmail).
### Voraussetzungen
- `curl` (bevorzugt) oder `mail`
- SMTP-Server muss erreichbar sein
---
## Sicherheitshinweise
- **Tokens und Passwörter** werden in der Konfigurationsdatei gespeichert. Stelle sicher, dass die Datei nur von berechtigten Benutzern lesbar ist:
```bash
chmod 600 config/crowdsec-manager.conf
```
- Keine sensiblen Daten (Passwörter, Tokens) werden in der Log-Ausgabe angezeigt
- Verwende eigene/selbst gehostete Instanzen (Ntfy, Gotify) für erhöhte Sicherheit

135
docs/TROUBLESHOOTING.md Normal file
View File

@@ -0,0 +1,135 @@
# Troubleshooting & FAQ
Hilfe bei häufigen Problemen und Antworten auf oft gestellte Fragen.
---
## Häufige Probleme
### "dig: command not found"
```bash
# Debian/Ubuntu
sudo apt install dnsutils
# RHEL/CentOS/Fedora
sudo dnf install bind-utils
# Alpine
apk add --no-cache bind-tools
# Arch Linux
sudo pacman -S bind
```
### "CrowdSec ist nicht erreichbar"
1. Prüfe ob CrowdSec läuft:
```bash
docker ps | grep crowdsec
# oder
systemctl status crowdsec
```
2. Teste den Befehl manuell:
```bash
docker exec crowdsec cscli version
```
3. Prüfe Docker-Berechtigungen:
```bash
groups $(whoami) | grep docker
```
### "Lock-File existiert bereits"
1. Prüfe ob noch ein Prozess läuft:
```bash
cat /tmp/crowdsec-manager.lock
ps aux | grep crowdsec-manager
```
2. Wenn kein Prozess läuft, Lock manuell entfernen:
```bash
rm /tmp/crowdsec-manager.lock
```
### Domain wird nicht aufgelöst
1. Manuell testen:
```bash
dig +short A example.com
dig +short @8.8.8.8 A example.com
```
2. DNS-Server in der Config setzen:
```bash
DNS_SERVER="8.8.8.8"
```
3. Timeout erhöhen:
```bash
DNS_TIMEOUT=10
DNS_RETRIES=5
```
### Berechtigungs-Fehler
```bash
# Script ausführbar machen
chmod +x crowdsec-manager.sh
# Log-Datei
sudo touch /var/log/crowdsec-manager.log
sudo chown $(whoami) /var/log/crowdsec-manager.log
# Backup-Verzeichnis
sudo mkdir -p /var/backup/crowdsec-manager
sudo chown $(whoami) /var/backup/crowdsec-manager
```
### Interaktives Menü startet statt Cron-Sync
Ab v0.1.0 startet das Script standardmäßig das interaktive Menü. Für den Cron-Betrieb **muss** `--run` angegeben werden:
```bash
# Falsch (startet interaktives Menü):
*/30 * * * * /opt/.../crowdsec-manager.sh
# Richtig:
*/30 * * * * /opt/.../crowdsec-manager.sh --run
```
---
## FAQ
**F: Werden manuell erstellte CrowdSec-Decisions beeinflusst?**
A: Nein. Das Script verwaltet nur Decisions mit dem konfigurierten `ALLOWLIST_REASON`. Alle manuell erstellten Einträge bleiben unberührt.
**F: Was passiert wenn CrowdSec nicht erreichbar ist?**
A: Das Script bricht mit Exit-Code 1 ab. Beim nächsten Cron-Lauf wird erneut versucht. Die bestehende Allowlist bleibt unverändert.
**F: Was passiert wenn eine Domain nicht aufgelöst werden kann?**
A: Die Domain wird übersprungen und eine Warnung geloggt. Alle anderen Domains werden normal verarbeitet. Bestehende Einträge bleiben bis zum Ablauf der `ALLOWLIST_DURATION` bestehen.
**F: Kann ich das Script auf einem anderen Server als CrowdSec laufen lassen?**
A: Ja, über `CSCLI_CMD` z.B. via SSH:
```bash
CSCLI_CMD="ssh user@crowdsec-server cscli"
```
**F: Unterstützt das Script Wildcard-Domains?**
A: Nein, Wildcard-Domains (z.B. `*.example.com`) werden nicht unterstützt. Jede Subdomain muss einzeln eingetragen werden.
**F: Wie viele Einträge kann das Script verwalten?**
A: Kein festes Limit. Die DNS-Auflösung wird linear pro Eintrag durchgeführt. Bei hunderten Domains kann die Laufzeit einige Minuten betragen.
**F: Kann ich das Script unter macOS verwenden?**
A: Ja, solange `dig` und Bash 4+ verfügbar sind. macOS liefert standardmäßig Bash 3.2 installiere Bash 4+ z.B. via Homebrew.
**F: Was ist der Unterschied zwischen dem interaktiven Menü und dem CLI?**
A: Das interaktive Menü (Standard) bietet eine grafische Auswahl aller Funktionen. Der CLI-Modus (`--run`, `--list`, etc.) ist für automatisierten/Cron-Betrieb gedacht.
**F: Können im interaktiven Menü auch direkte cscli-Befehle ausgeführt werden?**
A: Ja, Menüpunkt 40 ermöglicht die Ausführung beliebiger cscli-Befehle über den konfigurierten Basisbefehl.

32
examples/crontab.example Normal file
View File

@@ -0,0 +1,32 @@
# ============================================================================
# CrowdSec Manager v0.1.0 - Crontab Beispiele
# ============================================================================
# Installation: crontab -e (und gewünschte Zeile einfügen)
#
# WICHTIG: Das Script startet ohne Parameter das interaktive Menü.
# Für den Cron-Betrieb MUSS der Parameter --run angegeben werden!
# ============================================================================
# --- Standard: Alle 30 Minuten ausführen ---
*/30 * * * * /opt/crowdsec-manager/crowdsec-manager.sh --run >> /var/log/crowdsec-manager-cron.log 2>&1
# --- Alle 15 Minuten ---
# */15 * * * * /opt/crowdsec-manager/crowdsec-manager.sh --run >> /var/log/crowdsec-manager-cron.log 2>&1
# --- Stündlich ---
# 0 * * * * /opt/crowdsec-manager/crowdsec-manager.sh --run >> /var/log/crowdsec-manager-cron.log 2>&1
# --- Alle 6 Stunden ---
# 0 */6 * * * /opt/crowdsec-manager/crowdsec-manager.sh --run >> /var/log/crowdsec-manager-cron.log 2>&1
# --- Täglich um 03:00 Uhr ---
# 0 3 * * * /opt/crowdsec-manager/crowdsec-manager.sh --run >> /var/log/crowdsec-manager-cron.log 2>&1
# --- Mit eigenem Config-Pfad ---
# */30 * * * * /opt/crowdsec-manager/crowdsec-manager.sh --run --config /etc/crowdsec-manager/meine-config.conf >> /var/log/crowdsec-manager-cron.log 2>&1
# --- Im Quiet-Modus (nur Fehler loggen) ---
# */30 * * * * /opt/crowdsec-manager/crowdsec-manager.sh --run --quiet >> /var/log/crowdsec-manager-cron.log 2>&1
# --- Dry-Run zum Testen ---
# */30 * * * * /opt/crowdsec-manager/crowdsec-manager.sh --run --dry-run >> /var/log/crowdsec-manager-cron.log 2>&1