In der Vergangenheit habe ich bereits einen Beitrag zum Nginx Proxy Manager verfasst. Mittlerweile gibt es aber einen Fork Namens NPMplus, welcher deutlich mehr Konfigurations- und Sicherheitseinstellungen ermöglicht.
Unter anderem kann hier auch die Security Plattform CrowdSec integriert werden. CrowdSec erkennt Angriffe anhand der Nginx-Logs und kann die angreifenden IP-Adressen dann blockieren.
Mit GeoIPupdate können IP-Addressen aus bestimmten Ländern blockiert werden, was die Angriffswarscheinlichkeit auf NPM und damit auf die dahinterliegenden Dienste deutlich reduziert.
Schritt 1:
Docker auf einem Ubuntu oder Debian Server nach der offiziellen Anleitung installieren:
https://docs.docker.com/engine/install/ubuntu/
Schritt 2:
Die folgenden Ordner erstellen:
mkdir -p /opt/npmplus
mkdir -p /opt/crowdsec
mkdir -p /opt/crowdsec/data
mkdir -p /opt/crowdsec/conf
mkdir -p /opt/crowdsec/conf/acquis.d
Schritt 3:
Nun diese Konfigurationsdatei npmplus.yaml erstellen und den folgenden Inhalt einfügen:
Die aktuelleste Konfig ist auf Github zu finden.
nano /opt/crowdsec/conf/acquis.d/npmplus.yaml
filenames:
- /opt/npmplus/nginx/access.log
- /opt/npmplus/nginx/error.log
labels:
type: npmplus
---
filenames:
- /opt/npmplus/nginx/error.log
labels:
type: modsecurity
---
listen_addr: 0.0.0.0:7422
appsec_config: crowdsecurity/appsec-default
name: appsec
source: appsec
labels:
type: appsec
# if you use openappsec you can enable this
#---
#source: file
#filenames:
# - /opt/openappsec/logs/cp-nano-http-transaction-handler.log*
#labels:
# type: openappsec
Schritt 4:
Jetzt erstellen wir die compose.yaml Datei im Ordner /opt.
nano /opt/compose.yaml
services:
npmplus:
container_name: npmplus
image: docker.io/zoeyvid/npmplus:latest
restart: always
network_mode: host
volumes:
- "/opt/npmplus:/data"
environment:
- "TZ=Europe/Berlin"
- "ACME_EMAIL=mail@beispiel.org" # Anpassen
- "LOGROTATE=true"
crowdsec:
container_name: crowdsec
image: docker.io/crowdsecurity/crowdsec:latest
restart: always
network_mode: bridge
ports:
- "127.0.0.1:7422:7422"
- "127.0.0.1:8080:8080"
environment:
- "TZ=Europe/Berlin"
- "COLLECTIONS=ZoeyVid/npmplus"
volumes:
- "/opt/crowdsec/conf:/etc/crowdsec"
- "/opt/crowdsec/data:/var/lib/crowdsec/data"
- "/opt/npmplus/nginx:/opt/npmplus/nginx:ro"
Schritt 5:
Jetzt kann das Compose-Script ausgeführt werden:
docker compose up -d
Schritt 6:
Jetzt wird automatisch ein Passwort generiert, dieses muss über die Logs ausgelesen und gespeichert werden.
docker logs npmplus
Schritt 7:
Jetzt erstellen wir den Bouncer, mit welchem NPMplus und CrowdSec miteinander kommunizieren können. Es erfolgt die Ausgabe einen API-Keys, welcher gespeichert werden muss.
docker exec crowdsec cscli bouncers add npmplus -o raw
Schritt 8:
Der eben generierte API-Key wir nun in der Nachfolgenden Datei unter „API_KEY“ eingefügt.
Außerdem muss der Wert von „ENABLED“ auf „true“ geändert werden.
nano /opt/npmplus/crowdsec/crowdsec.conf
Schritt 9:
Nun werden die Container neugestartet:
docker compose restart
Schritt 10:
In den Logs von NPMplus sollte nun erkennbar sein, dass die Crowdsec-Integration richtig funktioniert.
In den Logs sollte ungefähr folgenden zu finden sein:
docker logs npmplus
2025/08/05 10:16:01 [error] 223#223: [lua] crowdsec.lua:130: init(): APPSEC is enabled on '127.0.0.1:7422'
2025/08/05 10:16:01 [alert] 223#223: [lua] crowdsec.conf:3):8: [Crowdsec] Initialisation done
Der Captcha Fehler kann ignoriert werden, diese hat keinen Einfluss auf die Funktion, kann aber Optional gesetzt werden.
Schritt 11:
Jetzt sollte im NPMplus Dashboard ein Proxy-Host zum testen erstellt werden. Dafür bietet diese Anleitung Hilfestellung.
Schritt 12:
Um nun zu testen, ob Crowdsec Funktioniert, bietet es sich an eine Externe IP zu blockieren und von diese zu versuchen auf einen Seite im Nginx Proxy Manager zuzugreifen. Dafür bietet sich die Nutzung eines VPNs an. Alternativ auch per Smartphone über das Mobilfunknetz.
docker exec crowdsec cscli decisions add --ip <IP-Addresse> --duration 15m --type ban
docker exec crowdsec cscli decisions list
Schritt 13:
Wenn alles geklappt hat, sollten nun noch interne Bereiche auf eine Whitelist gesetzt werden, damit Crowdsec diese nicht blockiert.
Mit diesen Befehlen werden interne Bereiche gewhitelistet:
docker exec crowdsec cscli allowlist create my_allowlist
docker exec crowdsec cscli allowlist add my_allowlist 192.168.0.0/16
docker exec crowdsec cscli allowlist add my_allowlist 172.16.0.0/12
docker exec crowdsec cscli allowlist add my_allowlist 10.0.0.0/8
docker exec crowdsec cscli allowlist add my_allowlist 127.0.0.1
docker exec crowdsec cscli allowlist inspect my_allowlist
Manchmal kommt es vor, dass Crowdsec die IP des eigenen PCs bereits blockiert hat. Wenn dies der Falls ist, kann die Blockierung so von Hand wieder gelöst werden:
docker exec crowdsec cscli decisions delete --ip <IP-Adresse>