CrowdSec auf Ubuntu 24.04 mit Nginx Proxy Manager (Docker) einsetzen

CrowdSec auf Ubuntu 24.04 mit Nginx Proxy Manager (Docker) einsetzen
Photo by Liam Tucker / Unsplash

Wenn in einem Homelab mit Nginx Proxy Manager (NPM) auf Docker mehrere Services über die Ports 80 und 443 veröffentlicht werden, ist eine zuverlässige Schutzschicht gegen Brute-Force-Angriffe, Scanner, Bots und Exploits unerlässlich.

In diesem Beitrag zeige ich Schritt für Schritt:

  • Installation von CrowdSec auf Ubuntu 24.04
  • Einbindung der Docker-Logs von Nginx Proxy Manager
  • Einsatz des hostbasierten iptables-Bouncers
  • Saubere Integration in ein bestehendes Setup

Internet
   ↓
Nginx Proxy Manager (Docker)
   ↓
Docker Logs
   ↓
CrowdSec Agent (Host)
   ↓
iptables Bouncer (Host-Firewall)
   ↓
Angreifer-IP wird geblockt

CrowdSec auf Ubuntu 24.04 installieren

Offizielle Installationsanleitung:

Linux | CrowdSec
New to CrowdSec? Start with the introduction to understand the components and prerequisites.

Repository hinzufügen

curl -s https://install.crowdsec.net | sudo bash

Danach installieren:

sudo apt update
sudo apt install crowdsec

Status prüfen:

sudo systemctl status crowdsec
sudo cscli version

Docker-Logs von Nginx Proxy Manager verfügbar machen

In diesem Abschnitt richten wir jetzt CrowdSec so ein, dass es direkt die Logfiles von Nginx Proxy Manager (NPM) auswertet und Angreifer-IP-Adressen über iptables auf dem Host blockiert.

💡
Wichtig: Diese Anleitung ist explizit für Nginx Proxy Manager, nicht für generisches Nginx.

docker-compose.yml

services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped

    ports:
      # These ports are in format <host-port>:<container-port>
      - '80:80' # Public HTTP Port
      - '443:443' # Public HTTPS Port
      - '81:81' # Admin Web Port
      # Add any other Stream port you want to expose
      # - '21:21' # FTP

    environment:
      TZ: "Europe/Berlin"

      # Uncomment this if you want to change the location of
      # the SQLite DB file within the container
      # DB_SQLITE_FILE: "/data/database.sqlite"

      # Uncomment this if IPv6 is not enabled on your host
      # DISABLE_IPV6: 'true'

    volumes:
      - /opt/docker/volumes/nginx-proxy-manager/data:/data
      - /opt/docker/volumes/nginx-proxy-manager/letsencrypt:/etc/letsencrypt

    networks:
      - proxy

    healthcheck:
      test: ["CMD", "/usr/bin/check-health"]
      interval: 10s
      timeout: 3s

networks:
  proxy:
    external: true

iptables installieren (falls noch nicht vorhanden)

Auf den meisten Ubuntu-Servern ist iptables bereits installiert. Falls nicht:

sudo apt install iptables -y

CrowdSec Firewall-Bouncer installieren

Der Bouncer sorgt dafür, dass erkannte Angreifer-IP-Adressen in iptables eingetragen werden.

sudo apt install crowdsec-firewall-bouncer-iptables -y

Status prüfen

sudo systemctl status crowdsec-firewall-bouncer

Nginx Proxy Manager Collection installieren

Für NPM gibt es eine eigene Collection, die speziell auf dessen Logformat abgestimmt ist:

sudo cscli collections install crowdsecurity/nginx-proxy-manager

Damit werden passende Parser und Szenarien installiert.

Nginx Proxy Manager Logs auf dem Host verfügbar machen

Damit CrowdSec die Logs lesen kann, müssen sie auf dem Host-System verfügbar sein.
Standardmäßig nutzt die offizielle Anleitung von NPM:

volumes:
  - ./data:/data
  - ./letsencrypt:/etc/letsencrypt

Die Logs liegen dann im data/logs Verzeichnis innerhalb dieses Ordners, in welchem auch die docker-compose.yml liegt.

Empfohlene Anpassung der docker-compose.yaml

Um die Daten des Nginx Proxy Manager zentrale im Host-System unter /opt/docker/volumes bereitzustellen, kann die Compose-Datei wie folgt angepasst werden:

    volumes:
      - /opt/docker/volumes/nginx-proxy-manager/data:/data
      - /opt/docker/volumes/nginx-proxy-manager/letsencrypt:/etc/letsencrypt

Das vollständige docker-compose.yml ist oben zu finden und kann in folgender Verzeichnisstruktur betrieben werden:

# Verzeichnis für Nginx Proxy Manager - docker-compose.yml
mkdir -p /opt/docker/apps/nginx-proxy-manager
# Verzeichnis für Nginx Proxy Manager - Dateien und Konfiguration
mkdir -p /opt/docker/volumes/nginx-proxy-manager

Was wurde geändert?

  • Logs werden direkt nach /opt/docker/volumes/nginx-proxy-manager/data/logs auf dem Host geschrieben
  • Bessere Trennung von Konfiguration und Logdaten
  • Vereinfachtes Backup der gesamten persistenten Container-Daten

Acquisition-Datei für CrowdSec erstellen

Nun erstellen wir eine neue Konfigurationsdatei für CrowdSec:

sudo nano /etc/crowdsec/acquis.d/npm.yaml

Inhalt:

filenames:
  - /opt/docker/volumes/nginx-proxy-manager/data/logs/proxy-host-*_access.log
  - /opt/docker/volumes/nginx-proxy-manager/data/logs/proxy-host-*_error.log
