Dieses Bash-Skript generiert einen vollständigen HTML-Bericht aller CrowdSec-Alerts der vergangenen 24 Stunden. Es ruft mit cscli alerts list -o json --since 24h --limit 0
alle Alerts ab und erstellt daraus eine übersichtliche Tabelle, die für jeden Vorfall folgende Informationen enthält:
Zeitpunkt der Entscheidung
Ziel (Einzel-IP oder IP-Range)
Entscheidungstyp (z.B. BAN, CAPTCHA)
Szenarioname ohne Präfix
Betroffene Logdatei(en) mit vollem Pfad
Nachricht (Message) des Alerts
Am Ende der Tabelle werden Datum, Uhrzeit und der Hostname des Servers angezeigt. Der Bericht wird per HTML-E-Mail an eine definierte Adresse verschickt. So erhält man einmal täglich eine vollständige Übersicht über alle Sicherheitsvorfälle inklusive aller relevanten Metadaten.
#!/bin/bash
# /etc/cron.daily/crowdsec-complete-daily-report
# Cron-Skript: Alle Alerts der letzten 24 Stunden mit vollständigen Logpfaden und Nachricht als HTML-Mail
# Konfiguration
EMAIL_TO="your-email@domain.com"
EMAIL_SUBJECT="🛡️ CrowdSec Tagesbericht $(date +'%Y-%m-%d')"
TMP_HTML="/tmp/crowdsec-complete-report.html"
# Alerts der letzten 24 Stunden abrufen (unbegrenzt)
ALERTS_JSON=$(cscli alerts list -o json --since 24h --limit 0)
ALERT_COUNT=$(echo "$ALERTS_JSON" | jq length)
# HTML-Header
cat > "$TMP_HTML" <
🛡️ CrowdSec Tagesbericht – Alle Vorfälle
Zeitraum: Letzte 24 Stunden (bis $(date +"%Y-%m-%d %H:%M:%S"))
Anzahl Vorfälle: $ALERT_COUNT
Zeitpunkt
Ziel (IP/Range)
Typ
Szenario
Logdatei (voller Pfad)
Nachricht
EOF
# Alerts durchlaufen
echo "$ALERTS_JSON" | jq -c '.[] | {stop: .stop_at, decisions: .decisions, events: .events, message: .message}' | while read -r alert; do
STOP=$(echo "$alert" | jq -r '.stop')
MSG=$(echo "$alert" | jq -r '.message // "–"')
# Logdatei-Pfade ermitteln
LOGFILES=$(echo "$alert" | jq -r '
.events
| map(.meta[]? | select(.key=="datasource_path") | .value)
| unique
| join(", ")
')
[ -z "$LOGFILES" ] && LOGFILES="unbekannt"
# Entscheidungen verarbeiten
echo "$alert" | jq -r --arg paths "$LOGFILES" --arg msg "$MSG" '
.decisions[]
| [
(if .scope=="Ip" then "\(.value)" else "\(.value)" end),
(.type|ascii_upcase),
(.scenario|split("/")|.[1]),
($paths),
($msg)
]
| @tsv
' | while IFS=$'\t' read -r target typ scen logfiles message; do
echo "${STOP//T/ } ${target} ${typ} ${scen} ${logfiles} ${message} " >> "$TMP_HTML"
done
done
# HTML-Footer
cat >> "$TMP_HTML" <
Report generiert am $(date +"%Y-%m-%d %H:%M:%S") von CrowdSec auf $(hostname)