7. Stack konfigurieren
7.1. docker-compose.yml-Datei
In diesem Schritt beginnen wir mit der Konfiguration unserer docker-compose.yml-Datei. Dafür verwenden wir den Texteditor nano. Um die Verwaltung unseres Stacks übersichtlicher zu gestalten, wird die Konfiguration in mehrere Abschnitte aufgeteilt. Jeder Abschnitt deckt einen bestimmten Teil der Stack-Konfiguration ab.
nano docker-compose.yml
Code-Sprache: Bash (bash)
Mit dem obigen Befehl öffnen wir den Editor nano die Datei docker-compose.yml.
Der Inhalt der Datei wird wie folgt strukturiert, indem wir verschiedene Konfigurationsdateien aus dem compose-Verzeichnis einbinden:
include:
- compose/crowdsec.yml
- compose/socket-proxy.yml
- compose/traefik.yml
- compose/networks.yml
Code-Sprache: YAML (yaml)
Jeder dieser Abschnitte bezieht sich auf eine spezifische Dienstkonfiguration innerhalb unseres Stacks und ermöglicht eine saubere und modulare Aufteilung.
7.2. compose-Dateien
In diesem Schritt befassen wir uns mit den einzelnen modularen Konfigurationsdateien im Verzeichnis compose/. Jede dieser Dateien enthält eine spezifische Konfiguration für die jeweiligen Dienste, die wir in unserem Stack verwenden. Durch die Aufteilung in mehrere Dateien wird die Verwaltung und Anpassung der einzelnen Dienste vereinfacht und die Übersichtlichkeit erhöht.
Die folgenden Dateien werden konfiguriert:
nano /opt/containers/traefik-crowdsec-stack/compose/crowdsec.yml
nano /opt/containers/traefik-crowdsec-stack/compose/socket-proxy.yml
nano /opt/containers/traefik-crowdsec-stack/compose/traefik.yml
nano /opt/containers/traefik-crowdsec-stack/compose/networks.yml
Code-Sprache: Bash (bash)
services:
crowdsec:
container_name: ${SERVICES_CROWDSEC_CONTAINER_NAME:-crowdsec}
env_file: ${ABSOLUTE_PATH}/data/crowdsec/.env
hostname: ${SERVICES_CROWDSEC_HOSTNAME:-crowdsec}
healthcheck:
test: ["CMD", "cscli", "version"]
timeout: 2s
interval: 20s
retries: 5
start_period: 10s
image: ${SERVICES_CROWDSEC_IMAGE:-crowdsecurity/crowdsec}:${SERVICES_CROWDSEC_IMAGE_VERSION:-latest}
networks:
crowdsec:
ipv4_address: ${SERVICES_CROWDSEC_NETWORKS_CROWDSEC_IPV4:-172.31.127.254}
ipv6_address: ${SERVICES_CROWDSEC_NETWORKS_CROWDSEC_IPV6:-fd00:1:be:a:7001:0:3e:6fff}
socket_proxy:
ipv4_address: ${SERVICES_TRAEFIK_NETWORKS_SOCKET_PROXY_IPV4:-172.31.255.252}
ipv6_address: ${SERVICES_TRAEFIK_NETWORKS_SOCKET_PROXY_IPV6:-fd00:1:be:a:7001:0:3e:8ffd}
restart: unless-stopped
security_opt:
- no-new-privileges=true
volumes:
- ${ABSOLUTE_PATH}/data/crowdsec/config:/etc/crowdsec
- ${ABSOLUTE_PATH}/data/crowdsec/data:/var/lib/crowdsec/data
- /var/log/auth.log:/var/log/auth.log:ro
- /var/log/traefik:/var/log/traefik:ro
Code-Sprache: YAML (yaml)
services:
socket-proxy:
container_name: ${SERVICES_SOCKET_PROXY_CONTAINER_NAME:-socket-proxy}
env_file: ${ABSOLUTE_PATH}/data/socket-proxy/.env
hostname: ${SERVICES_SOCKET_PROXY_HOSTNAME:-socket-proxy}
healthcheck:
test: ["CMD-SHELL", "wget -q --spider http://localhost:2375/_ping || exit 1"]
timeout: 3s
interval: 20s
retries: 3
start_period: 10s
image: ${SERVICES_SOCKET_PROXY_IMAGE:-lscr.io/linuxserver/socket-proxy}:${SERVICES_SOCKET_PROXY_IMAGE_VERSION:-latest}
networks:
socket_proxy:
ipv4_address: ${SERVICES_SOCKET_PROXY_NETWORKS_SOCKET_PROXY_IPV4:-172.31.255.254}
ipv6_address: ${SERVICES_SOCKET_PROXY_NETWORKS_SOCKET_PROXY_IPV6:-fd00:1:be:a:7001:0:3e:8fff}
read_only: true
restart: unless-stopped
tmpfs:
- /run
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
Code-Sprache: YAML (yaml)
services:
traefik:
container_name: ${SERVICES_TRAEFIK_CONTAINER_NAME:-traefik}
depends_on:
crowdsec:
condition: service_healthy
socket-proxy:
condition: service_healthy
env_file: ${ABSOLUTE_PATH}/data/traefik/.env
hostname: ${SERVICES_TRAEFIK_HOSTNAME:-traefik}
healthcheck:
test: ["CMD", "traefik", "healthcheck", "--ping"]
timeout: 1s
interval: 10s
retries: 3
start_period: 10s
image: ${SERVICES_TRAEFIK_IMAGE:-traefik}:${SERVICES_TRAEFIK_IMAGE_VERSION:-3.6}
networks:
crowdsec:
ipv4_address: ${SERVICES_TRAEFIK_NETWORKS_CROWDSEC_IPV4:-172.31.127.253}
ipv6_address: ${SERVICES_TRAEFIK_NETWORKS_CROWDSEC_IPV6:-fd00:1:be:a:7001:0:3e:6ffe}
proxy:
ipv4_address: ${SERVICES_TRAEFIK_NETWORKS_PROXY_IPV4:-172.31.191.254}
ipv6_address: ${SERVICES_TRAEFIK_NETWORKS_PROXY_IPV6:-fd00:1:be:a:7001:0:3e:7fff}
socket_proxy:
ipv4_address: ${SERVICES_TRAEFIK_NETWORKS_SOCKET_PROXY_IPV4:-172.31.255.253}
ipv6_address: ${SERVICES_TRAEFIK_NETWORKS_SOCKET_PROXY_IPV6:-fd00:1:be:a:7001:0:3e:8ffe}
ports:
- mode: host
target: 80
published: "80"
protocol: tcp
- mode: host
target: 443
published: "443"
protocol: tcp
- mode: host
target: 443
published: "443"
protocol: udp
restart: unless-stopped
security_opt:
- no-new-privileges:true
volumes:
- /etc/localtime:/etc/localtime:ro
- ${ABSOLUTE_PATH}/data/traefik/traefik.yml:/etc/traefik/traefik.yml
- ${ABSOLUTE_PATH}/data/traefik/.htpasswd:/etc/traefik/.htpasswd
- ${ABSOLUTE_PATH}/data/traefik/certs/acme_letsencrypt.json:/etc/traefik/acme_letsencrypt.json
- ${ABSOLUTE_PATH}/data/traefik/certs/tls_letsencrypt.json:/etc/traefik/tls_letsencrypt.json
- ${ABSOLUTE_PATH}/data/traefik/dynamic_conf:/etc/traefik/dynamic_conf:ro
- /var/log/traefik/:/var/log/traefik/
Code-Sprache: JavaScript (javascript)
networks:
crowdsec:
name: ${NETWORKS_CROWDSEC_NAME:-crowdsec}
driver: bridge
enable_ipv6: true
ipam:
driver: default
config:
- subnet: ${NETWORKS_CROWDSEC_SUBNET_IPV4:-172.31.64.0/18}
- subnet: ${NETWORKS_CROWDSEC_SUBNET_IPV6:-fd00:1:be:a:7001:0:3e:6000/116}
attachable: true
proxy:
name: ${NETWORKS_PROXY_NAME:-proxy}
driver: bridge
enable_ipv6: true
ipam:
driver: default
config:
- subnet: ${NETWORKS_PROXY_SUBNET_IPV4:-172.31.128.0/18}
- subnet: ${NETWORKS_PROXY_SUBNET_IPV6:-fd00:1:be:a:7001:0:3e:7000/116}
attachable: true
socket_proxy:
name: ${NETWORKS_SOCKET_PROXY_NAME:-socket_proxy}
driver: bridge
enable_ipv6: true
ipam:
driver: default
config:
- subnet: ${NETWORKS_SOCKET_PROXY_SUBNET_IPV4:-172.31.192.0/18}
- subnet: ${NETWORKS_SOCKET_PROXY_SUBNET_IPV6:-fd00:1:be:a:7001:0:3e:8000/116}
attachable: true
internal: true
Code-Sprache: YAML (yaml)
7.3. DOTENV anpassen
In diesem Schritt passen wir die .env-Datei für unsere spezifischen Anforderungen an. Im Rahmen dieses Projekts haben wir mehrere .env-Dateien erstellt, um die Konfigurationen flexibel und servicebezogen anpassen zu können. Dies ermöglicht uns, die Einstellungen für jeden Dienst gezielt zu verwalten und bei Bedarf zu modifizieren.
7.3.1. Allgemeine .env-Datei
Zunächst bearbeiten wir die allgemeine .env-Datei, die sich im Hauptverzeichnis unseres Projekts befindet:
nano /opt/containers/traefik-crowdsec-stack/.envCode-Sprache: Bash (bash)
# Auf einigen Systemen kann die Verwendung von ABSOLUTE_PATH=${PWD} zu Problemen führen.
# In diesem Fall empfiehlt es sich, den Pfad explizit zu setzen, z. B.:
# ABSOLUTE_PATH=/opt/containers/traefik-crowdsec-stack
ABSOLUTE_PATH=${PWD}
TZ=Europe/Berlin
SERVICES_TRAEFIK_IMAGE_VERSION=3.6
SERVICES_TRAEFIK_LABELS_TRAEFIK_HOST=HOST(`unserewunschdomain.de`)
Code-Sprache: Bash (bash)
Erklärung der Konfiguration:
- ABSOLUTE_PATH=${PWD}
Dieser Wert wird automatisch auf das aktuelle Arbeitsverzeichnis gesetzt und ermöglicht die Verwendung dynamischer Pfade innerhalb des Projekts. Auf manchen Systemen kann es sinnvoll sein, den Pfad statisch zu setzen (z. B./opt/containers/traefik-crowdsec-stack), um potenzielle Probleme mit der Pfadauflösung zu vermeiden. - TZ=Europe/Berlin
Die Zeitzone wird auf Mitteleuropäische Zeit (CET/CEST) festgelegt. Dadurch stellen wir sicher, dass alle zeitbasierten Aktionen, Logs und Zertifikatslaufzeiten korrekt auf die deutsche Zeitzone abgestimmt sind. - SERVICES_TRAEFIK_IMAGE_VERSION=3.6
Diese Variable ist für die Funktion der Konfiguration nicht zwingend erforderlich. Sie wird dennoch bewusst definiert, um transparent festzuhalten, welche Traefik-Version eingesetzt wird. Gleichzeitig erleichtert sie spätere Updates, da die verwendete Version zentral an einer Stelle angepasst werden kann. - SERVICES_TRAEFIK_LABELS_TRAEFIK_HOST=HOST(`unserewunschdomain.de`)
Hier definieren wir den Hostnamen, unter dem Traefik erreichbar sein soll. Ob wir eine Second-Level-Domain oder eine Third-Level-Domain verwenden, bleibt dabei offen. Wichtig ist die korrekte Notation mit Backticks (`), damit Traefik die Regel korrekt interpretiert und Anfragen zuverlässig an die vorgesehenen Services weiterleitet.
Hinweis:
Wir beschränken uns bewusst darauf, nur die nötigsten Variablen in der allgemeinen .env-Datei zu definieren. Zusätzliche Variablen, die in spezifischen compose-Dateien verwendet werden, nehmen wir hier nicht auf, um die Konfiguration schlank und übersichtlich zu halten. Diese zusätzlichen Variablen werden nur bei Bedarf in den jeweiligen Dienst-Konfigurationsdateien gesetzt.
7.3.2. .env-Datei für CrowdSec
Im nächsten Schritt passen wir die .env-Datei von CrowdSec an, um unsere spezifischen Anforderungen und Konfigurationen für den CrowdSec-Container festzulegen. Diese Datei steuert wichtige Einstellungen für den Betrieb von CrowdSec.
Wir öffnen die Datei mit dem folgenden Befehl:
nano /opt/containers/traefik-crowdsec-stack/data/crowdsec/.envCode-Sprache: Bash (bash)
TZ=$TZ
# Zugriff auf Docker-Socket-Proxy
DOCKER_HOST=tcp://socket-proxy:2375
# Bouncers
BOUNCER_KEY_TRAEFIK=$BOUNCER_KEY_TRAEFIK
BOUNCER_KEY_FIREWALL=$BOUNCER_KEY_FIREWALL
# Hub
NO_HUB_UPGRADE="false" # Überspringen des Updates via Hub / Upgrade beim Start des Containers
COLLECTIONS="crowdsecurity/linux crowdsecurity/traefik" # Sammlungen (Collections), die installiert werden sollen, getrennt durch Leerzeichen: COLLECTIONS="crowdsecurity/linux crowdsecurity/traefik"
# PARSERS="" # Parser, die installiert werden sollen, getrennt durch Leerzeichen.
# SCENARIOS="" # Szenarien, die installiert werden sollen, getrennt durch Leerzeichen.
# POSTOVERFLOWS="" # Postoverflows, die installiert werden sollen, getrennt durch Leerzeichen.
# CONTEXTS="" # Kontextdateien, die installiert werden sollen, getrennt durch Leerzeichen.
# APPSEC_CONFIGS="" # AppSec-Konfigurationsdateien, die installiert werden sollen, getrennt durch Leerzeichen.
# APPSEC_RULES="" # AppSec-Regeln, die installiert werden sollen, getrennt durch Leerzeichen.
# DISABLE_COLLECTIONS="" # Sammlungen, die entfernt werden sollen, getrennt durch Leerzeichen: DISABLE_COLLECTIONS="crowdsecurity/linux crowdsecurity/nginx"
# DISABLE_PARSERS="" # Parser, die entfernt werden sollen, getrennt durch Leerzeichen.
# DISABLE_SCENARIOS="" # Szenarien, die entfernt werden sollen, getrennt durch Leerzeichen.
# DISABLE_POSTOVERFLOWS="" # Postoverflows, die entfernt werden sollen, getrennt durch Leerzeichen.
# DISABLE_CONTEXTS="" # Kontextdateien, die entfernt werden sollen, getrennt durch Leerzeichen.
# DISABLE_APPSEC_CONFIGS="" # AppSec-Konfigurationsdateien, die entfernt werden sollen, getrennt durch Leerzeichen.
# DISABLE_APPSEC_RULES="" # AppSec-Regeln, die entfernt werden sollen, getrennt durch Leerzeichen.
# Log-Verbosity
# LEVEL_FATAL=false # Erzwingen des FATAL-Protokollierungslevels für die Container-Protokolle.
# LEVEL_ERROR=false # Erzwingen des ERROR-Protokollierungslevels für die Container-Protokolle.
# LEVEL_WARN=false # Erzwingen des WARN-Protokollierungslevels für die Container-Protokolle.
# LEVEL_INFO=false # Erzwingen des INFO-Protokollierungslevels für die Container-Protokolle.
# LEVEL_DEBUG=false # Erzwingen des DEBUG-Protokollierungslevels für die Container-Protokolle.
# LEVEL_TRACE=false # Erzwingen des TRACE-Protokollierungslevels (sehr ausführlich) für die Container-Protokolle.
Code-Sprache: Bash (bash)
- TZ: Hier wird die Zeitzone festgelegt, die auf die allgemeine Zeitzoneneinstellung des Systems ($TZ) verweist.
- NO_HUB_UPGRADE: Legt fest, ob automatische Updates über den CrowdSec Hub beim Start des Containers durchgeführt werden sollen.
- COLLECTIONS: Hier definieren wir, welche Sammlungen (z. B. für traefik oder linux) automatisch installiert werden sollen.
- Log-Verbosity: Ermöglicht das Einstellen der Protokollierungsstufen für den Container, um detaillierte Informationen über den Zustand und mögliche Fehler des Containers zu erhalten.
Optionale Einstellungen wie Parser, Szenarien oder AppSec-Regeln können nach Bedarf angepasst oder hinzugefügt werden, um spezifische Sicherheitsanforderungen abzudecken.
7.3.3. .env-Datei für den Socket-Proxy
Nun passen wir die .env-Datei für den Socket-Proxy an. Diese Datei befindet sich im Verzeichnis data/socket-proxy/.env. Da das Docker-Image des Socket-Proxy kein tzdata-Paket enthält, ist es hier nicht nötig, die Zeitzone (TZ) anzugeben. Stattdessen konzentrieren wir uns auf die spezifischen Konfigurationsoptionen für den Socket-Proxy.
Öffne die Datei zur Bearbeitung:
nano /opt/containers/traefik-crowdsec-stack/data/socket-proxy/.envCode-Sprache: Bash (bash)
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
Erklärung der Konfiguration:
- INFO=1: Aktiviert grundlegende Informationen für den Socket-Proxy.
- CONTAINERS=1: Aktiviert die Unterstützung für Container.
- POST=0, BUILD=0, COMMIT=0, usw.: Diese Optionen deaktivieren bestimmte Funktionen, die für diesen Proxy-Dienst nicht benötigt werden.
Durch das Setzen dieser Umgebungsvariablen können wir die Funktionen und das Verhalten des Socket-Proxy-Dienstes gezielt steuern.
7.3.4. .env-Datei für Traefik
Nun passen wir die .env-Datei für den Traefik-Dienst an. Diese Datei befindet sich im Verzeichnis data/traefik/.env. Hier wird die Zeitzoneneinstellung (TZ) festgelegt, die für die allgemeine Konfiguration von Traefik benötigt wird.
Öffne die Datei zur Bearbeitung:
nano /opt/containers/traefik-crowdsec-stack/data/traefik/.envCode-Sprache: Bash (bash)
TZ=$TZ
SERVICES_TRAEFIK_LABELS_TRAEFIK_HOST=${SERVICES_TRAEFIK_LABELS_TRAEFIK_HOST}
Code-Sprache: Bash (bash)
Erklärung der Konfiguration:
- TZ=$TZ: Hier wird die globale Zeitzoneneinstellung (
$TZ) verwendet, die in der allgemeinen.env-Datei des Projekts definiert wurde. Diese Einstellung stellt sicher, dass Traefik die gleiche Zeitzone wie die anderen Dienste verwendet.
Mit dieser Konfiguration bleibt der Traefik-Dienst konsistent in Bezug auf Zeitzoneneinstellungen, was wichtig ist, um Logs und zeitbasierte Aktionen richtig zu synchronisieren.
7.3.5. API Key für das Traefik CrowdSec Plugin
Um den API-Schlüssel für das Traefik CrowdSec Plugin zu generieren, verwenden wir einen sicheren Schlüssel, der mit openssl erstellt wird. Dieser Schlüssel wird sowohl in der .env-Datei gespeichert als auch im Terminal angezeigt, damit er bei Bedarf kopiert werden kann.
Führe die folgenden Befehle aus, um den API-Schlüssel zu generieren:
CROWDSEC_PLUGIN_PASSWORD=$(openssl rand -base64 48 | tr -dc 'a-zA-Z0-9!@#$%^&*()-_=+[]{}<>?|')
echo "BOUNCER_KEY_TRAEFIK=\"$CROWDSEC_PLUGIN_PASSWORD\"" >> /opt/containers/traefik-crowdsec-stack/.env
echo "Generated BOUNCER_KEY_TRAEFIK: $CROWDSEC_PLUGIN_PASSWORD"
Code-Sprache: Bash (bash)
Erklärung der Schritte:
- CROWDSEC_PLUGIN_PASSWORD=$(openssl rand -base64 48 | tr -dc ‘a-zA-Z0-9!@#$%^&*()-_=+[]{}<>?|’):
- Mit diesem Befehl wird ein komplexes, sicheres Passwort generiert, das 48 Zeichen lang ist und eine Kombination aus Groß- und Kleinbuchstaben, Zahlen und Sonderzeichen enthält.
- echo “BOUNCER_KEY_TRAEFIK=\”$CROWDSEC_PLUGIN_PASSWORD\”” >> /opt/containers/traefik-crowdsec-stack/.env:
- Das generierte Passwort wird als
BOUNCER_KEY_TRAEFIKin die.env-Datei geschrieben, um es für den Traefik Bouncer zu speichern.
- Das generierte Passwort wird als
- echo “Generated BOUNCER_KEY_TRAEFIK: $CROWDSEC_PLUGIN_PASSWORD”:
- Der generierte API-Schlüssel wird im Terminal ausgegeben, sodass er vom Benutzer kopiert und an anderer Stelle verwendet werden kann.
7.4. Traefik konfigurieren
7.4.1. Konfiguration der traefik.yml
In diesem Abschnitt widmen wir uns der statischen Konfiguration von Traefik in der Datei traefik.yml. Diese Datei definiert die grundlegenden Einstellungen für den Traefik-Dienst, wie API-Zugriff, Protokolle, ACME-Zertifikate und Netzwerkeinstellungen.
Öffne die Konfigurationsdatei mit folgendem Befehl:
nano /opt/containers/traefik-crowdsec-stack/data/traefik/traefik.ymlCode-Sprache: Bash (bash)
api:
dashboard: true
metrics:
prometheus:
addRoutersLabels: true
certificatesResolvers:
http_resolver:
acme:
email: "deine@email.de"
storage: "/etc/traefik/acme_letsencrypt.json"
httpChallenge:
entryPoint: web
tls_resolver:
acme:
email: "deine@email.de"
storage: "/etc/traefik/tls_letsencrypt.json"
tlsChallenge: {}
entryPoints:
ping:
address: ':88'
web:
address: ':80'
http:
redirections:
entryPoint:
to: websecure
scheme: https
websecure:
address: ':443'
http3: {}
http:
middlewares:
- crowdsec@file
- default@file
ping:
entryPoint: "ping"
global:
checknewversion: true
sendanonymoususage: false
providers:
docker:
endpoint: "tcp://socket-proxy:2375"
exposedByDefault: false
network: "proxy"
file:
directory: "/etc/traefik/dynamic_conf"
watch: true
providersThrottleDuration: 10s
log:
level: WARN
filePath: "/var/log/traefik/traefik.log"
format: json
maxSize: 10
maxBackups: 10
maxAge: 14
accessLog:
format: json
filePath: "/var/log/traefik/access.log"
fields:
defaultMode: keep
names:
ClientUsername: drop
headers:
defaultMode: keep
names:
# ✅ Security-essentiell:
User-Agent: keep
X-Forwarded-For: keep
X-Real-IP: keep
CF-Connecting-IP: keep
Referer: keep
Content-Type: keep
Accept: keep
# ✅ KRITISCH: REDACT statt DROP
Authorization: redact # Zeigt "REDACTED" wenn Header vorhanden
Cookie: redact # Zeigt "REDACTED" wenn Cookie vorhanden
Set-Cookie: redact
experimental:
plugins:
bouncer:
moduleName: github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin
version: v1.4.6
Code-Sprache: YAML (yaml)
Erklärung der Konfiguration:
- API und Dashboard:
api.dashboard: true: Aktiviert das Traefik-Dashboard, welches über die API bereitgestellt wird.
- Metrics:
metrics.prometheus.addRoutersLabels: true: Aktiviert Prometheus-Metriken und fügt Router-Labels hinzu.
- Zertifikatsresolver (Let’s Encrypt):
certificatesResolvers: Hier konfigurieren wir zwei Resolver:- http_resolver für HTTP-Challenges mit Let’s Encrypt.
- tls_resolver für TLS-Challenges mit Let’s Encrypt.
- E-Mail-Adresse: Passe die E-Mail-Adresse unter beiden Resolvers an, da diese von Let’s Encrypt verwendet wird. Wichtig: Beide Resolver müssen die gleiche E-Mail-Adresse verwenden, um Fehler zu vermeiden.
- Entry Points:
- web: Der HTTP-Eingangspunkt auf Port 80 leitet alle Anfragen per HTTPS weiter (über
websecure). - websecure: HTTPS-Eingangspunkt auf Port 443
- ping: Ein spezieller Ping-Endpoint auf Port 88 zur Gesundheitsüberwachung.
- web: Der HTTP-Eingangspunkt auf Port 80 leitet alle Anfragen per HTTPS weiter (über
- Global:
checknewversion: true: Aktiviert die Überprüfung auf neue Versionen von Traefik.sendanonymoususage: false: Deaktiviert das Senden von anonymen Nutzungsdaten.
- Providers:
- Docker: Konfiguriert den Docker-Provider für die automatische Erkennung von Diensten über einen Socket-Proxy.
- File: Aktiviert die Dateikonfiguration über ein Verzeichnis für dynamische Konfigurationen.
- Log- und Access-Log-Einstellungen:
- Log: Legt das Log-Level auf
INFOfest und gibt den Speicherort der Logs an. - AccessLog: Aktiviert das Access-Log und speichert es in der angegebenen Datei. Bestimmte Felder wie
StartUTCwerden ausgeblendet.
- Log: Legt das Log-Level auf
Wichtiger Hinweis:
Die E-Mail-Adresse unter certificatesResolvers muss für beide Resolver identisch sein. Sollten zwei verschiedene E-Mail-Adressen verwendet werden, führt dies zu einem Fehler:
traefik.go:81: command traefik error: unable to initialize certificates resolver "tls_resolver", all the acme resolvers must use the same emailCode-Sprache: Bash (bash)
Daher ist es wichtig, dass du die E-Mail-Adresse korrekt anpasst und beide Resolver auf die gleiche Adresse setzen, um Let’s Encrypt zu nutzen.
7.4.2. Konfiguration von TLS
In diesem Schritt konfigurieren wir die TLS-Einstellungen in der Datei tls.yml, um die Sicherheitsstandards für die HTTPS-Kommunikation in Traefik festzulegen. Diese Datei befindet sich im Verzeichnis data/traefik/dynamic_conf/.
Öffne die Datei zur Bearbeitung:
nano /opt/containers/traefik-crowdsec-stack/data/traefik/dynamic_conf/tls.ymlCode-Sprache: Bash (bash)
tls:
options:
default:
minVersion: VersionTLS12
cipherSuites:
- TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
- TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
- TLS_AES_128_GCM_SHA256
- TLS_AES_256_GCM_SHA384
- TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
curvePreferences:
- CurveP521
- CurveP384
sniStrict: true
Code-Sprache: YAML (yaml)
Erklärung der Konfiguration:
- minVersion: VersionTLS12: Diese Option legt fest, dass Traefik nur TLS-Verbindungen ab Version 1.2 zulässt. Dies sorgt für eine erhöhte Sicherheit, da ältere TLS-Versionen wie 1.0 und 1.1 als unsicher gelten.
- cipherSuites: Hier werden die bevorzugten Cipher-Suiten festgelegt. Dies sind Algorithmen, die für die Verschlüsselung von Verbindungen verwendet werden. Die aufgelisteten Suiten bieten eine hohe Sicherheit und sind weit verbreitet.
- curvePreferences: Die bevorzugten elliptischen Kurven werden hier definiert. Diese werden in der TLS-Verschlüsselung verwendet und bieten eine starke kryptografische Sicherheit. Die Kurven
CurveP521undCurveP384werden bevorzugt. - sniStrict: true: Diese Option aktiviert den SNI (Server Name Indication)-Modus und erzwingt, dass der Hostname bei TLS-Verbindungen übereinstimmen muss. Dies erhöht die Sicherheit, da die Verbindung nur zustande kommt, wenn der angeforderte Hostname korrekt ist.
Diese Konfiguration sorgt dafür, dass die HTTPS-Verbindungen in deinem Traefik-Setup mit hohen Sicherheitsstandards verschlüsselt und abgesichert werden.
7.4.3. Konfiguration von http.middlewares.*
In diesem Abschnitt konfigurieren wir die HTTP-Middlewares, die Traefik zur Sicherung und Optimierung der Webanfragen verwenden soll. Diese Konfiguration wird in der Datei http.middlewares.default.yml definiert und enthält wichtige Sicherheits-Header sowie eine Komprimierungsoption für HTTP-Antworten. Die Middleware „default“ wird standardmäßig für die web und websecure EntryPoints in der traefik.yml geladen. Um der Granularität weiter zu folgend werden wir die einzelnen Middlewares auch einzeln ablegen.
Öffne die Datei zur Bearbeitung:
nano /opt/containers/traefik-crowdsec-stack/data/traefik/dynamic_conf/http.middlewares.crowdsec.plugin.yml
nano /opt/containers/traefik-crowdsec-stack/data/traefik/dynamic_conf/http.middlewares.default-security-headers.yml
nano /opt/containers/traefik-crowdsec-stack/data/traefik/dynamic_conf/http.middlewares.default.yml
nano /opt/containers/traefik-crowdsec-stack/data/traefik/dynamic_conf/http.middlewares.gzip.yml
nano /opt/containers/traefik-crowdsec-stack/data/traefik/dynamic_conf/http.routers.traefik-dashboard.yml
Code-Sprache: Bash (bash)
http:
middlewares:
crowdsec:
plugin:
bouncer:
enabled: true
defaultDecisionSeconds: 60
crowdsecMode: live
crowdsecAppsecEnabled: false
crowdsecAppsecHost: crowdsec:7422
crowdsecAppsecFailureBlock: true
crowdsecAppsecUnreachableBlock: true
crowdsecLapiKey:
crowdsecLapiHost: crowdsec:8080
crowdsecLapiScheme: http
crowdsecLapiTLSInsecureVerify: false
forwardedHeadersTrustedIPs:
# private class ranges
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
clientTrustedIPs:
# private class ranges
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
Code-Sprache: YAML (yaml)
http:
middlewares:
default-security-headers:
headers:
browserXssFilter: true
contentTypeNosniff: true
forceSTSHeader: true
frameDeny: true
stsIncludeSubdomains: true
stsPreload: true
stsSeconds: 31536000
customFrameOptionsValue: "SAMEORIGIN"
customResponseHeaders:
Referrer-Policy: "strict-origin-when-cross-origin"
Content-Security-Policy: "frame-ancestors 'self';"
Permissions-Policy: "geolocation=(), microphone=(), camera=()"
Code-Sprache: YAML (yaml)
http:
middlewares:
default:
chain:
middlewares:
- default-security-headers
- gzip
Code-Sprache: YAML (yaml)
http:
middlewares:
gzip:
compress: {}
Code-Sprache: YAML (yaml)
http:
routers:
traefik-dashboard:
entrypoints: websecure
middlewares: traefik-dashboard-auth@file
rule: {{ env "SERVICES_TRAEFIK_LABELS_TRAEFIK_HOST" }}
service: api@internal
tls:
certresolver: tls_resolver
Code-Sprache: YAML (yaml)
Erklärung der Konfiguration:
- default:
- Dies ist die Hauptmiddleware, die in der
traefik.ymlals Standard-Middleware für diewebundwebsecureEntryPoints verwendet wird. Sie besteht aus einer Kette (chain) von Middlewares:- default-security-headers: Fügt Sicherheits-Header zu allen HTTP-Antworten hinzu.
- gzip: Komprimiert HTTP-Antworten, um die Datenübertragung zu optimieren.
- Dies ist die Hauptmiddleware, die in der
- default-security-headers:
- browserXssFilter: true: Aktiviert den Browser XSS-Schutz (Cross-Site-Scripting).
- contentTypeNosniff: true: Verhindert, dass der Browser den Dateityp anhand des Inhalts rät.
- forceSTSHeader: true: Aktiviert den HSTS (HTTP Strict Transport Security)-Header, der Browser anweist, nur HTTPS-Verbindungen zuzulassen.
- frameDeny: true: Verhindert das Laden der Seite in einem
<frame>oder<iframe>, um Clickjacking-Angriffe zu verhindern. - stsIncludeSubdomains: true: Erzwingt HSTS auch für alle Subdomains.
- stsPreload: true: Signalisiert, dass diese Seite in die HSTS-Preload-Liste aufgenommen werden kann, sodass HSTS auch ohne den ersten HTTP-Aufruf greift.
- stsSeconds: 31536000: Setzt die Gültigkeit des HSTS-Headers auf ein Jahr (31536000 Sekunden).
- customFrameOptionsValue: “SAMEORIGIN”: Erlaubt das Einbetten von Inhalten nur innerhalb der eigenen Domain (
SAMEORIGIN). - customResponseHeaders – Referrer-Policy: “strict-origin-when-cross-origin“
Steuert, welche Referrer-Informationen an externe Seiten übermittelt werden, und reduziert so die Weitergabe sensibler URL-Daten. - customResponseHeaders – Content-Security-Policy: “frame-ancestors ‘self’;”
Legt fest, dass diese Seite ausschließlich von der eigenen Domain in Frames eingebettet werden darf. Dies bietet einen zusätzlichen Schutz gegen Clickjacking. - customResponseHeaders – Permissions-Policy: “geolocation=(), microphone=(), camera=()”
Deaktiviert den Zugriff auf sensible Browser-APIs wie Standort, Mikrofon und Kamera und reduziert so die Angriffsfläche der Anwendung.
- gzip:
- compress: {}: Aktiviert die GZIP-Komprimierung für HTTP-Antworten, was die Übertragungsgeschwindigkeit optimiert, indem die Daten komprimiert werden.
Wichtig:
Die Middleware „default“ wird in der traefik.yml an die web und websecure EntryPoints angehängt und standardmäßig bei Anfragen über diese Endpunkte mitgeladen. Diese Konfiguration sorgt dafür, dass alle Anfragen über HTTPS gesichert und optimiert werden, und fügt wichtige Sicherheitsmaßnahmen wie XSS-Schutz und HSTS hinzu.
7.4.4. Konfiguration des CrowdSec LAPI-Keys
Wir binden jetzt den API-Key ein, den wir zuvor in 7.3.5. “API Key für das Traefik CrowdSec Plugin” als Variable CROWDSEC_PLUGIN_PASSWORD erzeugt haben. Dieser Key muss in der Datei http.middlewares.crowdsec.plugin.yml bei crowdsecLapiKey: hinterlegt werden, damit das Traefik-Plugin sich gegenüber der CrowdSec LAPI authentifizieren kann.
Damit wir nichts manuell in YAML tippen müssen, setzen wir den Wert automatisiert per sed:
sed -i "s|^\([[:space:]]*crowdsecLapiKey:\).*|\1 $CROWDSEC_PLUGIN_PASSWORD|" \
/opt/containers/traefik-crowdsec-stack/data/traefik/dynamic_conf/http.middlewares.crowdsec.plugin.ymlCode-Sprache: Bash (bash)
Anschließend prüfen wir, ob der Key korrekt in der Datei gelandet ist:
grep -n "crowdsecLapiKey:" /opt/containers/traefik-crowdsec-stack/data/traefik/dynamic_conf/http.middlewares.crowdsec.plugin.ymlCode-Sprache: Bash (bash)
Wenn dabei kein Wert angezeigt wird oder der Eintrag nicht wie erwartet gesetzt ist, setzen wir den Key nicht erneut per Variable, sondern übernehmen ihn direkt aus der .env-Datei.
Dazu öffnen wir zuerst die .env und kopieren den Wert von CROWDSEC_PLUGIN_PASSWORD:
nano /opt/containers/traefik-crowdsec-stack/.envCode-Sprache: Bash (bash)
# Auf einigen Systemen kann die Verwendung von ABSOLUTE_PATH=${PWD} zu Problemen führen.
# In diesem Fall empfiehlt es sich, den Pfad explizit zu setzen, z. B.:
# ABSOLUTE_PATH=/opt/containers/traefik-crowdsec-stack
ABSOLUTE_PATH=${PWD}
TZ=Europe/Berlin
SERVICES_TRAEFIK_IMAGE_VERSION=3.6
SERVICES_TRAEFIK_LABELS_TRAEFIK_HOST=HOST(`unserewunschdomain.de`)
BOUNCER_KEY_TRAEFIK="2U7aK/fqyqORQnL/TM1Iq3mGoJMmF9hL7BfYqROu0DuaAeMray+k69fC7leVyMAB"
Code-Sprache: Bash (bash)
Anschließend öffnen wir die Middleware-Konfiguration und tragen den Wert manuell bei crowdsecLapiKey: ein:
nano /opt/containers/traefik-crowdsec-stack/data/traefik/dynamic_conf/http.middlewares.crowdsec.plugin.ymlCode-Sprache: Bash (bash)
Der Eintrag sieht dann beispielhaft so aus:
http:
middlewares:
crowdsec:
plugin:
bouncer:
enabled: true
defaultDecisionSeconds: 60
crowdsecMode: live
crowdsecAppsecEnabled: false
crowdsecAppsecHost: crowdsec:7422
crowdsecAppsecFailureBlock: true
crowdsecAppsecUnreachableBlock: true
crowdsecLapiKey: 2U7aK/fqyqORQnL/TM1Iq3mGoJMmF9hL7BfYqROu0DuaAeMray+k69fC7leVyMAB
crowdsecLapiHost: crowdsec:8080
crowdsecLapiScheme: http
crowdsecLapiTLSInsecureVerify: false
forwardedHeadersTrustedIPs:
# private class ranges
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
clientTrustedIPs:
# private class ranges
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
Code-Sprache: YAML (yaml)
Damit steht der zuvor generierte Key an der richtigen Stelle und das CrowdSec-Plugin kann anschließend zuverlässig mit der LAPI kommunizieren.
7.4.5. Konfiguration von http.middlewares.traefik-dashboard-auth.yml
In diesem Schritt fügen wir eine Basic-Auth-Authentifizierung für das Traefik-Dashboard hinzu. Diese Konfiguration schützt den Zugriff auf das Dashboard mithilfe eines Passworts, das in einer .htpasswd-Datei gespeichert wird.
Erstelle die Datei http.middlewares.traefik-dashboard-auth.yml:
nano /opt/containers/traefik-crowdsec-stack/data/traefik/dynamic_conf/http.middlewares.traefik-dashboard-auth.ymlCode-Sprache: Bash (bash)
http:
middlewares:
traefik-dashboard-auth:
basicAuth:
realm: "Traefik Dashboard"
usersFile: "/etc/traefik/.htpasswd"
Code-Sprache: YAML (yaml)
Erklärung der Konfiguration:
- traefik-dashboard-auth: Diese Middleware implementiert eine Basic-Auth-Authentifizierung für das Traefik-Dashboard.
- basicAuth:
- realm: Der Authentifizierungsbereich wird als “Traefik Dashboard” festgelegt.
- usersFile: Der Pfad zur .htpasswd-Datei, die die Benutzername-Passwort-Kombinationen enthält.
- basicAuth:
7.4.6. Passwort für Traefik-Dashboard festlegen
Um die Benutzername-Passwort-Kombination für die Basic-Auth festzulegen, müssen wir .htpasswd-Datei mit Informationen füttern. Zuerst überprüfen wir ob der Befehl verfügbar ist und installieren die notwendigen Pakete:
command -v htpasswd >/dev/null 2>&1 || apt update && apt install -y apache2-utilsCode-Sprache: Bash (bash)
Nun generieren wir für unseren Benutzer ein Passwort und schreiben es in unsere .htpasswd-Datei:
htpasswd /opt/containers/traefik-crowdsec-stack/data/traefik/.htpasswd <deinBenutzername>Code-Sprache: Bash (bash)
Benutzername und Passwort sind “case-sensitive”, das bedeutet, Groß- und Kleinschreibung müssen exakt übereinstimmen. Wir können mit dem genannten Befehl jederzeit beliebig viele Nutzer zur .htpasswd-Datei hinzufügen. Allerdings müssen wir, wenn Traefik bereits läuft, den Container neu starten, damit die Änderungen wirksam werden.
Am Ende ergänzen wir noch die Middleware-Einbindung im Router für das Traefik-Dashboard. Das Passwort liegt zwar bereits in der .htpasswd, wir müssen aber sicherstellen, dass die Basic-Auth-Middleware auch tatsächlich am Dashboard-Router aktiviert ist.
Damit wird das Traefik-Dashboard zusätzlich zur Standard-Konfiguration (default@file) auch über Basic Auth (traefik-dashboard-auth@file) abgesichert.
nano /opt/containers/traefik-crowdsec-stack/data/traefik/dynamic_conf/http.routers.traefik-dashboard.ymlCode-Sprache: Bash (bash)
http:
routers:
traefik-dashboard:
entrypoints: websecure
middlewares: traefik-dashboard-auth@file
rule: {{ env "SERVICES_TRAEFIK_LABELS_TRAEFIK_HOST" }}
service: api@internal
tls:
certresolver: tls_resolver
Code-Sprache: YAML (yaml)
Es wird euch möglicherweise auffallen, dass die Middleware bereits in der Konfiguration enthalten ist. Das ist bewusst so gewählt, da nicht jeder die Anleitung vollständig von Anfang bis Ende durcharbeitet. Gerade erfahrene Nutzer überspringen einzelne Schritte gezielt, sodass die Konfiguration auch in diesen Fällen konsistent und funktionsfähig bleibt.
7.4.7. Integration des Bouncers in traefik.yml
Damit der Bouncer standardgemäß aktiv Anfragen überprüfen kann, müssen wir die traefik.yml bearbeiten und die Middleware zu den web und websecure EntryPoints hinzufügen.
Öffne die traefik.yml zur Bearbeitung:
nano /opt/containers/traefik-crowdsec-stack/data/traefik/traefik.ymlCode-Sprache: Bash (bash)
Füge in den Einträgen web und websecure die crowdsec-Middleware hinzu. Die Konfiguration sollte folgendermaßen aussehen:
api:
dashboard: true
metrics:
prometheus:
addRoutersLabels: true
certificatesResolvers:
http_resolver:
acme:
email: "deine@email.de"
storage: "/etc/traefik/acme_letsencrypt.json"
httpChallenge:
entryPoint: web
tls_resolver:
acme:
email: "deine@email.de"
storage: "/etc/traefik/tls_letsencrypt.json"
tlsChallenge: {}
entryPoints:
ping:
address: ':88'
web:
address: ':80'
http:
redirections:
entryPoint:
to: websecure
scheme: https
websecure:
address: ':443'
http3: {}
http:
middlewares:
- crowdsec@file
- default@file
ping:
entryPoint: "ping"
global:
checknewversion: true
sendanonymoususage: false
providers:
docker:
endpoint: "tcp://socket-proxy:2375"
exposedByDefault: false
network: "proxy"
file:
directory: "/etc/traefik/dynamic_conf"
watch: true
providersThrottleDuration: 10s
log:
level: WARN
filePath: "/var/log/traefik/traefik.log"
format: json
maxSize: 10
maxBackups: 10
maxAge: 14
accessLog:
format: json
filePath: "/var/log/traefik/access.log"
fields:
defaultMode: keep
names:
ClientUsername: drop
headers:
defaultMode: keep
names:
# ✅ Security-essentiell:
User-Agent: keep
X-Forwarded-For: keep
X-Real-IP: keep
CF-Connecting-IP: keep
Referer: keep
Content-Type: keep
Accept: keep
# ✅ KRITISCH: REDACT statt DROP
Authorization: redact # Zeigt "REDACTED" wenn Header vorhanden
Cookie: redact # Zeigt "REDACTED" wenn Cookie vorhanden
Set-Cookie: redact
experimental:
plugins:
bouncer:
moduleName: github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin
version: v1.4.6
Code-Sprache: PHP (php)
Erklärung der Änderungen:
- crowdsec@file: Diese Zeile fügt den CrowdSec Bouncer als zusätzliche Middleware hinzu. Dadurch wird jede Anfrage, die über
weboderwebsecurekommt, zuerst durch den Bouncer überprüft. Der Bouncer entscheidet, ob die Anfrage basierend auf der Bannliste zugelassen oder blockiert wird.
Durch diese Konfiguration wird sichergestellt, dass Anfragen an den Traefik-Proxy, die auf der Bannliste von CrowdSec stehen, standardmäßig blockiert werden. Dies erhöht die Sicherheit des Systems und schützt es vor bekannten Bedrohungen.
Es wird euch möglicherweise auch hier auffallen, dass die Middleware bereits in der Konfiguration enthalten ist. Das ist bewusst so gewählt, da nicht jeder die Anleitung vollständig von Anfang bis Ende durcharbeitet. Gerade erfahrene Nutzer überspringen einzelne Schritte gezielt, sodass die Konfiguration auch in diesen Fällen konsistent und funktionsfähig bleibt.
7.5. CrowdSec konfigurieren
7.5.1. Acquisition anpassen
Damit CrowdSec Angriffe oder unberechtigte Zugriffsversuche erkennen und die potenziellen Gefährder blockieren kann, müssen wir CrowdSec mit den relevanten Logs versorgen. CrowdSec überwacht und analysiert die Logs der Dienste, um nach vordefinierten Mustern verdächtige Aktivitäten zu erkennen und entsprechend zu reagieren.
Als ersten Schritt lassen wir CrowdSec die Standardkonfiguration laden:
docker compose up crowdsec -d && docker compose downCode-Sprache: Bash (bash)
# Diese Anleitung setzt voraus, dass sie als Root-User ausgeführt wird.
# Um Root-Rechte zu erlangen, kann folgender Befehl verwendet werden:
sudo su
# Wenn du stattdessen in deiner Umgebung auf `sudo` angewiesen bist,
# sollte der Befehl an dieser Stelle in der Anleitung wie folgt lauten:
sudo -E docker compose up crowdsec -d && docker compose down
Code-Sprache: Bash (bash)
Der Hinweis darf ignoriert werden:
WARN[0000] The "BOUNCER_KEY_FIREWALL" variable is not set. Defaulting to a blank string. Code-Sprache: Bash (bash)
Nun können wir die Acquisition-Konfiguration anpassen, damit CrowdSec die richtigen Log-Dateien überwacht. Wir öffnen die Datei acquis.yaml zur Bearbeitung:
nano /opt/containers/traefik-crowdsec-stack/data/crowdsec/config/acquis.yamlCode-Sprache: Bash (bash)
Dort entfernen wir alle bestehenden Einträge. In der aktuellen Version kommt {"source": "file", "filename": "/does/not/exist", "labels": {"type": "syslog"}} auch das einfach entfernen und dann füge die folgenden Einträge hinzu, um die relevanten Logs hinzuzufügen:
filenames:
- /var/log/auth.log
- /var/log/syslog
labels:
type: syslog
---
filenames:
- /var/log/traefik/access.log
labels:
type: traefik
---
Code-Sprache: YAML (yaml)
Erklärung der Konfiguration:
• /var/log/auth.log und /var/log/syslog: Diese Logs enthalten sicherheitsrelevante Informationen, wie Anmeldeversuche und Systemmeldungen, die CrowdSec überwachen soll. Der Log-Typ ist hier syslog.
• /var/log/traefik/*.log: Hier überwachen wir die Traefik-Logs. CrowdSec wird diese Logs durchsuchen, um verdächtige Aktivitäten zu identifizieren. Der Log-Typ ist traefik.
Diese Konfiguration sorgt dafür, dass CrowdSec die wichtigen System- und Traefik-Logs durchforstet und auf unberechtigte Zugriffe reagiert, indem es entsprechende Maßnahmen ergreift, z.B. das Blockieren von IP-Adressen.
7.5.2. Besonderheiten unter Debian
Ab Debian 12 (Bookworm) und Debian 13 ist rsyslog standardmäßig nicht mehr installiert. Stattdessen nutzt das System ausschließlich systemd-journald zur Protokollierung. Klassische Logdateien wie /var/log/auth.log oder /var/log/syslog existieren daher standardmäßig nicht.
Für Anwendungen, die explizit auf diese Dateien angewiesen sind – etwa CrowdSec oder Fail2Ban in Container-Setups – muss rsyslog gezielt nachinstalliert und minimal konfiguriert werden. Eine direkte Übergabe von journald in Container würde deutlich weitergehende Container-Rechte erfordern und wird hier bewusst vermieden.
Ziel der Konfiguration
- systemd-journald bleibt aktiv
- rsyslog schreibt ausschließlich:
- /var/log/auth.log
- /var/log/syslog
- Es werden keine weiteren klassischen Logdateien erzeugt
Umsetzung unter Debian 12 & 13
Zunächst installieren wir rsyslog:
apt install rsyslogCode-Sprache: Bash (bash)
Anschließend legen wir eine minimale Konfigurationsdatei an. Unter Debian 12 & 13 ist das Verzeichnis /etc/rsyslog.d/ standardmäßig leer; eigene Konfigurationen werden automatisch über die Hauptkonfiguration eingebunden:
cat >/etc/rsyslog.d/10-auth-syslog-only.conf <<'EOF'
# Authentifizierungs-Logs (SSH, sudo, PAM)
auth,authpriv.* /var/log/auth.log
# Allgemeine Systemmeldungen
*.*;auth,authpriv.none /var/log/syslog
EOF
Code-Sprache: Bash (bash)
Zum Abschluss starten wir rsyslog sowie den SSH-Dienst neu, damit die Logdateien direkt geschrieben werden:
systemctl restart rsyslog
systemctl restart sshCode-Sprache: Bash (bash)
Ergebnis
- /var/log/auth.log enthält Authentifizierungsereignisse (z. B. SSH, sudo)
- /var/log/syslog enthält allgemeine Systemmeldungen
- Es werden keine weiteren klassischen Logdateien von rsyslog erzeugt
Damit stehen die benötigten Logdateien auch unter Debian 12 und 13 für CrowdSec zuverlässig zur Verfügung.

Herzlichen Dank für dieses HowTo Crowdsec+Traefik. Es hilft mir sehr!
Beim abarbeiten ist mir gerade aufgefallen, dass
${SERVICES_TRAEFIK_NETWORKS_SOCKET_PROXY_IPV4}
zwei mal verwendet wird.
—
In der crowdsec.yml
${SERVICES_TRAEFIK_NETWORKS_SOCKET_PROXY_IPV4:-172.31.255.252}
—
In der traefik.yml
${SERVICES_TRAEFIK_NETWORKS_SOCKET_PROXY_IPV4:-172.31.255.253}
—
Der Syntax nach, vermute ich, dass es in der crowdsec.yml entsprechend so lauten sollte:
${SERVICES_CROWDSEC_NETWORKS_SOCKET_PROXY_IPV4:-172.31.255.252}
${SERVICES_CROWDSEC_NETWORKS_SOCKET_PROXY_IPV6:-fd00:1:be:a:7001:0:3e:8ffe}
“customResponseHeaders – Content-Security-Policy: “frame-ancestors ‘self’;”” stört in meinem setup die Verbindung zwischen Nextcloud und Collabora.
Aber unter Traefik 3.6 gibt es noch weitere Stolpersteine “encodedcharacters” ist das Stichwort.
Vielen lieben Dank ihr zwei, die Anleitung hat super funktioniert!
Zwei kleine Anmerkungen: Der Link am Ende von 8.1 führt noch zu der alten Anleitung und in 7.3.1 würde ich mir eine Klarstellung wünschen, dass mit “SERVICES_TRAEFIK_LABELS_TRAEFIK_HOST” die DASHBOARD domain und nicht die “Mutter-Domain” des Servers gemeint ist. 😉
Weiterhin hatte ich mit meiner alten Installation häufiger mal false-bans, wenn ich meinen Browser offen gelassen habe und beim erneuten Aufrufen eines Services/Seite ohne aktiven Session Cookie. Crowdsec hat diese Szenarien dann als brute-login oder ähnliches (http-probing oder so…) erkannt.
Gibt es hier auch andere, die ähnlichen Problemen begegnet sind und eventuell Lösungsansätze teilen können?
Erst einmal an der Stelle ein riesiges Dankeschön für die top Anleitung!
Ich hätte dazu eine Frage in die Runde bezüglich der Auswahl des richtigen Firewall Bouncers für Crowdsec unter Debian 13.
Ich nutze UFW, habe aber durch Debian 13 vermutlich die Default-FW Implementierung NFT aktiv.
Auch scheint (laut dem Web) inzwischen UFW auch mit NFT zu funktionieren.
Welcher Bouncer ist in dem Fall der Richtige?
Es müsste eigentlich UFW+NFT sein, aber diese Auswahl besteht nicht..?
Wer ein Wildcard-Zertifikat erstellen möchte (hier am Beispiel von Cloudflare) muss folgendes abändern bzw. hinzufügen:
.
.
.
In /opt/containers/traefik-crowdsec-stack/.env hinzufügen:
CF_DNS_API_TOKEN=DeinCloudflareAPIToken
.
.
.
In /opt/containers/traefik-crowdsec-stack/compose/traefik.yml abändern (siehe Hinweise im Code).
services:
traefik:
container_name: ${SERVICES_TRAEFIK_CONTAINER_NAME:-traefik}
depends_on:
socket-proxy:
condition: service_healthy
env_file: ${ABSOLUTE_PATH}/data/traefik/.env
environment: ##### Hinzufügen
– CF_DNS_API_TOKEN=${CF_DNS_API_TOKEN} ##### Hinzufügen
…
…
…
restart: unless-stopped
security_opt:
– no-new-privileges:true
volumes:
– /etc/localtime:/etc/localtime:ro
– ${ABSOLUTE_PATH}/data/traefik/traefik.yml:/etc/traefik/traefik.yml
– ${ABSOLUTE_PATH}/data/traefik/.htpasswd:/etc/traefik/.htpasswd
##### Folgendes Umbenennen / Alle anderen .json-Zeilen löschen#####
– ${ABSOLUTE_PATH}/data/traefik/certs/acme.json:/etc/traefik/acme.json
##### Ende #####
– ${ABSOLUTE_PATH}/data/traefik/dynamic_conf:/etc/traefik/dynamic_conf:ro
– /var/log/traefik/:/var/log/traefik/
.
.
.
Im Ordner ‘/opt/containers/traefik-crowdsec-stack/data/traefik/certs‘ eine ‘acme.json‘ – Datei mit chmod 0600(!) erstellen, alle anderen löschen. (Oder eine bestehende in ‘acme.json‘ umbenennen)
.
.
.
In /opt/containers/traefik-crowdsec-stack/data/traefik/dynamic_conf/http.routers.traefik-dashboard.yml mit folgenden Code austauschen:
http:
routers:
traefik-dashboard:
entrypoints: websecure
middlewares: traefik-dashboard-auth@file
rule: {{ env “SERVICES_TRAEFIK_LABELS_TRAEFIK_HOST” }}
service: api@internal
tls:
certresolver: cloudflare
domains:
– main: beispiel.de
sans:
– “*.beispiel.de”
.
.
.
In /opt/containers/traefik-crowdsec-stack/data/traefik/traefik.yml NUR den Abschnitt ‘certificatesResolvers’ mit folgendem Code austauschen:
certificatesResolvers:
cloudflare:
acme:
email: deine@email.de
storage: /etc/traefik/acme.json
dnsChallenge:
provider: cloudflare
propagation:
delayBeforeChecks: 10
resolvers:
– “1.1.1.1:53”
– “8.8.8.8:53”
👌
Ich habe bei mir die unter Kapitel 13 angeschnittene DNSchallenge mit Cloudflare implementiert und könnte hier eine entsprechende Anleitung contributen. In welcher Form wäre das sinnvoll/möglich?
Be mir läuft nun alles mit dem neuen Plugin
allerdings habe ich nun das Problem das in der Traefik und crowdsec log jeweils immer die IP vom CDN drin stehen also Cloudflare und ich bekomme ums verrecken es nicht hin das bei crowdsec die orign (client) ip ankommt …
Ich habe folgende fehlermeldung in den logs:
{“level”:”error”,”providerName”:”tls_resolver.acme”,”acmeCA”:”https://acme-v02.api.letsencrypt.org/directory”,”providerName”:”tls_resolver.acme”,”ACME CA”:”https://acme-v02.api.letsencrypt.org/directory”,”routerName”:”traefik-dashboard@docker”,”rule”:”HOST(
traefik.ancienne-forge.eu)”,”error”:”unable to generate a certificate for the domains [traefik.ancienne-forge.eu]: error: one or more domains had a problem:\n[traefik.ancienne-forge.eu] invalid authorization: acme: error: 400 :: urn:ietf:params:acme:error:malformed :: Unable to contact \”traefik.ancienne-forge.eu\” at \”2001:16b8:a79a:ec00:cbd8:8d5c:bcfe:58dd\”, no IPv4 addresses to try as fallback\n”,”domains”:[“traefik.ancienne-forge.eu”],”time”:”2026-01-07T08:00:21+01:00″,”message”:”Unable to obtain ACME certificate for domains”}Für mich unverständlicherweise ist die adresse
traefik.ancienne-forge.eu
über
ping -c3 -6 traefik.ancienne-forge.eu
erreichbar. Ein
nslookup traefik.ancienne-forge.eu
ergibt:
Server: 192.168.1.95
Address: 192.168.1.95#53
Non-authoritative answer:
Name: traefik.ancienne-forge.eu
Address: 2001:16b8:a79a:ec00:cbd8:8d5c:bcfe:58dd
Warum funktioniert der aufruf von
https://traefik.ancienne-forge.eu
dennoch nicht?
Übrigens: auf 192.168.1.95 läuft ein pihole.
Vielen dank für die hilfe.
Sehr schön, dass es jetzt auch eine Anleitung mit dem Bouncer-Plugin gibt! Ich hatte mir da letztes Jahr vorgenommen, mich tiefer einzuarbeiten, aber es fehlte am Ende die Zeit – mit der neuen Anleitung sollte es dann glücklicherweise auch nochmal einen Tick einfacher werden 👍
Wobei ich mich beim Überlegen und auch jetzt beim Lesen wieder fragte, ob sich der Stack nicht noch etwas vereinfachen ließe, indem nicht nur den Firewall-Bouncer, sondern auch Crowdsec selbst auf dem Host laufen lässt (und nicht im Container).
Hallo zusammen,
ich habe die Anleitung auf einem ubuntu Server umgesetzt und bin von der “alten” Anleitung migriert.
Beim Synchronisieren von Daten über die Nextcloud App geht die Verbindung verloren.
Natürlich habe ich auch in crowdsec die Collections und Parser für Nextcloud eingefügt und da Log bereitgestellt.
+——–+———-+——————–+————————————+——–+———+—————————+——–+————+———-+
| ID | Source | Scope:Value | Reason | Action | Country | AS | Events | expiration | Alert ID |
+——–+———-+——————–+————————————+——–+———+—————————+——–+————+———-+
| 105002 | crowdsec | Ip:xxx.xxx.xxx.xxx | crowdsecurity/http-sensitive-files | ban | DE | 3209 Vodafone GmbH | 5 | 3h52m40s | 12 |
| 90001 | crowdsec | Ip:195.178.110.132 | crowdsecurity/http-sensitive-files | ban | BG | 48090 Techoff Srv Limited | 5 | 3h3m42s | 10 |
+——–+———-+——————–+————————————+——–+———+—————————+——–+————+———-+
“xxx” ist meine aktuelle IP
Offenbar wird der Ban durch die Collection http-sensitive-files verursacht.
Kann/soll ich diese Collection einfach weglassen bzw welche Collections empfehlt ihr generell?
Hi,
die bestehende Overleaf-Anleitung funktioniert nicht mehr mit der neuen Konfiguration. Kannst du sie bitte wieder anpassen? Danke.
Ich habe jetzt meinen Main-Server nach der “Komplexen Migration” umgestellt. Hat 1a geklappt! Danke!😀
Hallo,
ich habe ein upgrade durchgeführt, nun funktioniert meine Portainer Oberfläche nicht mehr 🙁
Muss ich hier jetzt neue variablen einsetzten?
Vielen Dank schonmal für eure antworten und lösungen
Nach nur kurzer Zeit ist es mir gelungen meinen kompletten Traefik-Stack problemlos auf die neue Version upzugraden. Sehr gut Arbeit!
An einer Stelle bekomme ich allerdings Fehlermeldungen: Beim Einrichten des Crowdsec-Firewall-Bouncers auf dem Hostsystem. Es gibt einfach nichts aussagekräftiges. Als OS läuft ein Debian 12.
Es geht um Punkt 10.3. und folgende: Ich habe den crowdsec-firewall-bouncer-nftables installiert. (NF-Tables ist übrigens bereits seit Ubuntu 20.10 und Debian 10 Standard). Danach den Access-Token generiert und dann zusammen mit api_url in /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml eingefügt. systemctl enable … funktioniert natürlich, aber das Starten nicht. Ich bekomme einen Exit Code 1. Leider finde ich nicht wirklich verwertbares in den Logs:
journalctl -xeu crowdsec-firewall-bouncer.service:
Dez 28 11:10:22 services systemd[1]: Starting crowdsec-firewall-bouncer.service - The firewall bouncer for CrowdSec...
░░ Subject: A start job for unit crowdsec-firewall-bouncer.service has begun execution
░░ Defined-By: systemd
░░ Support: https://www.debian.org/support
░░
░░ A start job for unit crowdsec-firewall-bouncer.service has begun execution.
░░
░░ The job identifier is 248656.
Dez 28 11:10:23 services crowdsec-firewall-bouncer[3880235]: time="2025-12-28T11:10:23+01:00" level=info msg="Loading yaml file: '/etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml' with additional values from '/etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml.local'"
Dez 28 11:10:23 services crowdsec-firewall-bouncer[3880241]: time="2025-12-28T11:10:23+01:00" level=info msg="Loading yaml file: '/etc/crowdsec/additional values from '/etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml.local'"
Dez 28 11:10:23 services crowdsec-firewall-bouncer[3880241]: time="2025-12-28T11:10:23+01:00" level=fatal msg="process terminated with error: bouncer stream halted.
Dez 28 11:10:23 services systemd[1]: crowdsec-firewall-bouncer.service: Main process exited, code=exited, status=1/FAILURE
░░ Subject: Unit process exited
░░ Defined-By: systemd
░░ Support: https://www.debian.org/support
░░
░░ An ExecStart= process belonging to unit crowdsec-firewall-bouncer.service has exited.
░░
░░ The process' exit code is 'exited' and its exit status is 1.
Dez 28 11:10:23 services systemd[1]: crowdsec-firewall-bouncer.service: Failed with result 'exit-code'.
░░ Subject: Unit failed
░░ Defined-By: systemd
░░ Support: https://www.debian.org/support
░░
░░ The unit crowdsec-firewall-bouncer.service has entered the 'failed' state with result 'exit-code'.
Dez 28 11:10:23 services systemd[1]: Failed to start crowdsec-firewall-bouncer.service - The firewall bouncer for CrowdSec.
░░ Subject: A start job for unit crowdsec-firewall-bouncer.service has failed
░░ Defined-By: systemd
░░ Support: https://www.debian.org/support
systemctl status crowdsec-firewall-bouncer.service:
● crowdsec-firewall-bouncer.service - The firewall bouncer for CrowdSec
Loaded: loaded (/etc/systemd/system/crowdsec-firewall-bouncer.service; enabled; preset: enabled)
Active: activating (auto-restart) (Result: exit-code) since Sun 2025-12-28 11:24:54 CET; 9s ago
Process: 3905021 ExecStartPre=/usr/bin/crowdsec-firewall-bouncer -c /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml -t (code=exited, status=0/SUCCESS)
Process: 3905027 ExecStart=/usr/bin/crowdsec-firewall-bouncer -c /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml (code=exited, status=1/FAILURE)
Process: 3905035 ExecStartPost=/bin/sleep 0.1 (code=exited, status=0/SUCCESS)
Main PID: 3905027 (code=exited, status=1/FAILURE)
CPU: 133ms
Manueller Aufruf:
/usr/bin/crowdsec-firewall-bouncer -c /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml
INFO[0000] Loading yaml file: '/etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml' with additional values from '/etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml.local'
time="2025-12-28T11:27:12+01:00" level=fatal msg="process terminated with error: bouncer stream halted"
tail /var/log/syslog:
2025-12-28T11:28:03.492272+01:00 services systemd[1]: Starting crowdsec-firewall-bouncer.service - The firewall bouncer for CrowdSec...
2025-12-28T11:28:03.507262+01:00 services crowdsec-firewall-bouncer[3910458]: time="2025-12-28T11:28:03+01:00" level=info msg="Loading yaml file: '/etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml' with additional values from '/etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml.local'"
2025-12-28T11:28:03.507262+01:00 services crowdsec-firewall-bouncer[3910458]: time="2025-12-28T11:28:03+01:00" level=info msg="Loading yaml file: '/etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml' with additional values from '/etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml.local'"
2025-12-28T11:28:03.635062+01:00 services crowdsec-firewall-bouncer[3910464]: time="2025-12-28T11:28:03+01:00" level=info msg="Loading yaml file: '/etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml' with additional values from '/etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml.local'"
2025-12-28T11:28:03.635062+01:00 services crowdsec-firewall-bouncer[3910464]: time="2025-12-28T11:28:03+01:00" level=info msg="Loading yaml file: '/etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml' with additional values from '/etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml.local'"
2025-12-28T11:28:03.727360+01:00 services crowdsec-firewall-bouncer[3910464]: time="2025-12-28T11:28:03+01:00" level=fatal msg="process terminated with error: bouncer stream halted"
2025-12-28T11:28:03.727360+01:00 services crowdsec-firewall-bouncer[3910464]: time="2025-12-28T11:28:03+01:00" level=fatal msg="process terminated with error: bouncer stream halted"
2025-12-28T11:28:03.730811+01:00 services systemd[1]: crowdsec-firewall-bouncer.service: Main process exited, code=exited, status=1/FAILURE
2025-12-28T11:28:03.730811+01:00 services systemd[1]: crowdsec-firewall-bouncer.service: Main process exited, code=exited, status=1/FAILURE
2025-12-28T11:28:03.803384+01:00 services systemd[1]: crowdsec-firewall-bouncer.service: Failed with result 'exit-code'.
2025-12-28T11:28:03.803384+01:00 services systemd[1]: crowdsec-firewall-bouncer.service: Failed with result 'exit-code'.
2025-12-28T11:28:03.804078+01:00 services systemd[1]: Failed to start crowdsec-firewall-bouncer.service - The firewall bouncer for CrowdSec.
2025-12-28T11:28:03.804078+01:00 services systemd[1]: Failed to start crowdsec-firewall-bouncer.service - The firewall bouncer for CrowdSec.
2025-12-28T11:28:13.968807+01:00 services systemd[1]: crowdsec-firewall-bouncer.service: Scheduled restart job, restart counter is at 116.
2025-12-28T11:28:13.968807+01:00 services systemd[1]: crowdsec-firewall-bouncer.service: Scheduled restart job, restart counter is at 116.
2025-12-28T11:28:13.969164+01:00 services systemd[1]: Stopped crowdsec-firewall-bouncer.service - The firewall bouncer for CrowdSec.
2025-12-28T11:28:13.969164+01:00 services systemd[1]: Stopped crowdsec-firewall-bouncer.service - The firewall bouncer for CrowdSec.
2025-12-28T11:28:14.007842+01:00 services systemd[1]: Starting crowdsec-firewall-bouncer.service - The firewall bouncer for CrowdSec...
2025-12-28T11:28:14.007842+01:00 services systemd[1]: Starting crowdsec-firewall-bouncer.service - The firewall bouncer for CrowdSec...
2025-12-28T11:28:14.022716+01:00 services crowdsec-firewall-bouncer[3910733]: time="2025-12-28T11:28:14+01:00" level=info msg="Loading yaml file: '/etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml' with additional values from '/etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml.local'"
2025-12-28T11:28:14.022716+01:00 services crowdsec-firewall-bouncer[3910733]: time="2025-12-28T11:28:14+01:00" level=info msg="Loading yaml file: '/etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml' with additional values from '/etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml.local'"
2025-12-28T11:28:14.143666+01:00 services crowdsec-firewall-bouncer[3910739]: time="2025-12-28T11:28:14+01:00" level=info msg="Loading yaml file: '/etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml' with additional values from '/etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml.local'"
2025-12-28T11:28:14.143666+01:00 services crowdsec-firewall-bouncer[3910739]: time="2025-12-28T11:28:14+01:00" level=info msg="Loading yaml file: '/etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml' with additional values from '/etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml.local'"
2025-12-28T11:28:14.251029+01:00 services crowdsec-firewall-bouncer[3910739]: time="2025-12-28T11:28:14+01:00" level=fatal msg="process terminated with error: bouncer stream halted"
2025-12-28T11:28:14.251029+01:00 services crowdsec-firewall-bouncer[3910739]: time="2025-12-28T11:28:14+01:00" level=fatal msg="process terminated with error: bouncer stream halted"
2025-12-28T11:28:14.254105+01:00 services systemd[1]: crowdsec-firewall-bouncer.service: Main process exited, code=exited, status=1/FAILURE
2025-12-28T11:28:14.254105+01:00 services systemd[1]: crowdsec-firewall-bouncer.service: Main process exited, code=exited, status=1/FAILURE
2025-12-28T11:28:14.335186+01:00 services systemd[1]: crowdsec-firewall-bouncer.service: Failed with result 'exit-code'.
2025-12-28T11:28:14.335186+01:00 services systemd[1]: crowdsec-firewall-bouncer.service: Failed with result 'exit-code'.
2025-12-28T11:28:14.335900+01:00 services systemd[1]: Failed to start crowdsec-firewall-bouncer.service - The firewall bouncer for CrowdSec.
2025-12-28T11:28:14.335900+01:00 services systemd[1]: Failed to start crowdsec-firewall-bouncer.service - The firewall bouncer for CrowdSec.
Leider kann ich aus keinem der Logs ersehen, was das Problem ist. Hat jemand Tipps für mich?
Vielen Dank für das Update.
Ich freu mich riesig. Vor ein paar Wochen wollte ich schon Mal vorsichtig anfragen, ob zumindest irgendwann ein Update mit dem integrierten Plugin geplant ist und jetzt das hier.
Ein sehr schönes Weihnachtsgeschenk 😀
Da ich immer auf der Suche nach Alternativen bin, habe ich eine Alternative zu Let’s Encrypt aus Europa ausfindig gemacht. Man weiß ja nie was mal kommen wird, ganz besonders in der heutigen Zeit, daher finde ich sowas wichtig. Unsere Daten sind uns ja was wert, deswegen hosten wir ja schließlich selber. Es handelt sich um den italienischen Anbieter Actalis (der übrigens auch kostenfrei SMIME-Zertifikate zur Verfügung stellt, um Emails zu signieren).
Actalis: https://www.actalis.com/custom-registration
Kleiner Wermutstropfen: Es erfordert eine kurze einmalige Anmeldung und es wird leider kein TLS unterstützt, nur HTTP. Trotzdem besser als nichts und kostenfrei ist es auch. Bis September gab es noch den Anbieter buypass. Dieser hat leider den Betrieb für neue Anfragen allerdings eingestellt.
Um Actalis ins eigene Setup mit einzubinden, muss man nur ganz wenig anpassen und wer weiß, wofür es mal gut ist:
In der traefik.yml muss einfach ein weiterer Resolver aufgenommen werden:
certificatesResolvers:
http_resolver:
...
tls_resolver:
...
actalis_http_resolver:
acme:
email: "mail@example.com"
storage: "acme_actalis.json"
caServer: "https://acme-api.actalis.com/acme/directory"
eab:
kid: "KID AUS DEM BENUTZERACCOUNT"
hmacEncoded: "HMAC ENCODED"
httpChallenge:
entryPoint: web
Hier die eigene Emailadresse einfügen, die KID aus dem Benutzerkonto 1:1 hineinkopieren. Die hmacEncoded, muss etwas umgewandelt werden. HMAC natürlich durch die eigene aus dem Benutzeraccount ersetzen:
printf '%s\n' "$(printf '%s' "MEINE HMAC AUS DEM BENUTZERACCOUNT" | tr '+/' '-_' | sed 's/=*$//')"
Der Wert, der hier ausgegeben wird, ist dann der HMAC ENCODED, der oben eingesetzt werden muss.Der Befehl macht nichts anderes, als eventuelle Gleichzeichen (=) am Ende zu entfernen, Pluszeichen (+) in Minuszeichen (-) und Slashes (/) durch Unterstriche (_) zu ersetzen. Geht natürlich genauso gut manuell.
Benutzt wird der das Ganze dann einfach über die Labels im entsprechenden Service.
Vorher:
labels:
...
traefik.http.routers.mein-service.tls.certresolver: http_resolver
# oder
traefik.http.routers.mein-service.tls.certresolver: tls_resolver
...
Nachher:
traefik.http.routers.mein-service.tls.certresolver: actalis_http_resolver
Guten Rutsch wünsche ich 👍
Danke für die neue Anleitung! 🙂
Mir sind noch zwei Kleinigkeiten aufgefallen beim Umstellen meines Servers:
Im traefik.log steht noch eine deprecated-Warnung:
{"level":"warn","time":"2025-12-26T11:39:07+01:00","message":"delayBeforeCheck is now deprecated, please use propagation.delayBeforeChecks instead."} {"level":"info","version":"3.6.5","time":"2025-12-26T11:39:07+01:00","message":"Traefik version 3.6.5 built on 2025-12-16T14:56:48Z"}Bei der dynamischen Traefik-Config besteht dann ein Unterschied zur normalen, neuen Config:
Die “http.middlewares.default.yml” arbeitet dann mit den neuen Dateien “http.middlewares.gzip.yml” und “http.middlewares.default-security-headers.yml”. Das habe ich bei mir glatt gezogen, dass das auf dem gleichen Stand ist. Vielleicht sollte man das in dem Migrations-Teil auch noch ergänzen und ggfs. weitere Änderungen nochmal ergänzen?
Die sind mir nur ins Auge gefallen, weil ich den Anfang mit dem Erstellen der Files geprüft hatte in der neuen Anleitung.
Was für ein Geschenk, vielen Dank für das gute Update. Ich habe gerade mal einen kleinen Server nach der einfachen Migration umgestellt. Hat alles geklappt. Der Server läuft nun mit der neuen Anleitung. In den nächsten Tage werde ich mal meinen Hauptserver umstellen. Das teilweise die Änderungen schon in den Konfigurationsdateien enthalten sind, ist eine sehr gut Idee und macht alles viel einfacher und schneller.
Ganz lieben Dank euch beiden für das Update zum Traefik Crowdsec Stack. Ich werde mein Setup in den nächsten Wochen mit der Migrationsanleitung auf den neusten Stand mit eurer abgleichen 😊