Initial Release 0.1.0
This commit is contained in:
@@ -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"
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user