CrowdSec-Threat-Map

CrowdSec-Threat-Map

Docker app from kabelsalatundklartext's Repository

Overview

Echtzeit-Angriffskarte direkt aus eurer lokalen CrowdSec-Datenbank. Features: - Interaktive Weltkarte mit animierten Angriffspfeilen (D3.js) - Live-Feed mit Suche, Filter und Pagination - Ban-Status-Anzeige und IP-Unban direkt aus dem Dashboard - Dynamische IP-Whitelist (verhindert Selbst-Ban bei IP-Wechsel) - 4 Farbthemen, Sound-Alarm, CSV-Export - Vollständig responsive — Desktop und Mobile Voraussetzung: CrowdSec muss als Docker-Container auf Unraid laufen. Tipp — CrowdSec Datenpfad herausfinden: docker inspect crowdsec | grep -A5 "Mounts"

🛡️ CrowdSec Threat Map

Echtzeit-Angriffskarte — direkt aus eurer lokalen CrowdSec-Datenbank

Version License Platform Python Docker


📸 Preview

Interaktive Weltkarte · Animierte Angriffspfeile · Live-Feed · Mobile-ready

CrowdSec Threat Map


✨ Features

  • 🌍 Interaktive Weltkarte mit animierten Angriffspfeilen (D3.js)
  • 🎯 Auto-Fit Zoom — alle Angriffspunkte automatisch sichtbar
  • 🔍 Echtzeit-Suche nach IP, Land, Stadt, Szenario, ASN
  • 🚫📋 Ban-Status-Anzeige — 🚫 aktiver Ban / 📋 nur Alert/Historie
  • 🔓 IP-Unban direkt aus dem Dashboard — löscht Decision UND Alert
  • 📊 Sparkline — Angriffe/Stunde auf einen Blick
  • 🎨 4 Farbthemen — Cyan, Alarm-Rot, Matrix-Grün, Amber
  • 📥 CSV-Export — direkt neben den Feed-Seitenzahlen
  • 📱 Vollständig responsive — Desktop und Mobile
  • 〰️ Linien-Toggle — Angriffspfeile & Radar-Ringe ein-/ausblenden
  • 🛡️ Dynamische IP-Whitelist — eigene IP automatisch alle 15 Min whitelisten
  • 🟢 Whitelist-Badge — zeigt aktuelle IP + Status live im Dashboard
  • 🌐 Sprache per Variable — LANGUAGE=de oder LANGUAGE=en in docker-compose
  • 🏙️ Lokalisierte Stadtnamen — Nürnberg statt Nuremberg, München statt Munich etc.
  • 📍 Korrigierte GeoIP — Vogtland/Plauen korrekt statt falscher Grenzregion

🚀 Installation — Unraid (App Store)

1. App Store öffnen

Unraid → Apps → Suchfeld: crowdsec-threat-map → Installieren

2. Pflichtfelder ausfüllen

Unraid Beispiel Beschreibung
Server Breitengrad 52.5200 ⚠️ Pflicht — euer Breitengrad
Server Längengrad 13.4050 ⚠️ Pflicht — euer Längengrad
Pfad /crowdsec/data /mnt/user/Docker/crowdsec/data ⚠️ Pflicht — Pfad zu euren CrowdSec-Daten
Pfad /crowdsec/postoverflows /mnt/user/Docker/crowdsec/postoverflows Für dynamische Whitelist
Port 8080 8080 Port für das Dashboard (frei wählbar)

Koordinaten finden: Rechtsklick auf Google Maps → „Was ist hier?"

CrowdSec-Pfad finden:

docker inspect crowdsec | grep -A5 "Mounts"
# → "Source": "/mnt/user/Docker/crowdsec/data"

3. Optionale Einstellungen

Feld Standard Beschreibung
Variable SERVER_NAME MeinServer Anzeigename auf der Karte
Variable CROWDSEC_CONTAINER crowdsec Name des CrowdSec-Containers
Variable WHITELIST_ENABLED true Schützt vor Selbst-Ban bei IP-Wechsel
Variable LANGUAGE de Sprache: de oder en
Variable UNBAN_API_TOKEN (leer) Empfohlen: Geheimer Token für Unban

4. Starten

Auf Anwenden klicken → Container startet automatisch.

Dashboard: http://EURE-UNRAID-IP:8080


🚀 Installation — Docker

docker run -d \
  --name crowdsec-monitor \
  --restart unless-stopped \
  -p 8080:8080 \
  -v /pfad/zu/crowdsec/data:/crowdsec/data:ro \
  -v /pfad/zu/crowdsec/postoverflows:/crowdsec/postoverflows \
  -v /var/run/docker.sock:/var/run/docker.sock:ro \
  --group-add 999 \
  -e SERVER_LAT=52.5200 \
  -e SERVER_LON=13.4050 \
  -e SERVER_NAME=Berlin \
  -e LANGUAGE=de \
  ghcr.io/kabelsalatundklartext/crowdsec-threat-map-docker:latest

Oder mit docker-compose.yml — die aktuelle Version findet ihr im Repository unter docker/docker-compose.yml.


⚙️ Alle Variablen

Variable Standard Beschreibung
SERVER_LAT 0.0 ⚠️ Breitengrad des Servers
SERVER_LON 0.0 ⚠️ Längengrad des Servers
SERVER_NAME MeinServer Anzeigename auf der Karte
LANGUAGE de Sprache der Oberfläche: de oder en
CROWDSEC_CONTAINER crowdsec Name des CrowdSec-Docker-Containers
CROWDSEC_DB_PATH /crowdsec/data/crowdsec.db Pfad zur CrowdSec SQLite-DB
CROWDSEC_MMDB_PATH /crowdsec/data/GeoLite2-City.mmdb Pfad zur GeoIP-Datenbank
CACHE_TTL 60 Cache-Zeit in Sekunden
DAYS_BACK 365 Anzahl Tage für die Anzeige
WHITELIST_ENABLED true Dynamische Whitelist aktivieren
WHITELIST_FILE /crowdsec/postoverflows/
s01-whitelist/my-whitelist.yaml
Pfad zur Whitelist-YAML
WHITELIST_INTERVAL 900 Prüfintervall in Sekunden (15 min)
CROWDSEC_RESTART_WAIT 15 Wartezeit nach CrowdSec-Neustart (Sek.)
CROWDSEC_RESTART_COOLDOWN 300 Mindestabstand zwischen automatischen CrowdSec-Neustarts
UNBAN_API_TOKEN (leer) Empfohlen: Geheimer Token für den Unban-Endpunkt

🔒 Sicherheit

Das Dashboard kann über den eingebundenen Docker-Socket CrowdSec-Bans aufheben (cscli). Behandelt Port 8080 daher wie eine Admin-Oberfläche:

Empfehlung Warum
Nicht ins Internet port-forwarden Jeder Erreichbare kann sonst Bans löschen
UNBAN_API_TOKEN setzen Schützt /unban vor fremden Aufrufen und CSRF (Header X-API-Token)
Nur im LAN / hinter VPN nutzen Typisches Homelab-Setup
Zufälliges Token z. B. openssl rand -hex 32 in docker-compose oder Unraid-Variable

Token setzen (Beispiel):

- UNBAN_API_TOKEN=a1b2c3d4e5f6...   # lang und zufällig

Ohne Token bleibt Unban wie bisher möglich — beim Start erscheint im Container-Log ein Hinweis.

Technische Absicherungen (ab v1.4.3):

  • IP-Validierung (IPv4/IPv6) vor jedem Unban und bei der dynamischen Whitelist
  • Kein offenes CORS mehr auf /unban
  • Cooldown für automatische CrowdSec-Neustarts (CROWDSEC_RESTART_COOLDOWN)

📦 Volumes

Host-Pfad Container-Pfad Beschreibung Pflicht?
/pfad/zu/crowdsec/data /crowdsec/data:ro CrowdSec DB + GeoIP-MMDB ✅ Ja
/pfad/zu/crowdsec/postoverflows /crowdsec/postoverflows Für dynamische Whitelist Nur wenn WHITELIST_ENABLED=true
/var/run/docker.sock /var/run/docker.sock:ro Für IP-Unban + Whitelist-Neustart Nur für Unban-Button

Unraid-Beispielpfade:

  • /mnt/user/Docker/crowdsec/data
  • /mnt/user/Docker/crowdsec/postoverflows

🛡️ Dynamische IP-Whitelist

Heimanschlüsse bekommen meist täglich eine neue IP. Ohne Whitelist kann CrowdSec euch selbst bannen. Der eingebaute Hintergrund-Thread prüft alle 15 Minuten eure aktuelle öffentliche IP und aktualisiert die Whitelist-YAML automatisch.

Voraussetzungen:

  • WHITELIST_ENABLED=true (Standard)
  • Volume /crowdsec/postoverflows eingebunden
  • /var/run/docker.sock eingebunden
  • Docker-GID korrekt gesetzt (--group-add 999 bzw. in Unraid über group_add)

Wie es funktioniert:

  1. Exporter ermittelt eure aktuelle öffentliche IP
  2. Vergleich mit der aktuellen Whitelist-YAML
  3. Bei Änderung: YAML wird aktualisiert, CrowdSec wird neu gestartet
  4. Wartezeit nach Neustart konfigurierbar via CROWDSEC_RESTART_WAIT

Dashboard-Badge:

Farbe Bedeutung
🟢 Grün IP gewhitelistet, alles ok
🔵 Cyan IP wurde gerade aktualisiert
🔴 Rot Fehler beim Update

🔓 IP-Unban

Mit UNBAN_API_TOKEN ist der Unban-Endpunkt geschützt; das Dashboard sendet den Token automatisch mit.

Jeder Feed-Eintrag zeigt den Ban-Status direkt an:

Icon Bedeutung Klick
🚫 (leuchtend) Aktiver Ban vorhanden Decision + Alert löschen
📋 (leuchtend) Nur Alert/Historie Nur Alert löschen

🗺️ GeoIP & Stadtanzeige

Ohne GeoIP-Datenbank werden keine Städte angezeigt, nur Länderpunkte.

GeoLite2-City.mmdb einrichten:

  1. Kostenlos registrieren: MaxMind GeoLite2
  2. GeoLite2-City.mmdb herunterladen
  3. In euren CrowdSec-Datenordner legen (gleicher Ordner wie crowdsec.db)
  4. Container neu starten

🛠️ Fehlerbehebung

Dashboard leer / keine Daten:

docker logs crowdsec-monitor
curl http://EURE-IP:8080/metrics | head -10

Falscher CrowdSec-Pfad:

docker inspect crowdsec | grep -A5 "Mounts"

Unban funktioniert nicht:

# Docker-GID prüfen
getent group docker | cut -d: -f3
# → In Unraid unter "Extra Parameters" als --group-add eintragen

# Bei gesetztem UNBAN_API_TOKEN: 401 = Token fehlt oder falsch
curl -X POST http://EURE-IP:8080/unban \
  -H "Content-Type: application/json" \
  -H "X-API-Token: DEIN-TOKEN" \
  -d '{"ip":"1.2.3.4"}'

Whitelist-Fehler:

curl http://EURE-IP:8080/whitelist-status

Dashboard zeigt Verbindungsfehler:

# Prüfen ob entrypoint.sh die URL korrekt gesetzt hat
docker exec crowdsec-monitor grep "EXPORTER_URL" /var/www/html/index.html
# → Sollte '/metrics' zeigen

📋 Changelog

Vollständige Versionshistorie → CHANGELOG.md


🔗 Links


📄 Lizenz

GNU General Public License v3.0 (GPL-3.0)

✅ Privat & Homelab nutzen ✅ Verändern & anpassen
✅ Weitergeben & teilen ✅ Eigene Versionen veröffentlichen
✅ Kommerzieller Einsatz erlaubt ❌ Closed-Source-Abwandlungen verboten
✅ Forks müssen GPL-3.0 bleiben ✅ Quellcode muss immer offen bleiben

Bei Weitergabe oder Veröffentlichung: Namensnennung + GPL-3.0-Lizenz beibehalten.

"CrowdSec Threat Map" von kabelsalatundklartext — GitHub

Requirements

CrowdSec Docker Container

Related apps

Details

Repository
ghcr.io/kabelsalatundklartext/crowdsec-threat-map-docker:latest
Last Updated2026-10-14
First Seen2026-05-13

Runtime arguments

Web UI
http://[IP]:[PORT:8080]/
Network
bridge
Shell
sh
Privileged
false
Extra Params
--group-add 999

Template configuration

Dashboard PortPorttcp

Port für das Web-Dashboard — frei wählbar, z.B. 8080, 5757, etc.

Target
8080
CrowdSec DatenpfadPathro

Pfad zum CrowdSec data-Verzeichnis (enthält crowdsec.db und optional GeoLite2-City.mmdb). Tipp: docker inspect crowdsec | grep -A5 Mounts

Target
/crowdsec/data
CrowdSec Postoverflows-PfadPathrw

Pfad zum postoverflows-Verzeichnis. Wird für die dynamische IP-Whitelist benötigt (WHITELIST_ENABLED=true). Kann leer gelassen werden wenn Whitelist deaktiviert.

Target
/crowdsec/postoverflows
Docker SocketPathro

Docker Socket — wird für IP-Unban und dynamische Whitelist (CrowdSec-Neustart) benötigt.

Target
/var/run/docker.sock
Default
/var/run/docker.sock
Value
/var/run/docker.sock
Server Breitengrad (LAT)Variable

Breitengrad eures Servers — erscheint als Zielpunkt auf der Karte. Tipp: Rechtsklick auf Google Maps → Was ist hier?

Target
SERVER_LAT
Default
0.0
Value
0.0
Server Längengrad (LON)Variable

Längengrad eures Servers — erscheint als Zielpunkt auf der Karte. Tipp: Rechtsklick auf Google Maps → Was ist hier?

Target
SERVER_LON
Default
0.0
Value
0.0
Server NameVariable

Anzeigename eures Servers im Dashboard (z.B. Hamburg, Berlin, Homelab).

Target
SERVER_NAME
Default
MeinServer
Value
MeinServer
Sprache (LANGUAGE)Variable

Oberflächensprache des Dashboards: de (Deutsch) oder en (Englisch).

Target
LANGUAGE
Default
de
Value
de
CrowdSec Container-NameVariable

Name des CrowdSec Docker-Containers. Prüfen mit: docker ps | grep crowdsec

Target
CROWDSEC_CONTAINER
Default
crowdsec
Value
crowdsec
Dynamische Whitelist aktivierenVariable

Verhindert Selbst-Ban bei wechselnder IP (typisch bei deutschen Heimanschlüssen). Eigene IP wird automatisch alle 15 Minuten in CrowdSec gewhitelistet.

Target
WHITELIST_ENABLED
Default
true
Value
true
Whitelist Datei-PfadVariable

Pfad zur Whitelist-YAML innerhalb des Containers. Nur ändern wenn ihr einen anderen Postoverflows-Pfad nutzt.

Target
WHITELIST_FILE
Default
/crowdsec/postoverflows/s01-whitelist/my-whitelist.yaml
Value
/crowdsec/postoverflows/s01-whitelist/my-whitelist.yaml
Whitelist Prüfintervall (Sekunden)Variable

Wie oft die eigene IP geprüft und ggf. gewhitelistet wird. Standard: 900 Sekunden (15 Minuten).

Target
WHITELIST_INTERVAL
Default
900
Value
900
Cache TTL (Sekunden)Variable

Wie lange die Metrik-Daten gecacht werden bevor sie neu aus der DB geladen werden. Standard: 60 Sekunden.

Target
CACHE_TTL
Default
60
Value
60
Tage zurück (DAYS_BACK)Variable

Wie viele Tage Angriffs-Historie angezeigt wird. Standard: 365 Tage.

Target
DAYS_BACK
Default
365
Value
365
CrowdSec Restart Wartezeit (Sekunden)Variable

Wartezeit nach CrowdSec-Neustart (bei Whitelist-Update). Erhöhen wenn Timeout-Fehler im Log erscheinen. Standard: 15 Sekunden.

Target
CROWDSEC_RESTART_WAIT
Default
15
Value
15
Unban API-TokenVariable

Empfohlen: Zufälliges Token (z.B. openssl rand -hex 32). Schützt den Unban-Endpunkt vor unbefugten Aufrufen. Leer lassen nur im isolierten LAN.

Target
UNBAN_API_TOKEN
CrowdSec Restart Cooldown (Sekunden)Variable

Mindestabstand zwischen automatischen CrowdSec-Neustarts bei Whitelist-Updates. Standard: 300 Sekunden.

Target
CROWDSEC_RESTART_COOLDOWN
Default
300
Value
300