labels:
  type: nginx-proxy-manager
source: file

Erklärung

  • proxy-host-1_access.log
  • proxy-host-2_access.log
  • usw.

Jeder neue Proxy Host in NPM erzeugt eigene Logdateien.

Durch das Wildcard proxy-host-* erkennt CrowdSec automatisch alle aktuellen und zukünftigen Proxy Hosts.

CrowdSec neu starten

sudo systemctl restart crowdsec

Prüfen, ob die Logs eingelesen werden

Wichtig:
Die Dateien erscheinen erst in den Metrics, nachdem sie nach dem Neustart verändert wurden.

Also:

  • Entweder warten, bis echter Traffic kommt
  • Oder selbst deine Website aufrufen
  • Oder Test-Traffic erzeugen

Dann prüfen:

sudo cscli metrics show acquisition

Dort sollten Einträge erscheinen wie:

Zusätzlich können dort auch Standard-Engine-Dateien wie auth.log und syslog erscheinen.

Funktionsweise nach erfolgreicher Einrichtung

Sobald:

  • Ein Bot die Seite scannt
  • Eine Brute-Force-Anfrage erfolgt
  • Ein bekannter Exploit-Versuch erkannt wird

passiert Folgendes:

  1. CrowdSec erkennt das Muster in den Logs
  2. Eine Entscheidung wird erstellt
  3. Der Firewall-Bouncer aktualisiert iptables
  4. Die IP wird auf dem Docker-Host blockiert
💡
Der Traffic wird damit geblockt, bevor er den Container erneut erreicht.

Zusammenfassung

Für Nginx Proxy Manager benötigt man:

  • iptables
  • crowdsec-firewall-bouncer-iptables
  • crowdsecurity/nginx-proxy-manager Collection
  • Eine passende acquis.yaml mit proxy-host-Logfiles

Damit erhält man:

  • Automatischen Schutz für alle Proxy Hosts
  • Hostbasierte IP-Sperren
  • Saubere Trennung zwischen Docker und Security-Layer

Allgemeine Status- & Diagnosebefehle

CrowdSec Status prüfen

sudo cscli version
sudo systemctl status crowdsec

Aktive Komponenten anzeigen

sudo cscli metrics

Zeigt:

  • Verarbeitete Logs
  • Aktive Parser
  • Getriggerte Szenarien
  • Bouncer-Status

Prüfen, ob Logs eingelesen werden

sudo cscli metrics show acquisition

Sehr wichtig bei NPM – hier siehst du, ob:

/opt/docker/volumes/nginx-proxy-manager/data/logs/proxy-host-1_access.log

wirklich verarbeitet wird.


Entscheidungen & geblockte IPs

Aktuelle Blockierungen anzeigen

sudo cscli decisions list

Mit Details:

sudo cscli decisions list -o human

Nur eine bestimmte IP prüfen:

sudo cscli decisions list -i 1.2.3.4

Manuell eine IP blockieren

sudo cscli decisions add -i 1.2.3.4 --duration 24h

Subnetz blockieren:

sudo cscli decisions add -r 10.10.10.0/24 --duration 12h

Entscheidung entfernen

sudo cscli decisions delete -i 1.2.3.4

Alle lokalen Entscheidungen löschen:

sudo cscli decisions delete --all

Alerts anzeigen

Aktuelle Alerts anzeigen

sudo cscli alerts list

Mit mehr Details:

sudo cscli alerts inspect <alert-id>

Beispiel:

sudo cscli alerts inspect 123

Hier siehst du:

  • Welche Szenarien ausgelöst haben
  • Welche Logzeilen beteiligt waren
  • Welche IP betroffen ist

Sehr hilfreich bei Fehlalarmen.


Szenarien, Parser & Collections verwalten

Installierte Collections anzeigen

sudo cscli collections list

Hub aktualisieren (sehr wichtig!)

sudo cscli hub update
sudo cscli hub upgrade

Installierte Parser anzeigen

sudo cscli parsers list

Installierte Szenarien anzeigen

sudo cscli scenarios list

Einzelnes Szenario deaktivieren

Beispiel:

sudo cscli scenarios disable crowdsecurity/http-probing

Wieder aktivieren:

sudo cscli scenarios enable crowdsecurity/http-probing

Bouncer verwalten

Registrierte Bouncer anzeigen

sudo cscli bouncers list

Beispiel-Ausgabe:

Name                             IP Address  Last API pull
crowdsec-firewall-bouncer         127.0.0.1   2s ago

Bouncer-Key neu generieren

sudo cscli bouncers add firewall-bouncer

Community Blocklist / CAPI

CAPI Status prüfen

sudo cscli capi status

Registrierung prüfen

sudo cscli console status

Debug & Fehlersuche

CrowdSec Live-Log anzeigen

sudo journalctl -u crowdsec -f

Bouncer Live-Log anzeigen

sudo journalctl -u crowdsec-firewall-bouncer -f

Testen, ob ein Logfile korrekt geparst wird

Sehr hilfreich bei NPM:

sudo cscli explain --file /var/log/docker-npm/proxy-host-1_access.log

Oder einzelne Logzeile testen:

echo 'LOGZEILE' | sudo cscli explain

Zeigt:

  • Welcher Parser greift
  • Welches Szenario ausgelöst würde
  • Ob Labels korrekt gesetzt sind

Schnelle Admin-Shortlist (Daily Use)

Für das NPM-Setup sehr nützlich:

sudo cscli metrics
sudo cscli decisions list
sudo cscli alerts list
sudo cscli hub update && sudo cscli hub upgrade
sudo cscli metrics show acquisition