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
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-crowdsec-bouncer.yml - compose/traefik.yml - compose/networks.yml
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-crowdsec-bouncer.yml nano /opt/containers/traefik-crowdsec-stack/compose/traefik.yml nano /opt/containers/traefik-crowdsec-stack/compose/networks.yml
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
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", "curl -s -o /dev/null -w '%{http_code}' http://localhost:2375 | grep -q '403' || exit 1"] timeout: 1s interval: 10s 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
services: traefik_crowdsec_bouncer: container_name: ${SERVICES_TRAEFIK_CROWDSEC_BOUNCER_CONTAINER_NAME:-traefik_crowdsec_bouncer} depends_on: crowdsec: condition: service_healthy env_file: ${ABSOLUTE_PATH}/data/traefik-crowdsec-bouncer/.env hostname: ${SERVICES_TRAEFIK_CROWDSEC_BOUNCER_HOSTNAME:-traefik-crowdsec-bouncer} image: ${SERVICES_TRAEFIK_CROWDSEC_BOUNCER_IMAGE:-fbonalair/traefik-crowdsec-bouncer}:${SERVICES_TRAEFIK_CROWDSEC_BOUNCER_IMAGE_VERSION:-latest} networks: crowdsec: ipv4_address: ${SERVICES_TRAEFIK_CROWDSEC_BOUNCER_NETWORKS_CROWDSEC_IPV4:-172.31.127.252} ipv6_address: ${SERVICES_TRAEFIK_CROWDSEC_BOUNCER_NETWORKS_CROWDSEC_IPV6:-fd00:1:be:a:7001:0:3e:6ffd} restart: unless-stopped
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.1} labels: traefik.enable: "true" traefik.http.routers.traefik-dashboard.entrypoints: websecure traefik.http.routers.traefik-dashboard.middlewares: default@file, traefik-dashboard-auth@file traefik.http.routers.traefik-dashboard.rule: ${SERVICES_TRAEFIK_LABELS_TRAEFIK_HOST:-HOST(`traefik.yourdomain.com`)} traefik.http.routers.traefik-dashboard.service: api@internal traefik.http.routers.traefik-dashboard.tls: "true" traefik.http.routers.traefik-dashboard.tls.certresolver: tls_resolver traefik.http.services.traefik-dashboard.loadbalancer.sticky.cookie.httpOnly: "true" traefik.http.services.traefik-dashboard.loadbalancer.sticky.cookie.secure: "true" traefik.http.routers.pingweb.rule: PathPrefix(`/ping`) traefik.http.routers.pingweb.service: ping@internal traefik.http.routers.pingweb.entrypoints: websecure 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 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/
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
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/.env
ABSOLUTE_PATH=${PWD} TZ=Europe/Berlin SERVICES_TRAEFIK_LABELS_TRAEFIK_HOST=HOST(`unserewunschdomain.de`)
Erklärung der Konfiguration:
- ABSOLUTE_PATH=${PWD}: Dieser Wert wird automatisch auf das aktuelle Arbeitsverzeichnis gesetzt, um dynamische Pfade innerhalb des Projekts zu ermöglichen.
- TZ=Europe/Berlin: Die Zeitzone wird auf Mitteleuropäische Zeit (CET/CEST) festgelegt. Dies stellt sicher, dass alle zeitbasierten Aktionen korrekt in der deutschen Zeitzone durchgeführt werden.
- SERVICES_TRAEFIK_LABELS_TRAEFIK_HOST=
HOST(unserewunschdomain.de)
: Hier legen wir den Hostnamen fest, den Traefik verwendet. Ob wir uns für eine Second-Level-Domain oder eine Third-Level-Domain entscheidest, bleibt dabei uns überlassen. Wichtig ist dabei, die richtige Notation mit den Backticks (`
) einzuhalten, um sicherzustellen, dass die Domain korrekt interpretiert wird. Dies sollte die gewünschte Domain des Projekts sein, um Anfragen richtig weiterzuleiten.
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/.env
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.
- 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/.env
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 den CrowdSec Bouncer für Traefik
Im nächsten Schritt bearbeiten wir die .env
-Datei für den CrowdSec Bouncer, der speziell für die Integration mit Traefik konfiguriert wird. Diese Datei befindet sich im Verzeichnis data/traefik-crowdsec-bouncer/.env
. Hier definieren wir die Zeitzone sowie die API-Konfiguration, um den Bouncer mit dem CrowdSec-Agent zu verbinden.
Öffne die Datei zur Bearbeitung:
nano /opt/containers/traefik-crowdsec-stack/data/traefik-crowdsec-bouncer/.env
TZ=$TZ GIN_MODE="debug" # Wenn das System sauber läuft kann hier "release" gesetzt werden CROWDSEC_BOUNCER_API_KEY=$BOUNCER_KEY_TRAEFIK CROWDSEC_AGENT_HOST=${SERVICES_CROWDSEC_HOSTNAME:-crowdsec}:8080
Erklärung der Konfiguration:
- TZ=$TZ: Verwendet die globale Zeitzoneneinstellung (
$TZ
), die in der allgemeinen.env
-Datei festgelegt wurde. - CROWDSEC_BOUNCER_API_KEY=$BOUNCER_KEY_TRAEFIK: Hier wird der generierte API-Schlüssel für den Traefik-Bouncer verwendet, den wir später in der
.env
-Datei speichern werden. Dies ermöglicht die Authentifizierung des Bouncers bei CrowdSec. - CROWDSEC_AGENT_HOST=${SERVICES_CROWDSEC_HOSTNAME:-crowdsec}:8080: Definiert den Hostnamen des CrowdSec-Agenten. Standardmäßig wird der Dienst auf
crowdsec:8080
erwartet, es sei denn, der Wert wird durch eine andere Umgebungsvariable (SERVICES_CROWDSEC_HOSTNAME
) überschrieben.
Diese Einstellungen sorgen dafür, dass der CrowdSec Bouncer korrekt mit dem Traefik-Dienst und dem CrowdSec-Agenten kommunizieren kann, um verdächtige Anfragen zu blockieren und den Schutz zu gewährleisten.
7.3.5. .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/.env
TZ=$TZ
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.6. API Key für den CrowdSec Bouncer für Traefik generieren
Um den API-Schlüssel für den CrowdSec Bouncer 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:
BOUNCER_PASSWORD=$(openssl rand -base64 48 | tr -dc 'a-zA-Z0-9!@#$%^&*()-_=+[]{}<>?|') echo "BOUNCER_KEY_TRAEFIK=\"$BOUNCER_PASSWORD\"" >> /opt/containers/traefik-crowdsec-stack/.env echo "Generated BOUNCER_KEY_TRAEFIK: $BOUNCER_PASSWORD"
Erklärung der Schritte:
- BOUNCER_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=\”$BOUNCER_PASSWORD\”” >> /opt/containers/traefik-crowdsec-stack/.env:
- Das generierte Passwort wird als
BOUNCER_KEY_TRAEFIK
in die.env
-Datei geschrieben, um es für den Traefik Bouncer zu speichern.
- Das generierte Passwort wird als
- echo “Generated BOUNCER_KEY_TRAEFIK: $BOUNCER_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.yml
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' http: middlewares: - 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: INFO filePath: "/var/log/traefik/traefik.log" format: json maxSize: 10 maxBackups: 10 maxAge: 14 accessLog: filePath: "/var/log/traefik/access.log" format: json bufferingSize: 50 fields: defaultMode: keep
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.
- tls_resolver für TLS-Challenges.
- 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
INFO
fest und gibt den Speicherort der Logs an. - AccessLog: Aktiviert das Access-Log und speichert es in der angegebenen Datei. Bestimmte Felder wie
StartUTC
werden 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 email
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.yml
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
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
CurveP521
undCurveP384
werden 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.default.yml
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.
Öffne die Datei zur Bearbeitung:
nano /opt/containers/traefik-crowdsec-stack/data/traefik/dynamic_conf/http.middlewares.default.yml
http: middlewares: default: chain: middlewares: - default-security-headers - gzip default-security-headers: headers: browserXssFilter: true contentTypeNosniff: true forceSTSHeader: true frameDeny: true stsIncludeSubdomains: true stsPreload: true stsSeconds: 31536000 customFrameOptionsValue: "SAMEORIGIN" gzip: compress: {}
Erklärung der Konfiguration:
- default:
- Dies ist die Hauptmiddleware, die in der
traefik.yml
als Standard-Middleware für dieweb
undwebsecure
EntryPoints 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
).
- 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 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.yml
http: middlewares: traefik-dashboard-auth: basicAuth: realm: "Traefik Dashboard" usersFile: "/etc/traefik/.htpasswd"
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.5. 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-utils
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>
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.
7.4.6. Konfiguration von http.middlewares.traefik-bouncer.yml
In diesem Abschnitt fügen wir den CrowdSec Bouncer als Middleware hinzu. Diese Middleware prüft eingehende Anfragen auf ihre Berechtigung, basierend auf der CrowdSec-Bannliste. Der Bouncer wird als Middleware konfiguriert und sorgt dafür, dass unerwünschte Anfragen blockiert werden.
Öffne die Datei http.middlewares.traefik-bouncer.yml
zur Bearbeitung:
nano /opt/containers/traefik-crowdsec-stack/data/traefik/dynamic_conf/http.middlewares.traefik-bouncer.yml
http: middlewares: traefik-bouncer: forwardAuth: address: http://traefik-crowdsec-bouncer:8080/api/v1/forwardAuth trustForwardHeader: true
Erklärung der Konfiguration:
- traefik-bouncer: Diese Middleware verwendet die
forwardAuth
-Methode, um Anfragen über den CrowdSec Bouncer zu leiten. - address: Gibt die Adresse des Bouncers an, der auf
http://traefik-crowdsec-bouncer:8080/api/v1/forwardAuth
läuft. Dieser prüft, ob die IP-Adresse des Anfragenden auf der Bannliste steht. - trustForwardHeader: true: Traefik vertraut auf die im
Forwarded
-Header enthaltenen Informationen, um die Authentifizierung korrekt durchzuführen.
7.4.7. Integration des Bouncers in traefik.yml
Damit der Bouncer 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.yml
Füge in den Einträgen web
und websecure
die traefik-bouncer
-Middleware hinzu. Die Konfiguration sollte folgendermaßen aussehen:
entryPoints: ping: address: ':88' web: address: ':80' http: redirections: entryPoint: to: websecure scheme: https websecure: address: ':443' http: middlewares: - default@file - traefik-bouncer@file
Erklärung der Änderungen:
- traefik-bouncer@file: Diese Zeile fügt den CrowdSec Bouncer als zusätzliche Middleware hinzu. Dadurch wird jede Anfrage, die über
web
oderwebsecure
kommt, 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.
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 down
# 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
Der Hinweis darf ignoriert werden:
WARN[0000] The "BOUNCER_KEY_FIREWALL" variable is not set. Defaulting to a blank string.
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.yaml
Dort entfernen wir alle bestehenden Einträge und 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 ---
# Unter Debian 12 kann es sein, dass `/var/log/auth.log` nicht vorhanden ist, da Debaian 12 grundsätzlich `journalctl`nutzt. # Dies lässt sich überprüfen mit cat /var/log/auth.log # Sollte die Datei nicht vorhanden sein, dann wird `rsyslog` benötigt: apt install rsyslog && sudo systemctl restart ssh
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.
zur Anleitung auf Seite 8 / Git-Repository
—————————————————–
Nach meinem Verständnis wird in folgender Datei der HOST nicht gesetzt:
/compose/traefik.yml
Ich vermute, dass hier ‘traefik.yourdomain.com’ noch für den eigenen Host umgestellt (d.h. entsprechend ersetzt) werden muss.
Ansonsten funktioniert die Installation damit prima.
Danke dafür!!!
Ich habe Theather mit dem crowdsec container. Ich bin auf meinem Server gebannt und wenn ich mich entbannen möchte, bekomme ich folgende Meldung:
level=error msg=”error while performing request: dial tcp 0.0.0.0:8080: connect: connection refused; 4 retries left”
level=info msg=”retrying in 18 seconds (attempt 2 of 5)”
In den logs finde ich dann folgendes:
Local agent already registered
Check if lapi needs to register an additional agent
/etc/crowdsec was found in a volume
Running hub update
level=warning msg=”Unable to retrieve latest crowdsec version: unable to send request to https://version.crowdsec.net/latest: Get \”https://version.crowdsec.net/latest\”: dial tcp: lookup version.crowdsec.net on 127.0.0.11:53: server misbehaving, using hub branch ‘master'”
level=warning msg=”Failed to check last modified: failed to make HEAD request for https://cdn-hub.crowdsec.net/crowdsecurity/master/.index.json?with_content=true: Head \”https://cdn-hub.crowdsec.net/crowdsecurity/master/.index.json?with_content=true\”: dial tcp: lookup cdn-hub.crowdsec.net on 127.0.0.11:53: server misbehaving” url=”https://cdn-hub.crowdsec.net/crowdsecurity/master/.index.json?with_content=true”
Downloading /etc/crowdsec/hub/.index.json
Error: failed to update hub: failed http request for https://cdn-hub.crowdsec.net/crowdsecurity/master/.index.json?with_content=true: Get “https://cdn-hub.crowdsec.net/crowdsecurity/master/.index.json?with_content=true”: dial tcp: lookup cdn-hub.crowdsec.net on 127.0.0.11:53: server misbehaving
/var/lib/crowdsec/data was found in a volume
Running hub upgrade
level=warning msg=”Unable to retrieve latest crowdsec version: unable to send request to https://version.crowdsec.net/latest: Get \”https://version.crowdsec.net/latest\”: dial tcp: lookup version.crowdsec.net on 127.0.0.11:53: server misbehaving, using hub branch ‘master'”
downloading https://hub-data.crowdsec.net/mmdb_update/GeoLite2-City.mmdb
level=warning msg=”Failed to check last modified: failed to make HEAD request for https://hub-data.crowdsec.net/mmdb_update/GeoLite2-City.mmdb: Head \”https://hub-data.crowdsec.net/mmdb_update/GeoLite2-City.mmdb\”: dial tcp: lookup hub-data.crowdsec.net on 127.0.0.11:53: server misbehaving” url=”https://hub-data.crowdsec.net/mmdb_update/GeoLite2-City.mmdb”
Error: while downloading data for /etc/crowdsec/parsers/s02-enrich/geoip-enrich.yaml: while getting data: failed http request for https://hub-data.crowdsec.net/mmdb_update/GeoLite2-City.mmdb: Get “https://hub-data.crowdsec.net/mmdb_update/GeoLite2-City.mmdb”: dial tcp: lookup hub-data.crowdsec.net on 127.0.0.11:53: server misbehaving
Running: cscli parsers install “crowdsecurity/docker-logs”
Nothing to do.
level=warning msg=”Unable to retrieve latest crowdsec version: unable to send request to https://version.crowdsec.net/latest: Get \”https://version.crowdsec.net/latest\”: dial tcp: lookup version.crowdsec.net on 127.0.0.11:53: server misbehaving, using hub branch ‘master'”
Jemand ein Tipp wie ich das lösen kann?
Vielen Dank für die großartige Anleitung,
psycho0verload! 🙂
Eine kleine Anmerkung: Das obige Setup führt zu folgendem Fehler:
Hintergund ist ein kleiner Tippfehler in der /data/traefik/dynamic_conf/http.middlewares.traefik-bouncer.yml:
Fügt man hier statt forwardauth = forwardAuth ein, funktioniert es. 🙂
Hallo,
ich habe folgende Fehlermeldung nach Aufruf von:
systemctl status crowdsec-firewall-bouncer
Process: 1911999 ExecStartPre=/usr/bin/crowdsec-firewall-bouncer -c /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml -t (code=exited, status=1/FAILURE)
Ein restart wird auch mit einer Fehlermedlung quittiert.
Hat jemand eine Idee. Vielen Dank. Gruß Andreas
Der hier benutzte fbonalair/traefik-crowdsec-bouncer wird seit 3 Jahren nicht mehr geupdated und führt bei mir zu 403 forbidden Problemen in einem Subprojekt.
Eine aktuell gepflegte Alternative wäre maxlerebourg/crowdsec-bouncer-traefik-plugin.
Ein Update wäre cool! 🙂
Hi,
danke für die super Anleitung und das tolle Skipt.
ich habe jetzt nur das Problem, dass ich meinen homeassisten Server über das Handy extern nicht mehr erreiche.
Nextclout welches als Docker läuft aber schon. Daher gehe ich irgendwie davon aus, dass es an der Weiterleitung an eine IP im zusammenhang von IPv4 und IPv6 zu tun haben könnte.
Denn wenn ich wieder außerhalb in einem fremden Wlan mit IPv4 bin komme ich wieder auf den HA Server drauf.
Ich habe in der http.middlewares.default.yml
folgendes eingetragen:
routers:
homeassistent:
entryPoints:
– websecure
rule: “Host(
ha.test.de
)”service: “homeassistent”
middlewares:
– default@file
– traefik-bouncer
tls:
certresolver: http_resolver
services:
homeassistent:
loadBalancer:
servers:
– url: “http://192.168.178.79:8123”
passHostHeader: true
damit hatte es unter Traefik 2 super funktioniert und hatte keine Probleme.
Was mache ich flasch?
Gruß
Ich habe festgestellt, dass man bei den Traefik-Labels inzwischen auf fünf Labels reduzieren kann.
traefik.docker.network: proxy
: Das Netzwerk wird in der statischen Configproviders.docker.network
schon definiert und ist hier redundant. https://doc.traefik.io/traefik/providers/docker/#networktraefik.http.routers.wordpress.middlewares: default@file
: Die Middleware wird auch schon in der statischen Config definiert inentryPoints.websecure.http.middlewares
.traefik.http.routers.wordpress.service: wordpress
: Ein Service wird automatisch erstellt oder automatisch assigned, wenn die Konfiguration durch Labels geschieht. https://doc.traefik.io/traefik/routing/providers/docker/#service-definitiontraefik.http.routers.wordpress.tls: true
: Wenn ein TLS-Konfigurationslabel angegeben ist, also dencertresolver
, dann wird TLS implizit auftrue
gesetzt. https://doc.traefik.io/traefik/routing/routers/#generalDamit bleiben am Ende die Labels fürenable
,entrypoint
,rule
,certresolver
undport
.Hallo zusammen,
zunächst einmal vielen Dank – dank dieser Anleitung habe ich den Umstieg auf eine selbstgehostete Nextcloud geschafft.
Allerdings habe ich ein Problem – nachdem die Installation fast 3 Wochen lang fehlerfrei lief, konnte ich heute nachmittag nicht mehr zugreifen. Wenn ich traefik aufrufe, kommt “forbidden”. Auch bei der Nextcloud.
Ich habe daraufhin Traefik nach der Anleitung nochmal komplett neu installiert, dann konnte ich wieder mit meiner Nexcloud arbeiten – und nach ca. 5 Minuten flog ich raus und es kam wieder “forbidden”.
Ich habe nach dem unten aufgeführten Post das data/crowdsec/data Verzeichnis gelöscht, danach läuft es auch wieder – für 10 Minuten. Dann tritt das Problem wieder auf.
Bin für jede Hilfe dankbar.
Dietmar
Hallo Zusammen
Ich habe ein Problem mit der Acquisition Metrics. Ich habe Traefik einmal Punkt für Punkt nach der Anleitung Installiert und einmal mit dem Shell Scripte auf einem Debian 12 gehostet von Netcup.
Beides Mal steht nach dem Befehl
docker exec crowdsec cscli metrics
nichts von Traefik.log oder access.log unter Acquisition Metrics.
Das komische ist, ich habe das ganze nur ein paar Stunden vorher auf einem Debian 12 Server eines anderen Hoster installiert und dort wurden mehr Menü Punkte angezeigt.
Folgendes fehlt bei Netcup
—————————————————————————————————————————-+
| Acquisition Metrics |
+———————————-+————+————–+—————-+————————+——————-+
| Source | Lines read | Lines parsed | Lines unparsed | Lines poured to bucket | Lines whitelisted |
+———————————-+————+————–+—————-+————————+——————-+
| file:/var/log/traefik/access.log | 714 | 714 | – | 1.09k | – |
+———————————-+————+————–+—————-+————————+——————-+
+—————————————————-+
| Local API Alerts |
+——————————————–+——-+
| Reason | Count |
+——————————————–+——-+
| crowdsecurity/http-admin-interface-probing | 2 |
| crowdsecurity/http-probing | 9 |
| crowdsecurity/http-sensitive-files | 13 |
| crowdsecurity/http-wordpress-scan | 1 |
| crowdsecurity/netgear_rce | 1 |
+——————————————–+——-+
+——————————————————————————————-+
| Bouncer Metrics (FIREWALL) since 2025-02-22 20:48:06 +0000 UTC |
+—————————-+——————+——————-+———————–+
| Origin | active_decisions | dropped | processed |
| | IPs | bytes | packets | bytes | packets |
+—————————-+——————+———+———+———–+———–+
| CAPI (community blocklist) | 46.98k | 810.46k | 17.35k | – | – |
| crowdsec (security engine) | 0 | 0 | 0 | – | – |
+—————————-+——————+———+———+———–+———–+
| Total | 46.98k | 810.46k | 17.35k | 1.32G | 442.26k |
Kann mir jemand da einen Tipp geben?
Hallo zusammen,
tja, das war wohl etwas voreilig (siehe hier drunter).
Die Container starten und laufen nun alle, doch mehrere Dinge liegen im Argen, weshalb ich sowohl beim Zugriff auf die Traefik-Management-Seite, als auch beim Zugriff auf meinen Immich-Dienst ausschließlich ein ‘Forbidden’ bekommen.
Identifizierte Problemstellen:
Das Zertifikat für meinen Dienst hat Traefik gezogen, doch – wie beschrieben: Ich bekomme ausschließlich ein ‘Forbidden’ in der linken, oberen Ecke, und dasselbe bekomme ich auch schon ohne den Dienst für die Traefik-Management-Seite (also keine HTTP-Authentifizierung).
Kann mir jemand weiterhelfen?
Viele Grüße
Matthias
ps Ach ja: In der docker-compose von Traefik habe ich “3.1” durch “3.3” ersetzt.
Hallo zusammen,
zunächst vielen Dank an psycho0verload für die fantastische Anleitung!👌
Nach bestem Wissen und Gewissen bin ich sie durch und habe auch ein paar Kleinigkeiten aus den Kommentaren ergänzt bzw. korrigiert.
Doch bei mir will der Traefik-Container nicht starten bzw. bleibt im ‘restarting’.
Meine Frage: Wie kann ich herausfinden, woran das liegt? /var/log/traefik bleibt leer.🙄
Wer hat mir einen Tipp? Wo und wie kann ich schauen, was da los ist?
Viele Grüße aus Stuttgart
Matthias
Hallo
psycho0verload in der Versionierung 02.02.2025 schreibst du u.a. “Traefik-Version auf 3.3 angepasst” Ich sehe allerdings noch 3.1 im compose file, hast du dich da vertippt? Hast du die 3.3 getestet? Danke Gruss Marco
In meinem Setup habe ich einige Änderungen vorgenommen, die es einerseits für mich noch weiter vereinfachen und andererseits meinen persönlichen Vorstellungen und meinen anderen Projekten besser passen, was rein Geschmacksache ist.
Die Zeitzone mit der Variable
TZ
muss nicht in jeder.env
-Subdatei neu definiert werden. Wie man bei derABSOLUTE_PATH
-Variable sieht, ist dies nicht notwendig, sondern reicht einmal zentral. Das Gleiche gilt fürBOUNCER_KEY_TRAEFIK
. Die muss in der.env
-Datei für CrowdSec nicht neudefiniert werden.Beim Einfügen von Werten in Dateien wie bei
BOUNCER_KEY_TRAEFIK
in „7.3.6. API Key für den CrowdSec Bouncer für Traefik generieren“ bevorzuge ichsed
-Editor stattecho
mit Umleitung. Es vermeidet Duplikate in der Datei und vermeidet, wenn man dochsudo
verwendet, ein “Permission denied”.sed -i -e "/^BOUNCER_KEY_TRAEFIK=/c\BOUNCER_KEY_TRAEFIK=\"$BOUNCER_PASSWORD\"" \
-e "\$aBOUNCER_KEY_TRAEFIK=\"$BOUNCER_PASSWORD\"" \
/opt/containers/traefik-crowdsec-stack/.env
Ich habe auf Debian 12 Probleme mit
PWD
-Variable. PWD ist auf dem Host-System vorhanden und in der Bash nutzbar. Jedoch übergibt Docker die Variable nicht an den Container weiter und ist damit dort nicht anwendbar. Eine mögliche Lösung ist, den Pfad fest zu codieren. Eine andere Lösung besteht darin, wieder zu relativen Pfaden zurückzukehren, wie es bei älteren Anleitungen üblich war. Beispielhaft antraefik.yml
-Compose-Datei:volumes:
- /etc/localtime:/etc/localtime:ro
- ../data/traefik/traefik.yml:/etc/traefik/traefik.yml
- ../data/traefik/.htpasswd:/etc/traefik/.htpasswd
- ../data/traefik/certs/acme_letsencrypt.json:/etc/traefik/acme_letsencrypt.json
- ../data/traefik/certs/tls_letsencrypt.json:/etc/traefik/tls_letsencrypt.json
- ../data/traefik/dynamic_conf:/etc/traefik/dynamic_conf:ro
- /var/log/traefik/:/var/log/traefik/
Bei der oben genannten Variable
BOUNCER_KEY_TRAEFIK
und ggf. unten angegebeneSERVICES_TRAEFIK_CERTIFICATESRESOLVERS_EMAIL
bevorzuge ich diese in der zentralen.env
-Datei zu speichern. Da sie neben den anderen Variablen in dieser Datei in den meisten Fällen die einzigen Variablen sind, die für jeden Host spezifiziert werden müssen. Bei derGIN_MODE
-Variable kommt es darauf an, ob man beim allerersten Mal diesen Wert aufdebug
setzen will, oder dass man jedes Mal mit diesem Wert starten möchte. Auch bevorzuge ich, persönlich die.env
Dateien neben den Compose-Dateien zu legen und sie entsprechend zu benennen, z. B.traefik.env
. Natürlich müssen dieenv_file
-Pfade infolge angepasst werden.Was ich gerne noch anpassen würde, aber bisher nicht hinbekommen habe, ist die E-Mail-Adresse über die Compose-Datei bereitzustellen. Weder mit Label noch mit Command hat es bisher funktioniert.
services:
traefik:
labels:
traefik.certificatesResolvers.http_resolver.acme.email: ${SERVICES_TRAEFIK_CERTIFICATESRESOLVERS_EMAIL:-user@example.com}
traefik.certificatesResolvers.tls_resolver.acme.email: ${SERVICES_TRAEFIK_CERTIFICATESRESOLVERS_EMAIL:-user@example.com}
# Alternatsyntax
- "traefik.certificatesResolvers.http_resolver.acme.email=${SERVICES_TRAEFIK_CERTIFICATESRESOLVERS_EMAIL:-user@example.com}"
- "traefik.certificatesResolvers.tls_resolver.acme.email=${SERVICES_TRAEFIK_CERTIFICATESRESOLVERS_EMAIL:-user@example.com}"
# oder mit command
command:
- "--certificatesresolvers.http_resolver.acme.email=${SERVICES_TRAEFIK_CERTIFICATESRESOLVERS_EMAIL}"
- "--certificatesresolvers.tls_resolver.acme.email=${SERVICES_TRAEFIK_CERTIFICATESRESOLVERS_EMAIL}"
Danke erstmal für die detaillierte Anleitung, alles läuft super bis auf die Erreichbarkeit von home assistant über das web.
In der Vergangenheit musste man in HA einen trusted_proxy eintragen und Traefik einen extra Host geben
extra_hosts:
– host.docker.internal:172.17.0.1
oder ähnlich, danmit der Zugriff funktioniert hat, da HA im Host-Modus läuft. Allerdings funktioniert das bei mir nicht mehr. Weder meldet HA einen unbefugten Zugriff, wodurch ich dann die IP wüsste, noch klappen andere Ansätze, wie im Standard Network die Traefik domain raus suchen, da Traefik nur in seinen drei Netzwerken (crowdsec, proxy, socket_proxy) vertreten ist.
Eventuell weiß jemand nen guten Ansatz? Danke!
Hey mir ist bei einem Security Test aufgefallen das wir hier noch etwas verbessern sollten um das Sicherheitslevel hoch zu setzten, bei den Headern ist noch einiges zu tun :
Damit gibts ein A+ Rating bei https://securityheaders.com/
/opt/containers/traefik-crowdsec-stack/data/traefik/dynamic_conf/http.middlewares.default.yml
Bei den permissions könnt ihr anpassen wie ihr es braucht (Je nach App)
Blockiert wird mit =() , zugelassen wird es durch bsp.: permissionsPolicy: “camera=*, microphone=*”
Edit: für die meisten Anwendungen reicht auch als Standard:
contentSecurityPolicy: “default-src ‘self’; script-src ‘self’ ‘unsafe-inline’ ‘unsafe-eval’; style-src ‘self’ ‘unsafe-inline’; img-src ‘self’ data: blob: https:; font-src ‘self’ data:; connect-src ‘self’ wss: https:; frame-ancestors ‘self’; base-uri ‘self’; form-action ‘self'”
referrerPolicy: “strict-origin-when-cross-origin”
http:
middlewares:
default:
chain:
middlewares:
– default-security-headers
– gzip
default-security-headers:
headers:
browserXssFilter: true
contentTypeNosniff: true
forceSTSHeader: true
frameDeny: true
stsIncludeSubdomains: true
stsPreload: true
stsSeconds: 31536000
customFrameOptionsValue: “SAMEORIGIN”
# Sichere Content Security Policy ohne unsafe-inline/eval
contentSecurityPolicy: “default-src ‘self’; script-src ‘self’ ‘nonce-{RANDOM}’; style-src ‘self’; img-src ‘self’ data: https:; font-src ‘self’; frame-ancestors ‘self’; base-uri ‘self’; form-action ‘self'”
# Referrer Policy
referrerPolicy: “strict-origin-when-cross-origin”
# Permissions Policy
permissionsPolicy: “accelerometer=(), camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=(), interest-cohort=()”
gzip:
compress: {}
Läuft bei euch eigentlich der Socket Proxy? Bei mir hat er noch nie funktioniert. Ich habe gestern Abend nochmal rum probiert, aber kam nicht weiter. Im Log vom Socket Proxy kommt aktuell alle 10 Sekunden:
Ich werde nicht schlau draus. Habt ihr ne Idee?
Außerdem passt die Zeitzone nicht, aber dafür hätte ich ne Lösungsidee. Für das andere nicht.
Hat jemand bereits raus gefunden wie man es bewerkstelligen kann das wenn crowdsec eine IP Bannen tut das dort eine Custom Error pages angezeigt wird.
der Bouncer gibt normalerweise ein 403 zurück
Bin bis Schritt 8.1 ohne Fehler gekommen. Wenn ich jedoch auf das Dashboard zugreifen möchte, ist die Seite komplett leer bis auf “Account : w011d26a” das in der mitte steht. Hat Jemand eine Idee dazu? Danke
Danke für die ausführliche Anleitung + erweiterte Erklärungen. Sieht alles sehr durchdacht aus!
Bei der Implementation sind mir folgende Aspekte aufgefallen (EDIT: noch etwas aufgefallen):
In der traefik.yml im compose-Stack (/opt/containers/traefik-crowdsec-stack/compose/traefik.yml) (und möglicherweise an anderen Stellen ist ein Tippfehler – ohne Auswirkungen auf die Funktionalität – traefik-dashboad statt traefik.dashboaRdWarum wurde für die traefik-dashboard und pingweb router- und service-Definition auf docker labels zurückgegriffen statt diese auch in @ files Definitionen auszulagern? Der Rest des Stacks ist ja sehr gut strukturiert, aber genau hier wird es (aus meiner Sicht) uneinheitlich. Gibt es dafür einen Grund?In der compose von traefik unter /opt/containers/traefik-crowdsec-stack/compose/traefik.yml ist ein Tippfehler beim volumemapping: ${ABSOLUTE_PATH}/data/traefik/certs/acme_letsencrypt.json:/etc/traefik//acme_letsencrypt.json <- Hier ist ein “/” zu viel
Ansonsten eine kurze Anregung auf die Gesamtimplementation der Stacks:
Aktuell ist nur eine Anleitung für weitere Container angehängt. Wenn man mehrere Hosts betreibt, hat man vielleicht schon Services woanders laufen, die vielleicht nicht über den gleichen Docker Stack angesprochen werden. Dies kann man mit einer @ file einfach ergänzen (hier nur als Skelett):
http:
routers:
router-whoami:
rule: Host(
whoami.example.org
)service: service-whoami
tls:
certResolver: letsencrypt
services:
service-whoami:
loadBalancer:
servers:
– url: http://192.168.100.100:80
Dazu noch folgende Anfrage: ich meine, es gab mal hier auf GoNeuland eine sehr ausführliche Anleitung, wie man einen getrennten ReverseProxy auf einem öffentlichen VPS + lokalen Reverse Proxy verwenden kann (NICHT https://goneuland.de/wireguard-ui-vpn-nutzen-um-dienste-im-traefik-crowdsec-stack-extern-oder-intern-zu-nutzen/). Ich finde den Post allerdings nicht mehr.
Ich zum Beispiel implementiere die aktuelle Anleitung als DMZ Proxy zu Hause und will dann später über einen VPS per ProxyProtocol von außen noch aufschalten um keine Port Forwards zu haben. Vielleicht könnte man hierzu auch noch einen Post daraus machen?
In jedem Fall: vielen Dank und ein frohes neues Jahr!
In der neusten Traefik-Version (3.3.1) habe ich Probleme mit dem Dashboard bekommen. Unabhängig von meiner Authentik-Middleware hat die Seite nicht geladen.
Stattdessen wurde mir eine Datei vom Typ “application/octet-stream” zum Download angeboten. Dieser Fehler tritt scheinbar auf, wenn der Header fehlerhaft modifiziert wird. Ich konnte das Problem auf “contentTypeNosniff: true” zurückführen. Nachdem ich die Zeile in der Datei “/opt/containers/traefik-crowdsec-stack/data/traefik/dynamic_conf/http.middlewares.default.yml” auskommentiert habe, lief es wieder.
Ich weiß nicht, ob es sich um einen Bug der aktuellen Version handelt, der dieses Problem verursacht. Aber ich verstehe auch nicht ganz, warum contentTypeNosniff überhaupt benötigt wird. Soll der Browser doch raten, um welche Art von Inhalt es sich handelt 🤷🏻♂️
Hat schon jemand die Traefik-Versionen > 3.3 zum Laufen gekriegt? Hatte es gestern Abend mal probiert bei mir – ging leider nicht.
Ich möchte einfach nur ein ganz herzliches Dankeschön aussprechen für diese wirklich gute Anleitung. Die Installation selber habe ich mit dem Installationsscript gemacht und es hat alles funktioniert 😀 Ich habe es unter Proxmox in einem frischen Container mit Debian 12 installiert. Es gab keinerlei Probleme und auch andere Anleitungen von hier wie etwa Nextcloud oder Paperless NGX liefen einwandfrei 👍
Gibt es eine Möglichkeit den Crowdsec Firewall bunder welcher auf dem System läuft zu sagen er soll nur port 443 und 80 sperren und nicht das gesamte Spektrum da ich schon fail2ban hab laufen
ban_proto und ban_ports funktionieren irgendwie nicht :-/
Beim Update anderer Traefik Instanzen ist mir aufgefallen das per pull hier nicht die aktuellste Version des Images genommen wird sonder noch der 3.1.* Branch :
image:${SERVICES_TRAEFIK_IMAGE:traefik}:${SERVICES_TRAEFIK_IMAGE_VERSION:-3.1}
Nur als Hinweis für andere wenn man auf neuere 3er Versionen will sollte man ja eher :
image:${SERVICES_TRAEFIK_IMAGE:traefik}:${SERVICES_TRAEFIK_IMAGE_VERSION:-3} benutzen. und das Updaten wäre per Script auch gut machbar, hab das mit paar Infos mal bei mir so aktuell:
Hallo können wir bei 7.4.5. Passwort für Traefik-Dashboard festlegennoch dazu schreiben, dass Unterstriche für den Benutzername nicht funktionieren, sie hebeln die Traefik Authentifizierung direkt aus.
Besten Dank für die tolle Anleitung.
Beim anpassen der IP Adressen über DOTENV mittels der vorgegebenen Variabeln aus den Compose Dateien ist mir ein Fehler aufgefallen.
In der “crowdsec.yml” sind zwei Variabeln für IP Adressen identisch zur traefik.yml und sollten angepasst werden.
crowdsec.yml:
alt -> neu
SERVICES_TRAEFIK_NETWORKS_SOCKET_PROXY_IPV4 -> SERVICES_CROWDSEC_NETWORKS_SOCKET_PROXY_IPV4
SERVICES_TRAEFIK_NETWORKS_SOCKET_PROXY_IPV6 -> SERVICES_CROWDSEC_NETWORKS_SOCKET_PROXY_IPV6
Super wäre noch eine Variante mit Wildcard Option für die Domain(s). Ich habe versucht, die alte Anleitung von 2020 mit dieser zu verheiraten, keine Chance.
Herzlichen dank für die Tolle Anleitung.
Ich habe probiert bei einem Bestimmten Diest per Middleware einen Passwortschutz zu hinterlegen. leider ohne Erfolg.
ich komme da irgendwie nicht weiter.
was habe ich da falsch?
danke schon mal ganz Herzluch für euren Tipp.
Hat jemand mit Cloudflare und den origin Cert erfahrung.
wie kann man diese Einbinden ?
Hallo, erst mal vielen Dank für die super Anleitungen. Ich habe jedoch eine Frage zur Sicherheit des Proxies. In der alten Anleitung ist der entryPoint websecure wie folgt konfiguriert:
websecure:
address: ‘:443’
http:
middlewares:
– traefik-crowdsec-bouncer@file
proxyProtocol:
trustedIPs:
– 10.0.0.0/8
– 172.16.0.0/12
– 192.168.0.0/16
forwardedHeaders:
trustedIPs:
– 10.0.0.0/8
– 172.16.0.0/12
– 192.168.0.0/16
in der neuen nur noch:
websecure:
address: ‘:443’
http:
middlewares:
– default@file
Wäre es nicht sicherer die trustedIPs-Einstellungen in Traefik wieder zu konfigurieren, um sicherzustellen, dass nur vertrauenswürdige Proxies (z. B. aus dem Docker-Netzwerk) Forwarded-Header setzen dürfen?
ich verstehe es nicht, Bei der alten Anleitung bzw. bei meiner aktuellen Traefik installation werden im Dashboard nur die Port 88 (ping), 80 (Web) und 443(Websecure) angezeigt
bei der neuen installation ist allerdings noch 8080(api) dabei ? warum der port ist nicht offen und der Aufruf geht.
Hi,
ich habe seit heute einen neuen Fehler bei Traefik v3. Er ist der meinung, dass keine middleware-chain mehr möglich wäre (ab v3), was Quatsch ist, weil ich habe einige traefiks, die das haben.
Fehler:
1.:
ERR error=”cannot create middleware: multi-types middleware not supported, consider declaring two different pieces of middleware instead” entryPointName=websecure routerName=traefik@docker
Also was er will (dynamic_conf.yml) ist:
middlewares:
# default:
# chain:
# middlewares:
# – default-security-headers
# – gzip
und bei den labels (bspw. traefik dashboard)
traefik.http.routers.traefik.middlewares: default-security-headers@file, gzip@file
ACHTUNG: Da steht nicht default@file
2.:
Man kann seit v3 nicht mehr folgende Host-Notation machen: Host (
host1.euredomain.de
) || Host (host2.euredomain.de
)ACHTUNG: Ich meine nicht die alte Notation sondern die neue.
Jetzt werden alle sagen: “Bei mir geht das” – Ja geht auch
Drei Monate lang und dann erneuert der traefik das Zertifikat nicht mehr – so geschehen bei mir, bei einigen Diensten.
Ihr müsst für jeden Namen einen eigenen Router (Labelsatz) bauen.
Ich finde diese beiden “Neuerungen” einen extremen Rückschritt!
Falls jemand eine Idee hat – immer her damit.
Das automatische Skript für die Traefik-Installation ist einfach nur genial!
Hallo,
wenn ich unter Punkt: 7.5.1 den Befehl:
docker compose up crowdsec -d && docker compose down
ausführe, kommt diese Fehlermeldung:
yaml: unmarshal errors:
line 23: mapping key “socket-proxy” already defined at line 2
Ich führe den Befehl im Ordner: /opt/containers/traefik-crowdsec-stack aus.
Jemand n Tipp?
VG Hardy
Hallo
psycho0verload
Vielen Dank für die tolle Anleitung. Bei mir zeigt er keine IP-Addresse und Type bei Firewall an? Ist das OK?
Ich habe den neuen Stack jetzt am Laufen, und auch schon die alte Nextcloud-Instanz mit dem neuen Stack wieder erreichbar, vielen Dank für die hilfreiche Anleitung und vor allem für das Skript. Ich musste es etwas anpassen, weil ich nicht in /opt installiere, da ich die Container nicht auf dem USB-Stick haben will, der mein Boot-Medium ist (OpenMediaVault), aber danach hat es funktioniert.
Lediglich ein Problem tritt gelegentlich auf, und zwar dass ich selbst gebannt werde. Gibt es eine einfache Möglichkeit, Anfragen von der eigenen öffentlichen IP-Adresse (DynDNS) immer durchzulassen? Also dynamisch, ohne dass ich jetzt meine IP in der Whitelist eintrage, weil die sich ja jederzeit ändern kann? Wenn ich von Außerhalb zugreife ist das dann halt so, weil ja nicht klar sein kann, dass die Anfrage von mir ist, aber wenn ich zu Hause bin, dann ist das ja die gleiche IP unter der der Server auch zu erreichen ist, das ist doch bestimmt machbar.
Viele Grüße
Mir fällt jetzt gerade noch was auf..
daemon.json -> “base”: “172.25.0.0/14″ ist für v4 so glaube ich nicht richtig.
Es handelt sich dabei um eine Adresse aus dem 172.24.0.0/14 Netzwerk.
Auch wenn es funktioniert, (docker scheint es richtig zu interpretieren, jedenfalls gehen die Netze/Ips mit 172.24. los) würde ich hier wie folgt eintragen “172.24.0.0/14”
Dann passt auch bei einer Size 23 die 512(-2) Hosts bzw verfügbare IP Adressen pro Netzwerk.
Danke Gruss Marco
Hallo Christian, mal wieder eine super Anleitung! Ich habe die neue V3 Anleitung in einen separaten Ordner aufgebaut, meine spezifischen Änderungen wie IPWhitelist, Telegram Alerting, Collections usw. in die Config Files eingepflegt. Dann die alte Umgebung runtergefahren, die neue gestartet, lief auf Anhieb.
Frage: Hast du IPv6 getestet?
Danke Gruss Marco
Hallo und eine kurze Frage: ist es geplant, den Cloudflaretunnel mit in die Konfiguration zu übernehmen?
Authelia Integration in Traefik-Crowdsec-Stack (Traefik3)
Anlegen von Verzeichnissen.
Erstellen der Secrets
Das Secret authelia_notifier_smtp_password enthält euch Password zum Email Account wenn Ihr SMTP Notifications nutzen wollt.
Wenn ihr File Notifications nutzen wollte dann lasst dies bitte weg.
Ergänzen der docker-compose.yml
—
—
Erstellen der .env File in /opt/containers/traefik-crowdsec-stack/data/authelia/
Legt hier bitte eine .env File mit folgendem Inhalt an.
—
—
Erstellen authelia.yml im compose Verzeichnis.
nano /opt/containers/traefik-crowdsec-stack/compose/authelia.yml
—
…
Erzeugen Traefik Middelware Yml für Authelia.
Erzeugt im Verzeichnis /opt/containers/traefik-crowdsec-stack/data/traefik/dynamic_conf
eine Datei http.middlewares.middlewares-authelia.yml mit folgendem Inhalt.
—
—
Erzeugen der Authelia Configuration in /opt/containers/traefik-crowdsec-stack/data/authelia/config
mit nano /opt/containers/traefik-crowdsec-stack/data/authelia/config/configuration.yml die entsprechende Datei erstellen.
Inhalt:
—
—
Mit diesem Befehl erzeugt ihr den Hash für Euren User:
den angezeigten String tragt ihr dann in die users.yml ein als password:
Mit nano /opt/containers/traefik-crowdsec-stack/data/authelia/config/users.yml die entsprechende Datei erstellen.
Inhalt:
—
—
Nach dem ihr dann alle Container mit docker compose -up -d –force-recreate neugestartet habt, ruft ihr
eure Authelia domain auf auth.domain.tld und log euch mit den angelegten Zugangsdaten ein.
Durch den rest führt euch dann Authelia. Beachtet der 6 stellige Code der angefordert wird wird euch in der Notification.txt im config Verzeichnis angezeigt.
Nach dem erfolgreichen Anlegen des 2FA könnt ihr nun folgende Anpassungen vornehmen:
Manuelle Anpassungen an der traefik.yml im /compose
um Traefik hinter die Authelia Middleware zu bekommen muss folgende Zeile angeasst werden.
Original:
traefik.http.routers.traefik-dashboad.middlewares: default@file,traefik-dashboard-auth@file
Angepasst:
traefik.http.routers.traefik-dashboad.middlewares: default@file,middlewares-authelia@file
Macht das bitte erst wenn euer Authelia Container läuft und ihr euch bei Authelia mindestens einmal angemeldet habt.
alternativ kann man hier auch eine traefik.override.yml anlegen.
nach einem erneuten restart mit
docker compose up -d –force-recreate
und ein paar minuten Wartezeit sollte sich beim Aufruf eurer Traefik Domain nun erst Authelia melden.
Ich hoffe ich habe dies nun vollständig dokumentiert. Falls doch was schiefgehen sollte fragt einfach.
Ich habe dies auch gleichzeitig an Psycho0verload geschickt zur Prüfung und ggf einbau in den Stack.
Tag zusammen, habe gestern Abend die Anleitung genauestens ausgeführt. Aber ich bekomme außer Traefik-Dashboard keinen meiner Services von außen erreicht. Auch wenn ich zB meine Portainer Installation wie hier beschrieben einbinde, keine Chance. Das ganze hängt hinter CloudFlare und ich bekomme nen 525er also SSL Handshake, oder auch gar keine Response.
Im Traefik.log stehen bei den Certificates 403er Fehler.
Werd irre, hat jemand nen Tip was ich noch schauen kann?
Moin Moin,
ist geplant vom traefik-crowdsec-bouncer auf das neue traefik-crowdsec Plugin zu wechseln ? (https://plugins.traefik.io/plugins/6335346ca4caa9ddeffda116/crowdsec-bouncer-traefik-plugin)
Ich werde mich auch die Tage mal dort einlesen 😀
Hallo. Super Anleitung. Ich starte nun mal, um meine bestehende, nach der alten Anleitung, erstellte Traefik/Crowdsec Installation anzupassen (inkl. Mailcow 10 Projekte, WordPress, Portainer, Nextcloud etc.). Nach meinem Verständnis muss ich “Traefik-Crowdsec-Stack” in erster Linie total neu erstellen. Die übrigen Projekte kann ich danach wieder in Betrieb nehmen mit den entsprechenden Anpassungen in der docker-compose.yml resp. zusätzlich der override-Datei (Mailcow) und alte (teilweise unnötige) Cronjobs anpasse. Dafür sollte die gesamte Traefik-Crowdsec-Stack gelöscht werden und danach nach der neuen Anleitung aufgesetzt werden. Dabei werden ja auch alle bestehenden Zertifikate gelöscht (acme_letsencrypt.json) und beim neuen Start des jeweiligen alten, angepassten docker-compose Projekt neu erstellt. Sind noch weitere Stolpersteine (z.Bsp. Crowdsec Bouncer Firewall etc.) vorhanden, welche vor der neuen Traefik V3 Installation deinstalliert/gelöscht werden sollten? Danke für kurze Rückmeldung.
Hallo,
TRAEFIK V2 habe ich bereits erfolgreich eingesetzt nach entsprechender Anleitung.
Nun habe ich TRAEFIK V3 nach dieser Anleitung aufgesetzt, das kann aber nicht funktionieren: Ich benötige traefik (und später die folgenden docker-Installationen für wiki u.a.) nur in einem internen Netz, wo Let’s Encrypt nicht funktioniert.
Wie/Wo muss ich Anpassungen vornehmen, und traefik nutzen zu können?
Danke für die super Anleitung! Ich würde gerne, wie bei der „alten“ Anleitung, das Dashboard mit Authelia absichern. Hat das schon jemand zum Laufen gebracht? Oder, noch besser: Gibt es eine OIDC-Integration für den Zugriff auf das Dashboard?
Hi, erstmal vielen Dank für die ausführliche Anleitung
psycho0verload .
Ein Frage habe ich und vielleicht kann mir die hier jemand beantworten.
Meine Domains habe ich alle bei Cloudflare liegen. Beim neu einrichten mit Traefik 3 ist mir jetzt aufgefallen, das die Domain mit aktiviertem Proxy Modus bei Cloudflare nicht erreichbar ist.
Laut Traefik Log gibt es einen Fehler mit dem TLS
Würde den schon sehr gerne weiter nutzen allein der DDos Schutz ist es wohl wert.
Ich hoffe mal das es nur ein Config Problem ist und jemand hier den entsprechenden Tip für die Lösung geben kann.
Danke
Ich hab mich jetzt doch ran gewagt und alles manuell von neuem gemacht. Im Prinzip klappt alles. Aktuell läuft mein Portainer halt noch nicht über den Socket-Proxy, aber das kann man ja noch nachjustieren.
Was aber nicht funktioniert ist das Updaten von Crowdsec. Im Crontab hab ich folgendes drin stehen (wie in der Anleitung): docker compose -f /opt/containers/traefik-crowdsec-stack/docker-compose.yml restart crowdsec
Der Container mag aber nicht neu starten – der Fehler lautet: env file /root/data/socket-proxy/.env not found: stat /root/data/socket-proxy/.env: no such file or directory
Komme aktuell nicht drauf wo es hakt. Bin über Tipps dankbar! 🙂
http.middlewares.default.yml
und in der Config von traefik selber
default@file
geht Traefik dann einfach durch alle Dateien ? oder wie ist das zu sehen.
versuche gerade meine gesamte Config auf die neue zu übertragen, aber aktuell sehe ich nicht durch weil ich überall irgendwie was geändert habe
Eine Frage
psycho0verload, da ich mich gerade in der Vorbereitung zum Upgrade befinde:
Aktuell habe ich in meiner dynamic-conf.yml einen weiteren Router eingerichtet, der auf mein NAS verweist, um auch dieses via Traefik und Crowdsec abzusichern.
Erstelle ich hierfür eine weitere YML-Datei, die ich in die Docker compose integriere oder packe ich das in eine bestehende dazu?
Da wir die ursprüngliche dynamic conf nun auf mehrere Teile aufgeteilt haben, ist mir das nicht ganz klar.
routers:
qnap:
service: qnap
rule: “Host(
abc.de
)”entryPoints:
– websecure
tls:
certResolver: http_resolver
services:
qnap:
loadBalancer:
servers:
– url: http://192.168.000.00:8080
nextcloud:
loadBalancer:
servers: