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-dashboad.entrypoints: websecure traefik.http.routers.traefik-dashboad.middlewares: default@file, traefik-dashboard-auth@file traefik.http.routers.traefik-dashboad.rule: ${SERVICES_TRAEFIK_LABELS_TRAEFIK_HOST:-HOST(`traefik.yourdomain.com`)} traefik.http.routers.traefik-dashboad.service: api@internal traefik.http.routers.traefik-dashboad.tls: "true" traefik.http.routers.traefik-dashboad.tls.certresolver: tls_resolver traefik.http.services.traefik-dashboad.loadbalancer.sticky.cookie.httpOnly: "true" traefik.http.services.traefik-dashboad.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 ---
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.
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! 🙂
psycho0verload die Benennung der dynamic confs hat einen bestimmten sind, dies erkenne ich allerdings erschließt sich mir noch nicht wie traefik das erkennt in welche Datei er gehen soll beispiel hast du geschrieben
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:
Hallo nochmal,
nehmt mir auch folgende Frage nicht übel, ich lerne mich noch in das ganze Thema ein. Kann ich eigentlich auch eine Traefik-Instanz für mehrere Webserver nutzen, oder muss ich auf jedem Server eine eigene Instanz aufsetzen?
Danke und viele Grüße
Moin,
mal eine Frage zu Crowdsec in diesem Stack. Im Moment trudeln bei mir ständig Nachrichten ein, das jemand aus dem bösen Internet meinen mailcow Server inspiziert. Das ist ja nichts ungewöhnliches. Dafür gibt es ja den den Crowdsec. mittels
werden die bösen IPs auch angezeigt, jedoch bekomme ich zur Zeit gerade wirklich viele Wiederholungstäter mit der gleichen IP (klar, die werden wahrscheinlich verschleiert) jetzt wollte ich mittels iptables -L -v -n mal nachsehen, ob die auch wirklich auf dem System gesperrt sind. Leider zeigt mir diese keinen einzige von den gesperrten IP im System an? Es werden mir nur die manuell gesperrten IP in der mailcow Konfiguration angezeigt (Chain MAILCOW). Wie kann ich nun feststellen ob das System richtig arbeiten und meine Installation wirklich durch Crowdsec geschützt ist?
Vielen Dank psycho0verload für die geile Anleitung 😀 Du hast dich echt nochmals selbst übertroffen 😃
Erhalte in ‘Portainer Business Edition 2.21.3’ folgende Fehelermeldung:
Guten Morgen,
entschuldigt bitte die doofe Frage, aber ich komme einfach nicht weiter. Ich bekomme mit der neuen Anleitung weder Traefik noch Mailcow zum Laufen. Muss ich die IPV6 an meinen Server anpassen, oder kann ich diese so wie in der Anleitung übernehmen?
psycho0verload
Mein Feedback.
Bin heute umgestiegen. Backup alter Server. Neuinstallation Ubuntu 24.X.
Nach Anleitung vorgegangen. Anschl. Mailcow neu installiert und restore der Daten.
Danach aus dem Borgbackup alle Container wieder hergestellt.
System läuft nun einwandfrei. Mir fiel nur die hohe Anzahl der Bans auf.
39 aktive Bans hatte ich noch nie. 🙂 Port 22 war aber auch lange offen 🙂
Vielen Dank für die gute Anleitung.
steje
Die Entscheidung, welche Domain du verwendest, liegt ganz bei dir und deinem individuellen Setup. Ob du dich für eine Second-Level-Domain oder eine Third-Level-Domain entscheidest, bleibt dabei dir überlassen. 😊
Lass uns gerne im Mailcow-Beitrag genauer anschauen, wo das Problem liegt bzw. an welcher Stelle das Zertifikat fehlt. Das gehört primär nicht zu diesem Thema hier.
Vielen Dank für die Anleitung! Hat seitens der Anleitung problemlos Funktioniert.
Zwei Anmerkungen.
Kapitel 7.5.1 (@all)
Ich hab beim ausführen von “docker compose up crowdsec -d && docker compose down” folgende Fehlermeldung erhalten.
WARN[0000] The “PWD” variable is not set. Defaulting to a blank string.
Danach ist crowdsec nicht gestartet.
Das lag bei mir am Terminal. Eine Möglichkeit das Problem zu umgehen ist den Befehl mit “-E” zu modifizieren.
Neuer Befehl: -E docker compose up crowdsec -d && docker compose down
Zusatz: Ich arbeite mit Sudo, da ich nicht root bin. Weiß nicht inwiefern das damit zusammenhängt.
Kapitel 8.1. ( psycho0verload )
Bei der Referenzierung auf die URL vom Traefik Dashboard bitte den Kaptielschritt referenzieren in dem wir die URL festlegen.
Ich hatte die URL als allgemein URL im Kopf abgespeichert und war kurz verwirrt als wir plötzlich von der spezifischen Traefik Dashbord URL gesprochen haben.
Auch von mir ein ganze großes Dankeschön! Super geschrieben und richtig informativ. Alleine die ersten 5 Seiten enthalten so viele wichtige Informationen, dass es alleine das schon Wert ist zu lesen. Da werde ich mich in nächster Zeit mal dran machen 😀
Super die Anleitung vielen Dank für deine Arbeit. Da ist es wirklich zu überlegen Traefik neu aufzusetzen.
Wow, da hast du wirklich ein gigantisches Meisterwerk erstellt.
Ich überlege, ob ich meine alte Traefik config kille und diese neu aufsetzte oder auf deine Migrationsanleitung warte.
Ein großes Kompliment und Dankeschön für die neue Anleitung. Freue mich auf die Migrationsanleitung, da ich mein System gerne auf den aktuellen Stand bringen möchte. 🙂