Last Updated:

NGINX Proxy Manager mit CrowdSec absichern - Docker-Setup unter Ubuntu schützen

Ralf Kirchner
Ralf Kirchner CrowdSec

Mach deinen Docker-Server mit CrowdSec zur aktiven Firewall – automatisch Angriffe erkennen, blockieren und Logs auswerten.

In dieser Schritt-für-Schritt-Anleitung zeige ich dir, wie du deinen Docker Compose-Stack unter Ubuntu 22.04 LTS mit CrowdSec und dem Firewall Bouncer absicherst – inklusive praktischer Beispiele, Konfigurationsdateien und Tipps zur Integration in die CrowdSec Cloud-Konsole.

Voraussetzungen

  • Betriebssystem: Ubuntu 22.04 LTS (Docker-Host)
  • Installiertes Docker & Docker Compose
  • Root-Zugriff bzw. Sudo-Rechte auf dem Host-System
  • Optional: Zugang zur CrowdSec Cloud Konsole für die Registrierung der Security Engine

Systemübersicht

Um besser zu verstehen, wie die einzelnen Komponenten miteinander verbunden sind, zeigt das folgende Schema den Aufbau und die Datenflüsse deines CrowdSec-Setups im Docker-Umfeld auf Ubuntu 22.04:

  • CrowdSec-Engine läuft in einem Docker-Container - verarbeitet Logfiles über gemountete Volumes (z. B. auth.log, syslog, NPM-Logs)
  • Firewall Bouncer läuft direkt auf dem Host-System - kommuniziert über API mit der CrowdSec-Engine (im Container)
  • Logdateien stammen aus dem Docker-Host (z. B. /var/log/syslog, /var/log/auth.log)
  • weiteren Docker-Containern wie z. B. Nginx Proxy Manager (über Volume-Mounts)
  • Socket-Proxy ermöglicht sicheren, eingeschränkten Zugriff auf den Docker-Socket - CrowdSec liest daraus Container-Metadaten
Image description

Diese Visualisierung hilft dir, die Architektur besser zu verstehen und gegebenenfalls zu erweitern – z. B. um zusätzliche Bouncer oder Logquellen.

Anleitung zur Einrichtung

Installation CrowdSec Container

Zunächst gilt es, ein verfügbares Subnetz zu ermitteln, das anschließend in der Datei docker-compose.yaml verwendet wird. Führe dazu auf dem Docker-Host folgenden Befehl aus:

sudo docker network inspect $(sudo docker network ls -q)|grep -E "Subnet"

Eine mögliche Darstellung der Ausgabe könnte folgendermaßen sein.

Image description

In der Datei docker-compose.yaml sollten das Subnetz, die Container-IP-Adresse sowie die Gateway-IP-Adresse durch Adressen eines verfügbaren Subnetzes ersetzt werden. Im gezeigten Beispiel kam das Subnetz 172.28.5.0/16 zum Einsatz.

version: '3'
services:
  crowdsec:
    image: crowdsecurity/crowdsec:latest
    restart: unless-stopped
    environment:
      COLLECTIONS: "crowdsecurity/linux"
      DOCKER_HOST: tcp://socket-proxy:2375
    volumes:
      - crowdsec-db:/var/lib/crowdsec/data/
      - crowdsec-config:/etc/crowdsec/
      - /etc/crowdsec/acquis.yaml:/etc/crowdsec/acquis.yaml
      - /var/log/syslog:/var/log/syslog:ro
      - /var/log/auth.log:/var/log/auth.log:ro
    depends_on:
      - socket-proxy
    networks:
      crowdsec:
        ipv4_address: 172.28.5.254

  socket-proxy:
    restart: always
    image: lscr.io/linuxserver/socket-proxy:latest
    environment:
      INFO: 1
      CONTAINERS: 1
      POST: 0
      BUILD: 0
      COMMIT: 0
      CONFIGS: 0
      DISTRIBUTION: 0
      EXEC: 0
      GRPC: 0
      IMAGES: 0
      NETWORKS: 0
      NODES: 0
      PLUGINS: 0
      SERVICES: 0
      SESSION: 0
      SWARM: 0
      SYSTEM: 0
      TASKS: 0
      VOLUMES: 0
    volumes:
      - '/var/run/docker.sock:/var/run/docker.sock:ro'
    read_only: true
    tmpfs:
      - /run
    networks:
      crowdsec:

volumes:
  crowdsec-db:
  crowdsec-config:
  
networks:
  crowdsec:
    driver: bridge
    ipam:
      config:
        - subnet: 172.28.0.0/16
          gateway: 172.28.5.1
    external: false

Die Konfigurationsdatei /etc/crowdsec/acquis.yaml auf dem Docker-Host anlegen:

sudo mkdir -p /etc/crowdsec && sudo touch /etc/crowdsec/acquis.yaml

und folgenden Content einfügen:

filenames:
 - /var/log/auth.log
 - /var/log/syslog
labels:
  type: syslog
---

Den Container Stack erstellen:

sudo docker compose up -d

Installation Firewall Bouncer

Der Firewall Bouncer wird direkt auf dem Docker-Host eingerichtet. Um das Repository sowie den erforderlichen GPG-Schlüssel zu installieren, führe die folgenden Befehle aus:

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

Nachdem das Repository hinzugefügt wurde, führe die Installation von CrowdSec Firewall Bouncer durch.

sudo apt update && sudo apt install crowdsec-firewall-bouncer-iptables

Konfiguriere den Bouncer anschließend so, dass er mit der lokalen API des CrowdSec-Containers kommuniziert. Erstelle dazu zunächst mithilfe von cscli ein API-Token für den Bouncer.

sudo docker exec -t crowdsec-crowdsec-1 cscli bouncers add HostFirewallBouncer

Ein neuer API-Schlüssel für den Bouncer „HostFirewallBouncer“ wird generiert und ausschließlich einmalig angezeigt.

Image description

Konfiguriere anschließend den Bouncer so, dass er das Token zur Authentifizierung bei der lokalen CrowdSec-API nutzt. Öffne dazu die Datei sudo nano /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml und passe die Werte für api_url, api_key sowie iptables_chains an. In diesem Beispiel wurde IPv6 zusätzlich über disable_ipv6 deaktiviert:

mode: iptables
piddir: /var/run/
update_frequency: 10s
daemonize: true
log_mode: file
log_dir: /var/log/
log_level: info
api_url: http://172.28.5.254:8080/
api_key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
disable_ipv6: true
#if present, insert rule in those chains
iptables_chains:
 - INPUT
 - DOCKER-USER

Jetzt starte den Bouncer mit folgendem Befehl:

sudo systemctl start crowdsec-firewall-bouncer.service

Danach überprüfe den aktuellen Status:

sudo systemctl status crowdsec-firewall-bouncer.service

Das Ergebnis könnte dann ungefähr folgendermaßen aussehen:

Image description

Läuft der Dienst, sollte es eine neue Firewall Chain mit dem Namen “DOCKER-USER” geben. Das kann wie folgt geprüft werden:

sudo iptables -L -n

Das Ergebnis sollte so oder ähnlich ausschauen:

Image description

Das IP-Set crowdsec-blacklist sollte jetzt ebenfalls eine Auflistung der gesperrten IP-Adressen enthalten. Dies lässt sich wie folgt überprüfen:

sudo ipset -L crowdsec-blacklists

Es werden dabei alle IP-Adressen der Liste crowdsec-blacklists aufgelistet.

Image description

Einrichtung Nginx Proxy Manager

Um die Logdaten aller virtuellen Hosts zentral über den Nginx Proxy Manager (NPM) an den CrowdSec-Dienst zur Analyse und automatischen Erkennung sowie Blockierung verdächtiger Aktivitäten weiterzuleiten, sind einige Anpassungen an der Konfiguration erforderlich.

Zunächst wird auf dem Hostsystem ein zentraler Ordner für die Logdateien der virtuellen Hosts erstellt:

sudo mkdir -p /var/log/crowdsec/proxy

Anschließend wird in der docker-compose.yaml des NPM-Containers ein zusätzlicher Volume-Eintrag hinzugefügt, um die Logdateien bereitzustellen. Danach muss der Container neu gestartet werden:

volumes:
  - /var/log/crowdsec/proxy:/data/logs

Damit CrowdSec diese Logs verarbeiten kann, wird auf dem Host in der Konfigurationsdatei /etc/crowdsec/acquis.yaml folgender Abschnitt am Ende ergänzt:

