Initial Release 0.1.0

This commit is contained in:
2026-03-11 21:25:53 +01:00
parent efb11a0bfa
commit 233d423ecc
5 changed files with 50 additions and 57 deletions

View File

@@ -18,20 +18,14 @@
# 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
# Name der Allowlist in CrowdSec (wird via 'cscli allowlists' verwaltet)
# Diese Liste wird vom Script automatisch 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)
# Beschreibung für einzelne Einträge in der Allowlist
ALLOWLIST_REASON="allowlist-manager-auto"
# ----------------------------------------------------------------------------

View File

@@ -376,18 +376,42 @@ crowdsec_health_check() {
return 0
}
ensure_allowlist_exists() {
# Prüfe ob die Allowlist bereits existiert
if cscli_exec "allowlists inspect ${ALLOWLIST_NAME}" &>/dev/null; then
log "DEBUG" "Allowlist '${ALLOWLIST_NAME}' existiert bereits"
return 0
fi
# Allowlist erstellen
log "INFO" "Erstelle Allowlist '${ALLOWLIST_NAME}'..."
if cscli_exec "allowlists create ${ALLOWLIST_NAME} -d '${ALLOWLIST_DESCRIPTION}'" 2>&1; then
log "INFO" "Allowlist '${ALLOWLIST_NAME}' erfolgreich erstellt"
return 0
else
log "ERROR" "Fehler beim Erstellen der Allowlist '${ALLOWLIST_NAME}'"
return 1
fi
}
get_current_allowlist() {
log "INFO" "Rufe aktuelle Allowlist '${ALLOWLIST_NAME}' ab..."
local decisions
decisions=$(cscli_exec "decisions list -o json --origin $ALLOWLIST_REASON" 2>/dev/null || echo "null")
if ! ensure_allowlist_exists; then
return 1
fi
if [[ "$decisions" == "null" ]] || [[ -z "$decisions" ]]; then
# Aktuelle IPs aus der Allowlist auslesen
local inspect_output
inspect_output=$(cscli_exec "allowlists inspect ${ALLOWLIST_NAME} -o json" 2>/dev/null || echo "null")
if [[ "$inspect_output" == "null" ]] || [[ -z "$inspect_output" ]]; then
log "DEBUG" "Keine bestehenden Einträge in der Allowlist gefunden"
return 0
fi
echo "$decisions" | grep -oP '"value"\s*:\s*"\K[^"]+' | sort -u > "$CURRENT_IPS_FILE" 2>/dev/null || true
# IPs/CIDRs aus dem JSON extrahieren (Feld "items" -> "ip_or_range")
echo "$inspect_output" | grep -oP '"ip_or_range"\s*:\s*"\K[^"]+' | sort -u > "$CURRENT_IPS_FILE" 2>/dev/null || true
local count
count=$(wc -l < "$CURRENT_IPS_FILE" 2>/dev/null || echo "0")
@@ -396,13 +420,8 @@ get_current_allowlist() {
add_to_allowlist() {
local ip="$1"
local ip_type="ip"
if is_cidr "$ip"; then
ip_type="range"
fi
log "DEBUG" "Füge hinzu: $ip (Typ: $ip_type)"
log "DEBUG" "Füge hinzu: $ip"
if [[ "${DRY_RUN:-false}" == "true" ]]; then
log "INFO" "[DRY-RUN] Würde hinzufügen: $ip"
@@ -410,7 +429,7 @@ add_to_allowlist() {
fi
local result
if result=$(cscli_exec "decisions add --type allow --scope $ip_type --value '$ip' --duration '${ALLOWLIST_DURATION}' --reason '${ALLOWLIST_REASON}' --origin '${ALLOWLIST_REASON}'" 2>&1); then
if result=$(cscli_exec "allowlists add ${ALLOWLIST_NAME} $ip -d '${ALLOWLIST_REASON}'" 2>&1); then
log "DEBUG" "Erfolgreich hinzugefügt: $ip"
STAT_ADDED=$((STAT_ADDED + 1))
return 0
@@ -433,7 +452,7 @@ remove_from_allowlist() {
fi
local result
if result=$(cscli_exec "decisions delete --value '$ip'" 2>&1); then
if result=$(cscli_exec "allowlists remove ${ALLOWLIST_NAME} $ip" 2>&1); then
log "DEBUG" "Erfolgreich entfernt: $ip"
STAT_REMOVED=$((STAT_REMOVED + 1))
return 0
@@ -1493,7 +1512,7 @@ show_current_list() {
echo ""
echo -e "${BOLD}Aktuelle CrowdSec Allowlist (${ALLOWLIST_NAME}):${NC}"
draw_line "-" 60
cscli_exec "decisions list --origin $ALLOWLIST_REASON" 2>/dev/null || echo "Keine Einträge oder Fehler beim Abrufen."
cscli_exec "allowlists inspect ${ALLOWLIST_NAME}" 2>/dev/null || echo "Keine Einträge oder Allowlist nicht gefunden."
draw_line "-" 60
}
@@ -1501,14 +1520,22 @@ flush_allowlist() {
log "WARN" "Entferne ALLE verwalteten Einträge aus der Allowlist..."
if [[ "${DRY_RUN:-false}" == "true" ]]; then
log "INFO" "[DRY-RUN] Würde alle Einträge mit Origin '$ALLOWLIST_REASON' entfernen"
log "INFO" "[DRY-RUN] Würde Allowlist '${ALLOWLIST_NAME}' löschen und neu erstellen"
return 0
fi
if cscli_exec "decisions delete --origin $ALLOWLIST_REASON" 2>/dev/null; then
log "INFO" "Alle verwalteten Einträge wurden entfernt."
# Allowlist komplett löschen und leer neu erstellen
if cscli_exec "allowlists delete ${ALLOWLIST_NAME}" 2>/dev/null; then
log "INFO" "Allowlist '${ALLOWLIST_NAME}' gelöscht."
else
log "ERROR" "Fehler beim Entfernen der Einträge."
log "WARN" "Allowlist '${ALLOWLIST_NAME}' konnte nicht gelöscht werden (existiert möglicherweise nicht)."
fi
# Leer neu erstellen
if cscli_exec "allowlists create ${ALLOWLIST_NAME} -d '${ALLOWLIST_DESCRIPTION}'" 2>&1; then
log "INFO" "Leere Allowlist '${ALLOWLIST_NAME}' neu erstellt."
else
log "ERROR" "Fehler beim Neuerstellen der Allowlist."
return 1
fi
}

View File

@@ -151,16 +151,6 @@ Empfohlener Eintrag:
*/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:

View File

@@ -52,38 +52,20 @@ docker exec crowdsec cscli version
### `ALLOWLIST_NAME`
Name der verwalteten Allowlist. Wird zur Identifizierung in CrowdSec verwendet.
Name der verwalteten Allowlist. Wird via `cscli allowlists` in CrowdSec verwaltet.
```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.
Beschreibung für die einzelnen Einträge in der Allowlist. Dient zur Nachverfolgbarkeit.
```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.

View File

@@ -111,7 +111,7 @@ A: Nein. Das Script verwaltet nur Decisions mit dem konfigurierten `ALLOWLIST_RE
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.
A: Die Domain wird übersprungen und eine Warnung geloggt. Alle anderen Domains werden normal verarbeitet. Bestehende Einträge in der Allowlist bleiben erhalten, da sie persistent sind.
**F: Kann ich das Script auf einem anderen Server als CrowdSec laufen lassen?**
A: Ja, über `CSCLI_CMD` z.B. via SSH: