Initial Release 0.1.0
This commit is contained in:
@@ -18,20 +18,14 @@
|
|||||||
# Podman: CSCLI_CMD="podman exec crowdsec cscli"
|
# Podman: CSCLI_CMD="podman exec crowdsec cscli"
|
||||||
CSCLI_CMD="docker exec crowdsec cscli"
|
CSCLI_CMD="docker exec crowdsec cscli"
|
||||||
|
|
||||||
# Name der Allowlist-Decision-Liste in CrowdSec
|
# Name der Allowlist in CrowdSec (wird via 'cscli allowlists' verwaltet)
|
||||||
# Diese Liste wird vom Script angelegt und verwaltet
|
# Diese Liste wird vom Script automatisch angelegt und verwaltet
|
||||||
ALLOWLIST_NAME="crowdsec-manager"
|
ALLOWLIST_NAME="crowdsec-manager"
|
||||||
|
|
||||||
# Beschreibung der Allowlist
|
# Beschreibung der Allowlist
|
||||||
ALLOWLIST_DESCRIPTION="Managed by crowdsec-manager script"
|
ALLOWLIST_DESCRIPTION="Managed by crowdsec-manager script"
|
||||||
|
|
||||||
# Dauer für die Allowlist-Einträge (wie lange ein Eintrag gültig ist)
|
# Beschreibung für einzelne Einträge in der Allowlist
|
||||||
# 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"
|
ALLOWLIST_REASON="allowlist-manager-auto"
|
||||||
|
|
||||||
# ----------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -376,18 +376,42 @@ crowdsec_health_check() {
|
|||||||
return 0
|
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() {
|
get_current_allowlist() {
|
||||||
log "INFO" "Rufe aktuelle Allowlist '${ALLOWLIST_NAME}' ab..."
|
log "INFO" "Rufe aktuelle Allowlist '${ALLOWLIST_NAME}' ab..."
|
||||||
|
|
||||||
local decisions
|
if ! ensure_allowlist_exists; then
|
||||||
decisions=$(cscli_exec "decisions list -o json --origin $ALLOWLIST_REASON" 2>/dev/null || echo "null")
|
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"
|
log "DEBUG" "Keine bestehenden Einträge in der Allowlist gefunden"
|
||||||
return 0
|
return 0
|
||||||
fi
|
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
|
local count
|
||||||
count=$(wc -l < "$CURRENT_IPS_FILE" 2>/dev/null || echo "0")
|
count=$(wc -l < "$CURRENT_IPS_FILE" 2>/dev/null || echo "0")
|
||||||
@@ -396,13 +420,8 @@ get_current_allowlist() {
|
|||||||
|
|
||||||
add_to_allowlist() {
|
add_to_allowlist() {
|
||||||
local ip="$1"
|
local ip="$1"
|
||||||
local ip_type="ip"
|
|
||||||
|
|
||||||
if is_cidr "$ip"; then
|
log "DEBUG" "Füge hinzu: $ip"
|
||||||
ip_type="range"
|
|
||||||
fi
|
|
||||||
|
|
||||||
log "DEBUG" "Füge hinzu: $ip (Typ: $ip_type)"
|
|
||||||
|
|
||||||
if [[ "${DRY_RUN:-false}" == "true" ]]; then
|
if [[ "${DRY_RUN:-false}" == "true" ]]; then
|
||||||
log "INFO" "[DRY-RUN] Würde hinzufügen: $ip"
|
log "INFO" "[DRY-RUN] Würde hinzufügen: $ip"
|
||||||
@@ -410,7 +429,7 @@ add_to_allowlist() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
local result
|
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"
|
log "DEBUG" "Erfolgreich hinzugefügt: $ip"
|
||||||
STAT_ADDED=$((STAT_ADDED + 1))
|
STAT_ADDED=$((STAT_ADDED + 1))
|
||||||
return 0
|
return 0
|
||||||
@@ -433,7 +452,7 @@ remove_from_allowlist() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
local result
|
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"
|
log "DEBUG" "Erfolgreich entfernt: $ip"
|
||||||
STAT_REMOVED=$((STAT_REMOVED + 1))
|
STAT_REMOVED=$((STAT_REMOVED + 1))
|
||||||
return 0
|
return 0
|
||||||
@@ -1493,7 +1512,7 @@ show_current_list() {
|
|||||||
echo ""
|
echo ""
|
||||||
echo -e "${BOLD}Aktuelle CrowdSec Allowlist (${ALLOWLIST_NAME}):${NC}"
|
echo -e "${BOLD}Aktuelle CrowdSec Allowlist (${ALLOWLIST_NAME}):${NC}"
|
||||||
draw_line "-" 60
|
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
|
draw_line "-" 60
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1501,14 +1520,22 @@ flush_allowlist() {
|
|||||||
log "WARN" "Entferne ALLE verwalteten Einträge aus der Allowlist..."
|
log "WARN" "Entferne ALLE verwalteten Einträge aus der Allowlist..."
|
||||||
|
|
||||||
if [[ "${DRY_RUN:-false}" == "true" ]]; then
|
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
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if cscli_exec "decisions delete --origin $ALLOWLIST_REASON" 2>/dev/null; then
|
# Allowlist komplett löschen und leer neu erstellen
|
||||||
log "INFO" "Alle verwalteten Einträge wurden entfernt."
|
if cscli_exec "allowlists delete ${ALLOWLIST_NAME}" 2>/dev/null; then
|
||||||
|
log "INFO" "Allowlist '${ALLOWLIST_NAME}' gelöscht."
|
||||||
else
|
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
|
return 1
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -151,16 +151,6 @@ Empfohlener Eintrag:
|
|||||||
*/30 * * * * /opt/crowdsec-manager/crowdsec-manager.sh --run >> /var/log/crowdsec-manager-cron.log 2>&1
|
*/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
|
### Cron-spezifisches Verhalten
|
||||||
|
|
||||||
Das Script erkennt automatisch ob es im Terminal oder per Cron läuft:
|
Das Script erkennt automatisch ob es im Terminal oder per Cron läuft:
|
||||||
|
|||||||
@@ -52,38 +52,20 @@ docker exec crowdsec cscli version
|
|||||||
|
|
||||||
### `ALLOWLIST_NAME`
|
### `ALLOWLIST_NAME`
|
||||||
|
|
||||||
Name der verwalteten Allowlist. Wird zur Identifizierung in CrowdSec verwendet.
|
Name der verwalteten Allowlist. Wird via `cscli allowlists` in CrowdSec verwaltet.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
ALLOWLIST_NAME="crowdsec-manager"
|
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`
|
### `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
|
```bash
|
||||||
ALLOWLIST_REASON="allowlist-manager-auto"
|
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`
|
### `HEALTH_CHECK`
|
||||||
|
|
||||||
Ob vor dem Sync ein CrowdSec-Health-Check durchgeführt werden soll.
|
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.
|
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?**
|
**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?**
|
**F: Kann ich das Script auf einem anderen Server als CrowdSec laufen lassen?**
|
||||||
A: Ja, über `CSCLI_CMD` z.B. via SSH:
|
A: Ja, über `CSCLI_CMD` z.B. via SSH:
|
||||||
|
|||||||
Reference in New Issue
Block a user