filenames:
  - /var/log/crowdsec/proxy/*.log
labels:
  type: nginx-proxy-manager
---

Zum Abschluss wird die docker-compose.yaml des CrowdSec-Stacks erweitert, um die neue Logquelle einzubinden und die passende Collection zu aktivieren. Danach sollte der Stack neu gestartet werden:

environment:
  COLLECTIONS: "crowdsecurity/linux crowdsecurity/nginx-proxy-manager"
  
volumes:
  - /var/log/crowdsec/proxy/:/var/log/proxy/:ro

Nachdem alle Konfigurationsschritte erfolgreich abgeschlossen wurden, kann ein abschließender Funktionstest durchgeführt werden, um die Integration von CrowdSec zu überprüfen.

Setzte dazu deine eigene öffentliche IP testweise für 4 Minuten auf die Bannliste. Ersetze die IP-Adresse durch deine aktuelle IP-Adresse:

sudo docker exec -t crowdsec-crowdsec-1 cscli decisions add --ip 79.247.206.115 --duration 4m

Rufe anschließend deine Website auf und überprüfe die Erreichbarkeit. Wenn die Einrichtung korrekt war, sollte sowohl der HTTP-Zugriff als auch jede andere Verbindung zu dem Server für die festgelegte Dauer von vier Minuten blockiert sein.

Um alle derzeit aktiven Sperren in Crowdsec anzuzeigen, verwende folgenden Befehl:

sudo docker exec -t crowdsec-crowdsec-1 cscli decisions list

Szenarios Erweiterung

Enroll Cloud Console

Melde dich in der Cloud-Konsole an und navigiere zum Bereich Engine. Klicke dort auf “Add Security Engine”.

Image description

Füge nun auf deinem Docker-Host die CrowdSec Engine hinzu:

sudo docker exec -t crowdsec-crowdsec-1 cscli console enroll -e context <KEY>

Die Ausgabe sollte in etwa wie folgt aussehen:

Image description

Bestätige anschließend die Anmeldung im CrowdSec-Portal über “Accept Enrollment”:

Image description

Zum Abschluss den CrowdSec-Container neu starten:

E-Mail-Benachrichtigungen

Verbinde dich mit dem CrowdSec Docker-Container:

sudo docker exec -it crowdsec-crowdsec-1 bash

Füge in der Datei /etc/crowdsec/profiles.yaml den folgenden Abschnitt hinzu (bzw. entferne das Kommentarzeichen, falls bereits vorhanden):

notifications:  
 - email_default

Bearbeite die Datei /etc/crowdsec/notifications/email.yaml und trage die Zugangsdaten deines SMTP-Servers ein:

smtp_host:            # example: smtp.gmail.com                                                  
smtp_username:        # Replace with your actual username     
smtp_password:        # Replace with your actual password
smtp_port:            # Common values are any of [25, 465, 587, 2525]
auth_type:            # Valid choices are "none", "crammd5", "login", "plain"
sender_name: "CrowdSec"
sender_email:         # example: 
email_subject: "CrowdSec Notification"
receiver_emails:
# - 

# One of "ssltls", "starttls", "none" 
encryption_type: "ssltls"

Starte den CrowdSec-Container neu, damit die Änderungen wirksam werden.

sudo docker restart crowdsec-crowdsec-1

Um sicherzustellen, dass die E-Mail-Benachrichtigungen korrekt funktionieren, kannst du eine Testnachricht manuell auslösen:

sudo docker exec -it crowdsec-crowdsec-1 cscli decisions add -i 10.255.255.1 --reason "E-Mail-Test" -t ban

Wenn alles richtig eingerichtet ist, solltest du in Kürze eine Test-E-Mail an die konfigurierte Empfängeradresse erhalten. Falls keine E-Mail ankommt, überprüfe die Logs des Containers mit:

sudo docker logs crowdsec-crowdsec-1

Abschließend kann die Fake-Entscheidung mit sudo docker exec -it crowdsec-crowdsec-1 cscli decisions delete -i 10.255.255.1 entfernen werden.

Whitelist DynDNS IP-Adresse

Führe folgenden Befehl auf dem Docker-Host aus, um eine Shell im Container zu öffnen:

sudo docker exec -it crowdsec-crowdsec-1 bash

Erstelle den benötigten Ordner und eine leere Whitelist-Datei:

mkdir -p /etc/crowdsec/postoverflows/s01-whitelist && touch /etc/crowdsec/postoverflows/s01-whitelist/FQDN-whitelist.yaml

Öffne die Datei FQDN-whitelist.yaml mit dem Editor vi:

vi /etc/crowdsec/postoverflows/s01-whitelist/FQDN-whitelist.yaml

Füge den folgenden Inhalt ein und ersetze foo.com durch deinen tatsächlichen FQDN:

name: me/FQDN-whitlists
description: "Whitelist postoverflows from FQDN"
whitelist:
  reason: "do whitelistings by FQDN"
  expression:
    - evt.Overflow.Alert.Source.IP in LookupHost("foo.com")  

Beende die Container-Shell mit exit und führe einen Neustart des CrowdSec Container durch:

sudo docker restart crowdsec-crowdsec-1

Mit dem folgenden Befehl kann geprüft werden, ob die Regel geladen wurde:

sudo docker exec -it crowdsec-crowdsec-1 cscli postoverflows list

Führe einen Funktionstest der FQDN-Whitelist durch, indem du zunächst die IP-Adresse deines FQDNs ermittelst und anschließend eine manuelle Entscheidung für die geblockte IP hinzufügst:

dig +short foo.com

oder durch:

host foo.com

Angenommen, die IP ist 203.0.113.42, füge dann testweise eine Entscheidung hinzu:

sudo docker exec -it crowdsec-crowdsec-1 cscli decisions add -i 203.0.113.42 --reason "Test block" -t ban

Prüfe, ob die Whitelist gegriffen hat:

sudo docker logs -f crowdsec-crowdsec-1

Ist die Regel richtig eingestellt, wird die Entscheidung von der Whitelist übergangen oder nicht berücksichtigt. In diesem Fall erhältst du weder eine Benachrichtigung noch wird eine Blockierung durchgeführt.

Danach kann der Testeintrag wieder gelöscht werden.

sudo docker exec -it crowdsec-crowdsec-1 cscli decisions delete -i 203.0.113.42

Abschluss

Damit ist das Tutorial zu “NGINX Proxy Manager mit CrowdSec absichern: Docker-Setup unter Ubuntu 22.04 schützen” abgeschlossen. Wenn Sie Fragen haben, senden Sie eine Mail an ralf.kirchner@ksite.de

Quellen