Mit Docker lassen sich sehr leicht neue Container auf einem Host erstellen. Sollen aber mehrere Container über dem Port 80 (HTTP) nach außen kommunizieren, so kann es etwas problematisch werden, da dieser Port nur einmal auf dem Server zur Verfügung steht. Wir benutzen Traefik und erweitern es mit CrowdSec um diese Thematik anzugehen.
Diese Anleitung ist eine überarbeitete Variante von Christians Version und erweitert Traefik zusätzlich um das Sicherheitssuite CrowdSec.
Diese Anleitung wird nicht weiter gepflegt. Es gibt eine neue FullStack-Anleitung:
0. Versionierung
Datum | Änderung |
---|---|
25.05.2023 | Hinweis auf neue Anleitung |
29.12.2022 | Nützliches hinzugefügt als Community Inhalt – X Real IP hinzugefügt |
28.12.2022 | Crontab nach oben geschoben Verweis auf Authelia hinzugefügt |
23.12.2022 | Traefik um statische IP-Adresse im CrowdSec Netzwerk erweitert |
22.12.2022 | Überprüfen der Anleitung Traefik: – Docker Network überarbeitet Crowdsec: – Docker Network überarbeitet Statische IPs vergeben: crowdsec -> 172.31.0.2 crowdsec-bouncer-traefik -> 172.31.0.3 Es handelt sich hier um elementare Änderungen. Die Änderungen können auch bereits laufende Systeme adaptiert werden. Hierzu Traefik und crowdsec stoppen und den jeweiligen Netzwerkteil in allen docker-compose.yml anpassen. Crontab hinzugefügt (Danke an @ice-cue) Testen der Anleitung auf einer neuen Instanz |
12.08.2022 | traefik.yml: – unötigen Code entfernt. – Log angepasst dynamic_conf.yml – deprecated funktion auskommentiert |
10.08.2022 | Erfolgskontrolle der Anleitung weiter nach hinten geschoben. 4.3.6. -> 5.1. |
Korrektur der dynamic_conf.yml: secHeder zu secHeaders | |
09.08.2022 | Name des CertResolver von ‘letsEncrypt’ auf ‘http’ geändert Anleitung ist nun vollständig auf ältere Anleitungen kompatibel |
Abschnitt 6 hinzugefügt | |
Kompatibilität zu alten Anleitungen verbessert | |
Optimierung der docker-compose.yml von Traefik Netzwerk ‘proxy’ wird automatisch erstellt | |
08.08.2022 | Fehler in der docker-compose.yml von Traefik behoben- /var/log/crowdsec/traefik/:/var/log/traefik/ |
Information bei Voraussetzungen ergänzt | |
Pfad unter “3.2. Konfiguration anpassen” korrigiert | |
Befehl um htpasswd-Passwort zu erstellen geändert | |
Veröffentlichung |
Hinweis
Seit dem 25.05.2023 gibt es unter steht eine neue Anleitung zur Verfügung!
1. Was ist das Ziel dieser Anleitung?
Grundsätzlich erweitert diese Anleitung die ursprüngliche Anleitung von Christian. Es werden ein paar Dinge optimiert und es gilt weiterhin der Anspruch euch eine Anleitung zu schreiben, dass Ihr eure Applikationen möglichst sicher nutzen könnt! In dieser Anleitung werden wir:
- Traefik v2 installieren und konfigurieren
- Crowdsec installieren und konfigurieren
- Traefik via Crowdsec überwachen
- Wissen, wie ihr neue Anwendungen zu Traefik hinzufügt.
Achtung: Nach dieser Anleitung ist das Hinzufügen von Anwendungen in Traefik nicht mehr vollständig kompatibel zu Christians Anleitung. Dafür etwas kürzer und einfacher.
2. Voraussetzung
- Docker mit Docker Compose installiert (Anleitung für Ubuntu / Debian) (Wichtig!)
- htpasswd installiert (
sudo apt update && sudo apt install apache2-utils
)
3. Traefik
3.1. Verzeichnisse / Dateien anlegen
Als erstes legen wir uns ein Verzeichnis für Traefik an und wechsel in das Verzeichnis:
mkdir -p /opt/containers/traefik cd /opt/containers/traefik
Anschließend erzeugen wir uns noch Datein und Ordner, welche wir später noch benötigen:
mkdir -p /opt/containers/traefik/data touch /opt/containers/traefik/data/acme_letsencrypt.json chmod 600 /opt/containers/traefik/data/acme_letsencrypt.json touch /opt/containers/traefik/data/traefik.yml
3.2. Konfiguration anpassen
Nun bearbeiten wir die Datei traefik.yml
:
Dabei ist wichtig, dass in der .yml nur Leerzeichen und keine Tabs benutzen werden dürfen!
nano /opt/containers/traefik/data/traefik.yml
api: dashboard: true certificatesResolvers: http: acme: email: "meine@email.de" storage: "acme_letsencrypt.json" httpChallenge: entryPoint: http entryPoints: http: address: ":80" http: redirections: entryPoint: to: "https" scheme: "https" https: address: ":443" global: checknewversion: true sendanonymoususage: false providers: docker: endpoint: "unix:///var/run/docker.sock" exposedByDefault: false network: "proxy" file: filename: "./dynamic_conf.yml" watch: true providersThrottleDuration: 10
# Statische Traefik-Konfigurationsdatei # https://doc.traefik.io/traefik/getting-started/configuration-overview/#the-static-configuration # https://doc.traefik.io/traefik/reference/static-configuration/cli/ api: dashboard: true # Aktivieren des Dashboard # Certificate Resolver # Diese sind für den Abruf von Zertifikaten von einem ACME-Server zuständig # https://doc.traefik.io/traefik/https/acme/#certificate-resolvers certificatesResolvers: http: acme: email: "meine@email.de" # E-Mail-Adresse für die Registrierung storage: "acme_letsencrypt.json" # Datei für die Speicherung von Zertifikate (Ich weiche hier bewusst von dem "Standard": acme.json ab) httpChallenge: entryPoint: http # EntryPoints # EntryPoints sind die Netzwerk-Eingangspunkte in Traefik. Sie definieren den Port, der die Pakete empfängt. # https://doc.traefik.io/traefik/routing/entrypoints/ entryPoints: http: address: ":80" # Erstellen des Einstiegspunkt für HTTP (Port 80) http: redirections: # Weiterleitung von HTTP auf HTTPS (Port 80 zu Port 443). entryPoint: to: "https" # Das Ziel scheme: "https" # Umleitungszielschema https: address: ":443" # Erstellen des Einstiegspunkt für HTTPS (Port 443) global: checknewversion: true # In regelmäßigen Abständen prüfen, ob eine neue Version veröffentlicht wurde. sendanonymoususage: false # Regelmäßige Übermittlung anonymer Nutzungsstatistiken. providers: docker: endpoint: "unix:///var/run/docker.sock" # Den UNIX Docker socket beobachten exposedByDefault: false # Nur Container ausstellen, die explizit aktiviert sind (mit dem Label traefik.enabled) network: "proxy" # Standardnetzwerk, das für Verbindungen zu allen Containern verwendet wird. file: filename: "./dynamic_conf.yml" # Link zur dynamischen Konfiguration watch: true # Achten auf Änderungen providersThrottleDuration: 10 # Frequenz in welchen Abständen die Konfiguration nachgeladen wird
Notwendige Anpassungen (unkommentierte Version)
- Zeile 7: Anpassen an die eigene Email-Adresse.
Informationen
- Ich verwende in dieser Variante bewusst nicht
acme.json
als Dateiname. Diese Variante soll am Ende nicht nur Zertifikate via HTTP-Challange abrufen können sondern auch vorbereitet sein dies via DNS-Challange (damit sind Wildcard-Zertifikate möglich) zu machen. So das wir uns für jeden Container seperat entscheiden können welche Challange wir nutzen bzw. benötigen. - Mit ein Grund für Traefik ist, dass am Ende die Anfrage via HTTPS gehen soll. Um nun nicht jedem einzelnen Container händisch die Weiterleitung auf HTTPS mitgeben zu müssen machen wir das hier einfach als allgemeine Regel.
3.3. Anlegen der dynamischen Konfiguration
Jetzt legen wir noch die dynamische Konfiguration an:
nano /opt/containers/traefik/data/dynamic_conf.yml
tls: options: default: minVersion: VersionTLS12 cipherSuites: - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 - TLS_AES_128_GCM_SHA256 - TLS_AES_256_GCM_SHA384 - TLS_CHACHA20_POLY1305_SHA256 curvePreferences: - CurveP521 - CurveP384 sniStrict: true http: middlewares: traefikAuth: basicAuth: users: - "benutzer:passworthash" default: chain: middlewares: - default-security-headers - gzip secHeaders: chain: middlewares: - default-security-headers - gzip default-security-headers: headers: browserXssFilter: true contentTypeNosniff: true forceSTSHeader: true frameDeny: true # Deprecated # sslRedirect: true stsIncludeSubdomains: true stsPreload: true stsSeconds: 31536000 customFrameOptionsValue: "SAMEORIGIN" gzip: compress: {}
# TLS # Hier werden alle notwendigen Einstellungen für das Zertifikat getroffen. # In Kombination mit den Einstellungen unter http.middlewares.default-security-headers bekommen wir ein A+ Zertifikat. tls: options: default: minVersion: VersionTLS12 cipherSuites: - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 - TLS_AES_128_GCM_SHA256 - TLS_AES_256_GCM_SHA384 - TLS_CHACHA20_POLY1305_SHA256 curvePreferences: - CurveP521 - CurveP384 sniStrict: true # Middlewares # Optionale Optimierungen, die bei jeder Anfrage vorgenommen werden sollen bevor diese an den Zielcontainer geleitet wird. http: middlewares: # Eine grundlegende Authentifizierungs-Middleware, um das Traefik-Dashboard via htpasswd zu schützen # Um die Authentifizierung für einen Container zu nutzen können wir "traefik.http.routers.definierteRoute.middlewares=traefikAuth@file" nutzen traefikAuth: basicAuth: users: - "benutzer:passworthash" # Empfohlene Standard-Middleware für die meisten Dienste # Hinzufügbar via "traefik.http.routers.definierteRoute.middlewares=default@file" # Equivalent mit "traefik.http.routers.definierteRoute.middlewares=default-security-headers@file,gzip@file" # Die Liste kann hier auch beliebig erweitert werden default: chain: middlewares: - default-security-headers - gzip # Kompatibilität zu alten Anleitungen. Damit kann auch wieder "traefik.http.routers.definierteRoute.middlewares=secHeader@file" secHeaders: chain: middlewares: - default-security-headers - gzip # Standard Header default-security-headers: headers: browserXssFilter: true contentTypeNosniff: true forceSTSHeader: true frameDeny: true # Deprecated # sslRedirect: true #HSTS Configuration stsIncludeSubdomains: true stsPreload: true stsSeconds: 31536000 customFrameOptionsValue: "SAMEORIGIN" # Gzip Kompression gzip: compress: {}
3.4. Dashboard mit Passwort schützen
Wenn das Dashboard aktiviert wurde ist dies erst mal ungeschützt. Das Dashboard zeigt “nur” Informationen über die laufenden Dienste an. Das sind Informationen, welche wir nicht unbedingt mit der gesamten Maße teilen möchten. Deswegen schützen wir das Dashboard via htpasswd. Die notwendige Middleware dazu haben wir bereits in der dynamischen Konfiguration unter traefikAuth
schon getroffen. Wir müssen uns nur noch einen Benutzernamen überlegen und ein Wunschpasswort dazu hashen:
echo $(htpasswd -nb <user> '<password>') # Zum Beispiel: # echo $(htpasswd -nb jonathan 'supersicher') # Ausgabe: jonathan:$$apr1$$J8vBlNIm$$lSwLv9iGa8KcCct3EyLD41 # Sollte es an dieser Stelle zu Problemen kommen kann man sich auch das Passwort auf Webseiten # wie zum Beispiel: https://www.redim.de/blog/passwortschutz-mit-htaccess-einrichten generieren lassen.
Nun ergänzen wir die dynamische Konfiguration um den eben generierte Benutzername/Passwort-Information:
nano /opt/containers/traefik/data/dynamic_conf.yml
# [...] http: middlewares: traefikAuth: basicAuth: users: - "benutzer:passworthash" # [...]
# [...] http: middlewares: traefikAuth: basicAuth: users: - "jonathan:$$apr1$$J8vBlNIm$$lSwLv9iGa8KcCct3EyLD41" # [...]
3.5. Docker-Compose.yml anlegen
Nun legen wir die docker-compose.yml
an:
nano /opt/containers/traefik/docker-compose.yml
version: '3.9' services: traefik: container_name: traefik image: traefik:latest volumes: - /etc/localtime:/etc/localtime:ro - /var/run/docker.sock:/var/run/docker.sock:ro - ./data/traefik.yml:/traefik.yml:ro - ./data/acme_letsencrypt.json:/acme_letsencrypt.json - ./data/dynamic_conf.yml:/dynamic_conf.yml labels: - "com.centurylinklabs.watchtower.enable=true" - "traefik.enable=true" - "traefik.http.routers.traefik.entrypoints=https" - "traefik.http.routers.traefik.rule=Host(`traefik.meinedomain.de`)" - "traefik.http.routers.traefik.middlewares=traefikAuth@file,default@file" - "traefik.http.routers.traefik.tls=true" - "traefik.http.routers.traefik.tls.certresolver=http" - "traefik.http.routers.traefik.service=api@internal" - "traefik.http.services.traefik.loadbalancer.sticky.cookie.httpOnly=true" - "traefik.http.services.traefik.loadbalancer.sticky.cookie.secure=true" - "traefik.docker.network=proxy" restart: unless-stopped security_opt: - no-new-privileges:true networks: proxy: hostname: traefik ports: - "80:80" - "443:443" networks: proxy: name: proxy driver: bridge attachable: true
version: '3.9' services: traefik: container_name: traefik image: traefik:latest volumes: # Traefik mit der Zeit vom Server syncronisieren - /etc/localtime:/etc/localtime:ro # Lesezugriff auf den UNIX Docker socket - /var/run/docker.sock:/var/run/docker.sock:ro # Traefik-Konfiguration bereitstellen - ./data/traefik.yml:/traefik.yml:ro # Datei mit Zertifikaten bereitstellen - ./data/acme_letsencrypt.json:/acme_letsencrypt.json # Datei mit dynamischer Konfiguration bereitstellen - ./data/dynamic_conf.yml:/dynamic_conf.yml labels: # Traefik durch Watchtower aktualisieren lassen # https://goneuland.de/docker-images-automatisiert-aktualisieren-mit-watchtower/ - "com.centurylinklabs.watchtower.enable=true" # Traefik für Traefik aktivieren - "traefik.enable=true" # Als Einstiegspunkt wählen wir direkt HTTPS - "traefik.http.routers.traefik.entrypoints=https" # Domain anpassen unter der Traefik erreichbar sein soll. - "traefik.http.routers.traefik.rule=Host(`traefik.meinedomain.de`)" # Middlewares definieren, welche verwendet werden sollen. Hier die Authentifizierung via htpasswd + alle die unter default definiert sind. - "traefik.http.routers.traefik.middlewares=traefikAuth@file,default@file" # SSL Zertifikat abrufen - "traefik.http.routers.traefik.tls=true" # Definierten Zertifikat Resolver aus traefik.yml wählen - "traefik.http.routers.traefik.tls.certresolver=http" - "traefik.http.routers.traefik.service=api@internal" - "traefik.http.services.traefik.loadbalancer.server.port=80" - "traefik.http.services.traefik.loadbalancer.sticky.cookie.httpOnly=true" - "traefik.http.services.traefik.loadbalancer.sticky.cookie.secure=true" # Traefik dem Proxy-Netzwerk hinzufügen. - "traefik.docker.network=proxy" restart: unless-stopped security_opt: - no-new-privileges:true networks: proxy: hostname: traefik ports: # Ports definieren, welche durch Traefik gemanaget werden. - "80:80" - "443:443" networks: proxy: name: proxy driver: bridge attachable: true
Notwendige Anpassungen in der unkommentierten Version
- Zeile 16: Auf eigene Domain anpassen
3.6. Traefik starten
Nun können wir Traefik starten:
docker compose -f /opt/containers/traefik/docker-compose.yml up -d
Wenn ihr nun auf traefik.meinedomain.de geht, solltet ihr folgendes sehen:
Nach dem Login mit eurem oben festgelegten Passwort solltet ihr diese Übersicht sehen:
Hier sind wir jetzt fertig mit der Traefik Konfiguration und Installation.
3.7. Anwendungen hinzufügen
Im Allgemeinen ist es wichtig, dass ihr die Labels hinzufügen:
wordpress: labels: # Aktiviert Traefik für diesen Container - "traefik.enable=true" # Hier wird der Einstiegspunkt definiert. Da wir eigentlich zu 99% HTTPS nutzen möchten können wir uns HTTP auch sparen. # Beispielhaft habe ich euch HTTP nochmal auskommentiert hinzugefügt. An dieser Stelle ist keine Weiterleitung zu HTTPS mehr notwenig. # Die Weiterleitung von HTTP zu HTTPS wurde bereits in der traefik.yml festgelegt # - "traefik.http.routers.wordpress.entrypoints=http" # - "traefik.http.routers.wordpress.rule=Host(`wordpress.euredomain.de`)" - "traefik.http.routers.wordpress-ssl.entrypoints=https" - "traefik.http.routers.wordpress-ssl.rule=Host(`wordpress.euredomain.de`)" - "traefik.http.routers.wordpress-ssl.tls=true" - "traefik.http.routers.wordpress-ssl.tls.certresolver=http" - "traefik.http.routers.wordpress-ssl.middlewares=default@file" - "traefik.http.routers.wordpress-ssl.service=wordpress-ssl" - "traefik.http.services.wordpress-ssl.loadbalancer.server.port=80" - "traefik.docker.network=proxy"
Wichtig ist hier auch, dass unser Service “wordpress-ssl” heißt und dementsprechend die Labels auch alle auf den Namen “wordpress-ssl” angepasst werden müssen. Dies kann aber auch jeder andere Name sein. Muss nur konstant sein.
Ihr müsst immer noch das Netzwerk hinzufügen, mit dem Traefik kommuniziert. Dieses Netzwerk ist im einfachsten Fall bei jeder Anwendung identisch. In diesem Fall also “proxy”.
wordpress: networks: - proxy networks: proxy: external: true
Der Name “proxy” wurde hier auch frei gewählt. Dort könnt ihr auch jeden anderen Namen verwenden. Das Netzwerk wird normalerweise durch die docker-compose.yml generiert. Sollte es das nicht der Fall sein:
docker network create proxy
4. CrowdSec
CrowdSec ist ein kostenloses, quelloffenes und kollaboratives IPS. Mit dem Verhaltensweisen analysiert werden, auf Angriffe reagiert wird und Hinweise in der Community geteilt werden. Es ist sozusagen das neue Fail2Ban.
4.1. Verzeichnisse / Dateien anlegen
Als erstes legen wir uns ein Verzeichnis für Crowdsec an und wechsel in das Verzeichnis:
mkdir -p /opt/containers/crowdsec cd /opt/containers/crowdsec
Anschließend erzeugen wir uns noch Datein und Ordner, welche wir später noch benötigen:
mkdir -p /opt/containers/crowdsec/{config,data} touch /opt/containers/crowdsec/.env
4.2. Docker-Compose.yml anlegen
Wir könnten CrowdSec nativ auf unserem Host installieren, allerdings machen wir hier alles mit Docker und auch CrowdSec funktioniert wunderbar mit Docker. In diesem Schritt legen wir uns für CrowdSec die docker-compose.yml an:
nano /opt/containers/crowdsec/docker-compose.yml
version: "3.9" services: crowdsec: container_name: crowdsec image: crowdsecurity/crowdsec:latest environment: PGID: "1000" COLLECTIONS: "crowdsecurity/traefik crowdsecurity/http-cve crowdsecurity/whitelist-good-actors" volumes: - /etc/localtime:/etc/localtime:ro - /var/run/docker.sock:/var/run/docker.sock:ro - ./config:/etc/crowdsec - ./data:/var/lib/crowdsec/data - /var/log/auth.log:/var/log/auth.log:ro - /var/log/crowdsec:/var/log/crowdsec:ro restart: unless-stopped security_opt: - no-new-privileges=true networks: crowdsec: ipv4_address: 172.31.0.2 hostname: crowdsec networks: crowdsec: name: crowdsec driver: bridge ipam: config: - subnet: 172.31.0.0/24 gateway: 172.31.0.1
# Dies entspricht der Anleitung vor dem 22.12.2022 version: "3.9" services: crowdsec: container_name: crowdsec image: crowdsecurity/crowdsec:latest environment: PGID: "1000" COLLECTIONS: "crowdsecurity/traefik crowdsecurity/http-cve crowdsecurity/whitelist-good-actors" volumes: - /etc/localtime:/etc/localtime:ro - /var/run/docker.sock:/var/run/docker.sock:ro - ./config:/etc/crowdsec - ./data:/var/lib/crowdsec/data - /var/log/auth.log:/var/log/auth.log:ro - /var/log/crowdsec:/var/log/crowdsec:ro restart: unless-stopped security_opt: - no-new-privileges=true networks: - proxy hostname: crowdsec networks: proxy: external: true
Bis hier her ist das docker-compose.yml nichts besonderes. Wichtig ist, dass wir die GID Berechtigungen gesetzt haben und alle Logs lesen können. Dafür mounten wir:
- /var/log/auth.log:/var/log/auth.log:ro - /var/log/crowdsec:/var/log/crowdsec:ro
Die Umgebungsvariable COLLECTIONS
ermöglicht es uns die Vorinstallation von Collections aus dem CrowdSec Hub. Collections sind Bündel von Parsern und Szenarien, die es einfach machen, Dinge für beliebte Dienste einzurichten. Standardmäßig wird der Container mit der Linux-Sammlung ausgeliefert, welche Syslog- und SSH-Protokolle verarbeitet. Wir werden die traefik-Sammlung, die http-cve-Sammlung, die eine Sammlung derzeitiger aktiver CVEs abdeckt, und die whitelist-good-actors-Sammlung hinzufügen, die hauptsächlich CDNs wie Cloudflare abdeckt. Damit stellen wir sicher, dass wir sie nicht versehentlich blockieren und uns von großen Teilen des Internets abschneiden.
4.3. Konfiguration anpassen
Nun starten wir den Container um alle wichtigen Datein generieren zu lassen:
docker compose -f /opt/containers/crowdsec/docker-compose.yml up -d
4.3.1. Acquis.yaml bearbeiten
Nach dem wir den den Container gestartet haben finden wir die Datei config/acquis.yaml
und passen diese für unsere Bedürfnisse an:
sudo nano /opt/containers/crowdsec/config/acquis.yaml
filenames: - /var/log/auth.log - /var/log/syslog labels: type: syslog --- filenames: - /var/log/crowdsec/traefik/*.log labels: type: traefik ---
4.3.2. Traefik.yml anpassen
Jetzt müssen wir innerhalb Traefik die Ausgabe der Log-Dateien definieren um diese CrowdSec zur Verfügugn zu stellen. Dafür passen wir von Traefik die traefik.yml
an. Folgenden Teil kopieren wir uns an das Ende der Datei:
nano /opt/containers/traefik/data/traefik.yml
# [...] Ende der Datei log: level: "INFO" filePath: "/var/log/traefik/traefik.log" accessLog: filePath: "/var/log/traefik/access.log" bufferingSize: 100
4.3.3. Traefik docker-compose.yml anpassen
In diesem Schritt ergänzen wir die docker-compose.yml von Traefik um einen Mount für die Logs und das Netzwerk von Crowdsec
nano /opt/containers/traefik/docker-compose.yml
version: '3.9' services: traefik: container_name: traefik image: traefik:latest volumes: - /etc/localtime:/etc/localtime:ro - /var/run/docker.sock:/var/run/docker.sock:ro - ./data/traefik.yml:/traefik.yml:ro - ./data/acme_letsencrypt.json:/acme_letsencrypt.json - ./data/dynamic_conf.yml:/dynamic_conf.yml - /var/log/crowdsec/traefik/:/var/log/traefik/ # Diese Zeile muss hinzugefügt werden labels: - "com.centurylinklabs.watchtower.enable=true" - "traefik.enable=true" - "traefik.http.routers.traefik.entrypoints=https" - "traefik.http.routers.traefik.rule=Host(`traefik.meinedomain.de`)" - "traefik.http.routers.traefik.middlewares=traefikAuth@file,default@file" - "traefik.http.routers.traefik.tls=true" - "traefik.http.routers.traefik.tls.certresolver=http" - "traefik.http.routers.traefik.service=api@internal" - "traefik.http.services.traefik.loadbalancer.sticky.cookie.httpOnly=true" - "traefik.http.services.traefik.loadbalancer.sticky.cookie.secure=true" - "traefik.docker.network=proxy" restart: unless-stopped security_opt: - no-new-privileges:true networks: proxy: crowdsec: # Diese Zeile muss hinzugefügt werden ipv4_address: 172.31.0.10 # Diese Zeile muss hinzugefügt werden hostname: traefik ports: - "80:80" - "443:443" networks: proxy: name: proxy driver: bridge attachable: true crowdsec: # Diese Zeile muss hinzugefügt werden external: true # Diese Zeile muss hinzugefügt werden
# Dies entspricht der Anleitung vor dem 22.12.2022 services: traefik: volumes: - /etc/localtime:/etc/localtime:ro - /var/run/docker.sock:/var/run/docker.sock:ro - ./data/traefik.yml:/traefik.yml:ro - ./data/acme_letsencrypt.json:/acme_letsencrypt.json - ./data/dynamic_conf.yml:/dynamic_conf.yml - /var/log/crowdsec/traefik/:/var/log/traefik/ # Diese Zeile muss hinzugefügt werden
4.3.4. Traefik neustarten
Um die geänderte Konfiguration zu laden starten wir Traefik erneut:
docker compose -f /opt/containers/traefik/docker-compose.yml up -d --force-recreate
4.3.5. CrowdSec Konfiguration neu laden
Jetzt muss noch die Konfiguration von CrowdSec neu geladen werden, dass er auch auf die von uns definierten Logs zugreifen kann. Dafür muss man den Container nicht neutstarten sondern kann einfach die Konfig neu laden:
docker compose exec -t crowdsec kill -SIGHUP 1
4.4. Traefik Bouncer
CrowdSec ist nun in der Lage die Log-Dateien zu lesen und verdächtige IP-Adressen auf die Ban-Liste zu setzten. Nice! Allerdings in dem aktuellen Zustand wird noch nichts unternommen um den potenziellen Angriff abzuwehren. In CrowdSec sind sogenante Bouncer dafür zuständig. Von diesen Bouncern gibt es sehr viele! Es gibt einen Firewall Bouncer für iptables/nftables, einen Cloudflare Bouncer um die Firewall von Cloudflare zu steueren und es gibt auch einen Traefik Bouncer, was für uns hier interessant ist.
4.4.1. CrowdSec: docker-compose.yml ergänzen
Wir ergänzen CrowdSec um den Traefik Bouncer:
nano /opt/containers/crowdsec/docker-compose.yml
bouncer-traefik: container_name: crowdsec-bouncer-traefik image: fbonalair/traefik-crowdsec-bouncer:latest environment: CROWDSEC_BOUNCER_API_KEY: ${TRAEFIK_BOUNCER_KEY} CROWDSEC_AGENT_HOST: crowdsec:8080 # Hier könnte nun auch bei Bedarf die statische IP 172.31.0.2:8080 verwendet werden restart: unless-stopped depends_on: - crowdsec networks: crowdsec: ipv4_address: 172.31.0.3 hostname: crowdsec-bouncer-traefik
version: "3.9" services: crowdsec: container_name: crowdsec image: crowdsecurity/crowdsec:latest environment: PGID: "1000" COLLECTIONS: "crowdsecurity/traefik crowdsecurity/http-cve crowdsecurity/whitelist-good-actors" volumes: - /etc/localtime:/etc/localtime:ro - /var/run/docker.sock:/var/run/docker.sock:ro - ./config:/etc/crowdsec - ./data:/var/lib/crowdsec/data - /var/log/auth.log:/var/log/auth.log:ro - /var/log/crowdsec:/var/log/crowdsec:ro restart: unless-stopped security_opt: - no-new-privileges=true networks: crowdsec: ipv4_address: 172.31.0.2 hostname: crowdsec bouncer-traefik: container_name: crowdsec-bouncer-traefik image: fbonalair/traefik-crowdsec-bouncer:latest environment: CROWDSEC_BOUNCER_API_KEY: ${TRAEFIK_BOUNCER_KEY} CROWDSEC_AGENT_HOST: crowdsec:8080 # Hier könnte nun auch bei Bedarf die statische IP 172.31.0.2:8080 verwendet werden restart: unless-stopped depends_on: - crowdsec networks: crowdsec: ipv4_address: 172.31.0.3 hostname: crowdsec-bouncer-traefik networks: crowdsec: name: crowdsec driver: bridge ipam: config: - subnet: 172.31.0.0/24 gateway: 172.31.0.1
# Dies entspricht der Anleitung vor dem 22.12.2022 bouncer-traefik: container_name: crowdsec-bouncer-traefik image: fbonalair/traefik-crowdsec-bouncer:latest environment: CROWDSEC_BOUNCER_API_KEY: ${TRAEFIK_BOUNCER_KEY} CROWDSEC_AGENT_HOST: crowdsec:8080 restart: unless-stopped depends_on: - crowdsec networks: - proxy hostname: crowdsec-bouncer-traefik
# Dies entspricht der Anleitung vor dem 22.12.2022 version: "3.9" services: crowdsec: container_name: crowdsec image: crowdsecurity/crowdsec:latest environment: PGID: "1000" COLLECTIONS: "crowdsecurity/traefik crowdsecurity/http-cve crowdsecurity/whitelist-good-actors" volumes: - /etc/localtime:/etc/localtime:ro - /var/run/docker.sock:/var/run/docker.sock:ro - ./config:/etc/crowdsec - ./data:/var/lib/crowdsec/data - /var/log/auth.log:/var/log/auth.log:ro - /var/log/crowdsec:/var/log/crowdsec:ro restart: unless-stopped security_opt: - no-new-privileges=true networks: - proxy hostname: crowdsec bouncer-traefik: container_name: crowdsec-bouncer-traefik image: fbonalair/traefik-crowdsec-bouncer:latest environment: CROWDSEC_BOUNCER_API_KEY: ${TRAEFIK_BOUNCER_KEY} CROWDSEC_AGENT_HOST: crowdsec:8080 restart: unless-stopped depends_on: - crowdsec networks: - proxy hostname: crowdsec-bouncer-traefik networks: proxy: external: true
4.4.2. API-Schlüssel generieren
Nun müssen wir noch einen API-Schlüssel erzeugen in dem wir den Bouncer bei CrowdSec registieren:
docker compose exec -t crowdsec cscli bouncers add bouncer-traefik
Es wird uns der API-Key ausgegeben. Diesen müssen wir uns unbedingt notieren, da er nur dieses einemal angezeigt wird. Wir kopieren ihn dann in unsere .env-Datei:
nano /opt/containers/crowdsec/.env
TRAEFIK_BOUNCER_KEY=ef422bf99a6883bc9042x0xxx00x0xxx
4.4.3. Traefik erweitern
Nun können wir für jeden Container verdächtige IPs blocken aber wir werden diese Option global Konfigurieren. Damit kann keine unerwünschte IP Adresse auf unsere Services zugreifen.
Um dies zu aktivieren erweitern wir unsere dynamic_conf.yml von Traefik um eine weitere middleware:
nano /opt/containers/traefik/data/dynamic_conf.yml
tls: options: default: minVersion: VersionTLS12 cipherSuites: - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 - TLS_AES_128_GCM_SHA256 - TLS_AES_256_GCM_SHA384 - TLS_CHACHA20_POLY1305_SHA256 curvePreferences: - CurveP521 - CurveP384 sniStrict: true http: middlewares: traefikAuth: basicAuth: users: - "benutzer:passworthash" default: chain: middlewares: - default-security-headers - gzip secHeaders: chain: middlewares: - default-security-headers - gzip default-security-headers: headers: browserXssFilter: true contentTypeNosniff: true forceSTSHeader: true frameDeny: true # Deprecated # sslRedirect: true stsIncludeSubdomains: true stsPreload: true stsSeconds: 31536000 customFrameOptionsValue: "SAMEORIGIN" gzip: compress: {} crowdsec-bouncer: forwardauth: address: http://crowdsec-bouncer-traefik:8080/api/v1/forwardAuth # Hier könnte nun auch bei Bedarf die statische IP 172.31.0.3:8080 verwendet werden trustForwardHeader: true
Jetzt noch die statische Konfiguration von Traefik anpassen. Wir fügen zu unseren Einstiegspunkten (entryPoints) die gerade definierte Middleware standardgemäß hinzu:
nano /opt/containers/traefik/data/traefik.yml
api: dashboard: true certificatesResolvers: http: acme: email: "meine@email.de" storage: "acme_letsencrypt.json" httpChallenge: entryPoint: http entryPoints: http: address: ":80" http: redirections: entryPoint: to: "https" scheme: "https" # An dieser Stelle auskommentiert. Bevor die Anfrage an crowdsec geht wird sie erst an https weitergeleitet # middlewares: # - crowdsec-bouncer@file https: address: ":443" http: middlewares: - crowdsec-bouncer@file global: checknewversion: true sendanonymoususage: false providers: docker: endpoint: "unix:///var/run/docker.sock" exposedByDefault: false network: "proxy" file: filename: "./dynamic_conf.yml" watch: true providersThrottleDuration: 10 log: level: "INFO" filePath: "/var/log/traefik/traefik.log" accessLog: filePath: "/var/log/traefik/access.log" bufferingSize: 100
5. Dienste neustarten
Nun starten wir nach der Reihe die Dienste einmal neu. Dannach wird jede eingehende Anfrage von Traefik an den Bouncer weitergeleitet, um zu prüfen, ob die IP auf der Banliste steht. Alle IP Adressen auf der Banliste bekommen dann 403 Forbidden:
docker compose -f /opt/containers/crowdsec/docker-compose.yml up -d --force-recreate docker compose -f /opt/containers/traefik/docker-compose.yml up -d --force-recreate
Wenn es zu folgendem Fehler kommt:
[+] Running 1/2 ⠿ Container crowdsec Started 0.8s ⠿ Container crowdsec-bouncer-traefik Starting 0.5s Error response from daemon: Address already in use
Dann hat sich Traefik die statische IP Adresse von crowdsec-bouncer-traefik geangelt. Sollte das der Fall sein einfach:
docker compose -f /opt/containers/traefik/docker-compose.yml down docker compose -f /opt/containers/crowdsec/docker-compose.yml up -d --force-recreate docker compose -f /opt/containers/traefik/docker-compose.yml up -d --force-recreate
5.1. Erfolgskontrolle
Nun können wir kontrollieren ob CrowdSec Log-Dateien von Traefik gefunden hat und diese auch analysiert:
docker exec crowdsec cscli metrics
6. Crontab einrichten
Die benutzten COLLECTIONS werden überwiegend durch die Community gepflegt und natürlich auch auf neue Crowdsec-Versionen angepasst. Damit wir nicht in einen Fehler laufen oder eine veraltet COLLECTION verwenden ist es Sinnvoll diese regelmäßig zu aktualisieren.
sudo crontab -e
0 * * * * docker exec crowdsec cscli hub update && docker exec crowdsec cscli hub upgrade
7. Authelia verwenden
Anstelle von der htaccess-Authentication kann selbstverständlich auch das noch sicherer Authelia eingesetzt werden. Dafür wurde die folgende Anleitung angepasst:
8. Ältere Anleitungen anpassen
Viele Anleitungen auf GoNeuland sind entstanden bevor es diese hier gab. Das bedeutet wir müssen zumindest kleine Anpassungen an den Traefik Labels des jeweiligen Container machen. So sehen Beispielhaft die typischen Labels einer Anleitung aus:
labels: - "traefik.enable=true" - "traefik.http.routers.invidious.entrypoints=http" - "traefik.http.routers.invidious.rule=Host(`video.euredomain.de`)" - "traefik.http.middlewares.invidious-https-redirect.redirectscheme.scheme=https" - "traefik.http.routers.invidious.middlewares=invidious-https-redirect" - "traefik.http.routers.invidious-secure.entrypoints=https" - "traefik.http.routers.invidious-secure.rule=Host(`video.euredomain.de`)" - "traefik.http.routers.invidious-secure.tls=true" - "traefik.http.routers.invidious-secure.tls.certresolver=http" - "traefik.http.routers.invidious-secure.service=invidious" - "traefik.http.services.invidious.loadbalancer.server.port=3000" - "traefik.docker.network=proxy" - "traefik.http.routers.invidious-secure.middlewares=secHeaders@file"
Ich möchte diese jetzt Stück für Stück an die neue Anleitung anpassen euch dabei mitnehmen. Ich zeige euch die Stellen an denen wir was verändern.
Folgender Teil kann entfernt werden, da wir das schon in der traefik.yml definiert haben:
- "traefik.http.middlewares.invidious-https-redirect.redirectscheme.scheme=https" - "traefik.http.routers.invidious.middlewares=invidious-https-redirect"
Danke für den Hinweis @Ice-Cue
9. Nützliches
9.1. Remote IP an Container übertragen
Bei diesem Inhalt handelt es sich um exklusiven Content für Community Plus Mitglieder und Supporter.
Bitte logge dich mit deinem Account ein um den Inhalt zu sehen.
Quellen
- https://goneuland.de/traefik-v2-reverse-proxy-fuer-docker-unter-debian-10-einrichten/
- https://docs.ibracorp.io/crowdsec/
- https://www.benjaminrancourt.ca/a-complete-traefik-configuration/
- https://docs.ibracorp.io/crowdsec/crowdsec/docker-compose/traefik-bouncer
- https://blog.vacum.se/securing-mailcow-with-crowdsec/
- https://spad.uk/integrating-crowdsec-with-traefik-discord/
- https://docs.technotim.live/posts/crowdsec-traefik/
Hallo,
danke für die super Anleitung. Soweit funktioniert auch alles. Ich habe nur ein Problem, und das habe ich seit der Installation auf Debian 11 jetzt ein paar Tage beobachtet, dass der Crowd-Sec Container einen Restart alle paar Sekunden macht. So kann ich mich leider auch nicht im Traefik anmelden. Bin für jeden Tipp dankbar!
Hallo und danke für die Anleitung. Schön geschrieben und ausführlich erklärt, gefällt mir persönlich sehr gut, da man auch versteht was warum getan wird.
Hatte jedoch die ganze Zeit eine Fehlermeldung in den Crowdsec Logs:
“level=warning msg=”No matching files for pattern /var/log/syslog” type=file”
Habe dann festgestellt, dass die Syslog-Datei nicht gemountet wird und entsprechend die Zeile ” – /var/log/syslog:/var/log/syslog:ro” unter volumes im Stack beim Service crowdsec eingefügt.
Hallo zusammen,
ich den Stack soweit zum laufen bekommen. Allerdings möchte ich keine Lets Encrypt Zertifikate verwenden, sondern eigene. Allerdings habe ich hier einen Knoten im Kopf und sehe da nicht klar. Wo und wie muss ich das definieren um sowohl den traefik-crowdsec-stack als auch andere Docker Applikationen mit eigenen Zertifikaten anzubinden.
Carsten
Hallo
bis zum Punkt 4.4.2 bin ich gekommen Traefik lauft und CrowdSec auch
leider kommt nach dem Befehl
jetzt ein
Was habe ich übersehen 😎
Ralf
Bei mir ist letsencrypt-Zertifikat abgelaufen und ich habe es versäumt zu verlängern (weiß nicht wie das geht – dachte ja es würde automatisch gehen nach dem ganzen Einrichten). Deswegen habe ich auch keinen Zugriff auf meinen Server und den dahinter laufenden Diensten wie meinen Seafile-Server, Traefik usw. mehr, da der Hostname mit dem verknüpften Zertifikat bei meinem Server-Anbieter hinterlegt wurde.
Kann mir einer bitte helfen? Es gibt auch nirgends eine Anleitung dafür. Die LetsEncrypt-Seite ist total nebulös.
Per Putty kann ich auf meinen Server zugreifen.
Müsste bei 9.1.4 das nicht auch bei secure und two in den labels hinzugefügt werden? traefik.http.routers.public-secure.middlewares=real-ip-cf@file,secHeaders@file,authelia@file
Also real-ip-cf@file
Ebenso in die docker-compose von Authelia und nicht nur in docker-compose von Authelia-Demo?
Bei 3.4 sollte erwähnt werden, dass nach dem Hinzufügen des Passworts ein Neustart vom Traefik Docker-Container empfehlenswert wäre. Ich habe mich recht lange herumgeärgert mit dem erfolglosen Einloggen in Traefik und war kurz vor dem Aufgeben, bis ich dann auf die Idee kam mal den Container neuzustarten.
Ach so, Antworten kann ich mir hier nicht anzeigen lassen.
Hallo zusammen,
wie kann ich mir hier die Antworten anzeigen lassen?
Hallo,
die access.log die von Traefik erstellt wird wächst mit der Zeit ziemlich an. Ich habe versucht die in “logrotade” einzubinden. Das funktioniert nicht wirklich. Die config Datei unter etc/logrotade.d wird nicht mit genommen. Wenn ich den Befehl manuell ausführe wird die Datei umbenannt. Es fehlt dann aber die access.log als Basis. Das gibt Probleme die erst nach einem Restart von Traefik behoben ist.
Hat da jemand noch eine Idee. Vielen Dank schon mal
Gruß Andreas
Seit heute Morgen (Server-Neustart, sonst wüsste ich nicht was daran “Schuld” gewesen sein könnte) geht bei mir Crowdsec leider gar nicht mehr auf einem meiner Server. Folgendes steht in den Logs:
docker logs crowdsec
docker logs crowdsec-bouncer-traefik
Ich werde leider gerade nicht schlau draus und werde Crowdsec auf dem Server erstmal deaktivieren. Wäre aber cool, wenn jemand ne Idee hat. 🙂
Macht ihr noch eine Variante für Wildcard-Zertifikate bzw. hat es jemand hinbekommen?
Ich hab es mal selbst versucht, aber ich bekomme immer den Fehler
Folgendes hab ich angepasst:
traefik.yml
docker-compose.yml
Hat jemand einen Tipp, woran es scheitert?
Der Entrypoint ist doch korrekt?
Hey!
Erst einmal vielen Dank für deine Anleitung.
Bis Traefik hat bei mir alles wunderbar geklappt. Dann habe ich mit crowdsec angefangen und seitdem bekomme ich keine Webseite mehr erreicht. Ich bekomme immer die Meldung “Forbidden”.
Daher habe ich mir mal wie in den Kommentaren schon geschrieben “docker compose up” ausgeführt und sehe folgendes, sobald ich eine Seite öffnen möchte:
Irgendwie kann er die IP-Adresse nicht abfragen, aber ich weiß nicht warum.
In der dynamic_conf.yml habe ich auch mal die IP-Adresse angegeben. Das Problem bleibt leider bestehen.
Hast du vielleicht noch eine Idee?
Hallo,
Ich möchte eine WordPress Seite über Traefik mit einem Passwortschutz ausstatten, ähnlich dem Dashboard aus der Anleitung.
Versuche das über die BasicAuth middleware, bekomme das aber irgendwie nicht hin. Ich habe in der dynamic_conf.yaml folgendes hinzugefügt:
middlewares:
testAuth:
basicAuth:
users:
– “user:passwort”
Aber wie rufe ich das ganze in der Docker-Compose.yaml auf?
– “traefik.http.routers.wordpress.middlewares=testAuth@file”
funktioniert nicht
Hallo 🙂
Ich hänge leider bei Punkt 3.6 / 3.7.
Ich habe alles so konfiguriert, auch meinen DNS mit *.meinedomain.com per TypA an meine statische IP verwiesen. Ping funktioniert!
Doch ich komme einfach nicht auf das Anmeldefenster. Von einem Rechner im Netzwerk als auch am Server selbst bekomme ich andauernd denn Fehlercode: SSL_ERROR_UNRECOGNIZED_NAME_ALERT im Firefox
Was kann hier falsch sein? Muss ich das Zertifikat meiner Domain irgendwo hinterlegen?
Beste Grüße
Launga
Hallo VeePay, hast Du in der docker-compose von traefik in Zeile 24 nicht -restart: unless-stopped- stehen. Ich kenne solche Verhalten nur wenn eine andere Instanz sich die IP von Traefik schnappt. Aber dann reicht es nicht einfach nur denn Container neu zu starten.
Hallo,
vielen Dank für diese super Anleitung! Ich bin gerade dabei meinen ersten Server einzurichten!
Leider hakt es bei mir ab der Installation von CrowdSec. Aktuell habe ich folgendes Fehlerbild:
sobald ich im Traefik Docker das Netzwerk CrowdSec hinzufüge, sind meine Dienste und das Dashboard von außen nicht mehr erreichbar (Google Chrome gibt: ERR_CONNECTION_RESET)
Die Erfolgskontrolle docker exec … gibt bei mir leider keine ausgabe!
Ich habe das ganze zwei mal versucht. Beim ersten mal, hätte eigentlich alles funktioniert, ein Fehler von mir hatte sich an anderer Stelle eingeschlichen, ich habe ihn aber nicht zuordnen können und deshalb versucht meinen Einbau von CrowdSec rückgängig zu machen. Das hat soweit auch funktioniert, aber beim erneuten Versuch CrowdSec aufzusetzten geht es nicht mehr. Ich vermute beim Versuch CrowdSec runter zu schmeißen, hab ich irgendwo irgendwie was liegen lassen.
Ich habe per docker -rm den Container entfernt und den Ordner /crowdsec gelöscht. Ich dachte das würde reichen.
Falls jemand eine Idee oder einen Tipp hat, wäre ich sehr dankbar!
Kann auch sein, dass mein Fehler sich wo anders befindet, das will ich wirklich nicht ausschließen.
Danke!
Ihr Lieben,
kurze Frage, ich wollte gern nach Anleitung auf der Slack-Website die Benachrichtigung per Slack für Crowdsec einrichten. Leider bekomme ich dann wieder das Problem, dass der Crowdsec-Container ständig restarted. Vielleicht hat jemand einen Tipp für mich? Den Crowdsec-Container habe ich nach der Änderung neu erstellt.
Änderungen habe ich laut Anleitung vorgenommen an der /opt/containers/crowdsec/config/profiles.yaml –> uncomment – slack_default
und
/opt/containers/crowdsec/config/notifications/ slack.yaml –> meinen Webhook eingetragen.
Hier die Anleitung Slack Plugin | CrowdSec
Auch von mir vielen Dank für die Anleitung. Ich habe jetzt allerdings ein Problem, welches ich nicht allein zu lösen weiß.
Ich kann jetzt wunderbar Subdomains auf andere Docker-Container umlegen. seafile.meinedomain.de – traefik.meinedomain.de usw. funktionieren tadellos.
Was ich jetzt nicht hinbekomme, ist die Verwendung der Adressen meinedomain.de und http://www.meinedomain.de
nginx läuft jetzt mal Testweise unter nginx.meinedomain.de – Wenn ich aber als Host die Subdomain weglasse, funktioniert es nicht.
Edit: Jetzt, warum auch immer, funktioniert es.
Aber eine Frage bleibt offen. Wie schaffe ich es, die Seite auch unter http://www.meinedomain.de erreichbar zu machen?
Hey danke nochmal für die Anleitungen und Hilfe.
Ich habe das Problem, dass ich die richtige IP im Docker Container bekomme. Leider bekomme ich nur die IP vom Traefik.
Ich habe hier auch die Anleitung genutzt mit real ip
Die Middleware wird auch geladen. Leider ohne Erfolg.
Bekomme in den Logs nur die IP von Traefik und nicht die Reale IP.
Gibt es vielleicht noch einen Tip?
Würde mich freuen was zu hören.
LG Dirk
Ich habe das Problem, dass Dienste hinter Traefik die Client-IP nicht korrekt erkennen. Statt der echten IP taucht in den Logfiles immer die Docker-IP 172.19.x.x auf.
Um das zu umgehen, wollte ich eigentlich den Header “X-Forwarded-For” verwenden, doch das klappt nicht so recht.
Ich habe bereits in der traefik.yml in /opt/containers/traefik/data/ im Abschnitt entryPoints die forwardedHeaders freigeschaltet, ohne Erfolg.
In /var/log/crowdsec/traefik/access.log sehe ich als Quell-IP immer nur die 172.19.x.x.
Hat jemand eine Lösung dafür?
@psycho0verload Hättest du mal eine kurze Anleitung um ein bestehenden Server auf die statische IP (Traefik/Crowdsex) umzustellen. Ich bekomme es so nicht hin. Einfach nur das Netzwerk zu ändern in den docker-compose.yml reicht nicht aus.
Ich habe gerade mal versucht meinen Server auf die statische IP wie hier beschrieben umzustellen. Klappt leider nicht bei mir. Ich bekomme immer den Fehler: root@debian:/opt/containers/crowdsec# docker exec crowdsec cscli metrics time=”27-12-2022 11:43:13 AM” level=fatal msg=”failed to fetch prometheus metrics : executing GET request for URL \”http://0.0.0.0:6060/metrics\” failed: Get \”http://0.0.0.0:6060/metrics\”: dial tcp 0.0.0.0:6060: connect: connection refused” Keine Ahnung, ich habe es mehrfach versucht, bei mir funkioniert das nicht.
Hallo, Vielen dank für die Anleitung, funktionert alles.
Bei mir taucht nun folgendes Problem auf: Nach einiger Nutzung von Nextcloud werde ich selbst gebannt. Dieses Problem ist bekannt, siehe
https://discourse.crowdsec.net/t/false-positives-occuring-with-nextcloud-and-ebook-reader-kavita/339/2
Die Lösungen dort sind leider nicht für docker setups geeignet, nun bin ich ein wenig ratlos und hab den Bouncer wieder ausgeschalten. Ideen?
Grüße!
Hey psycho0verload
Danke für die Änderungen an der Anleitung.
Ich habe sie versucht umzusetzen – leider ohne Erfolg.
Bei mir kam immer wieder der Fehler (beim Start von Crowdsec):
Deine Tipps aus der Anleitung habe ich befolgt – ohne Erfolg.
Ich habe vorher extra gecheckt, dass kein Container die Range nutzt – dem war so.
Auch nach dem Start habe ich die Container nach der Range gecheckt – keiner hatte die Range.
Kurzum: ich habe keinen Plan warum es nicht ging. Ich bin jetzt zurück auf den “alten” Stand, der funktioniert wenigstens wieder.
Was war denn der Grund oder die Motivation für die Änderung? Was habe ich aktuell für Nachteile, wenn ich es beim “alten” Stand belasse? Bzw. ich würde gerne ja auf den neuen Stand, aber ich habe keine Ahnung warum es nicht ging. :/
Hallo, ich hatte die alte Version von Christian laufen und wollte nun auf Crowdsec updaten. Traefik API funktioniert & ist erreichbar. Zunächst einmal ohne Bouncer (der funktioniert auch nicht): Leider sind meine anderen Container nicht mehr unter ihrer Domain erreichbar (gateway timeout). Benutze den provider duckdns für dnschallenge, also in der traefik.yml habe ich noch
Das funktioniert auch, wenn ich in der API auf traefik gehe, dann kommt “CERTIFICATE RESOLVER: duckdns”. Ansonsten alles wie oben in der Beschreibung, + die beiden Zeilen:
meine container haben nun die Zeilen wie oben bei wordpress, mit certresolver=duckdns. Komischerweise wird mir die Seite sogar als funktionierend in traefik angezeigt, aber ich kann sie nicht erreichen. Was läuft falsch?
Danke für die super geschriebene Anleitung!
Parser Metrics:
+—————————————-+——-+——–+———-+
| Parsers | Hits | Parsed | Unparsed |
+—————————————-+——-+——–+———-+
| child-child-crowdsecurity/traefik-logs | 260 | 60 | 200 |
| child-crowdsecurity/http-logs | 378 | 293 | 85 |
| child-crowdsecurity/sshd-logs | 236 | 18 | 218 |
| child-crowdsecurity/syslog-logs | 63 | 63 | – |
| child-crowdsecurity/traefik-logs | 166 | 126 | 40 |
| crowdsecurity/dateparse-enrich | 144 | 144 | – |
| crowdsecurity/geoip-enrich | 144 | 144 | – |
| crowdsecurity/http-logs | 126 | 124 | 2 |
| crowdsecurity/non-syslog | 5.02k | 5.02k | – |
| crowdsecurity/sshd-logs | 38 | 18 | 20 |
| crowdsecurity/syslog-logs | 63 | 63 | – |
| crowdsecurity/traefik-logs | 146 | 126 | 20 |
| crowdsecurity/whitelists | 144 | 144 | – |
| timokoessler/gitlab-logs | 4.87k | – | 4.87k |
+—————————————-+——-+——–+———-+
Ich bin jetzt nur in einem Punkt unsicher und werde auch aus den CrowdSec Docs nicht ganz schlau. Warum habe ich denn bei Gitlab alle Parser Hits als Unparsed? Muss ich den Parser nochmal explizit aktivieren?
Danke für die Anleitung.
Christian – Ich empfehle noch in den Crontab folgendes einzufügen um die crowdsec Hub Datenbank Aktuell zu halten. Das passiert leider nicht automatisch.
0 * * * * docker exec crowdsec cscli hub update && docker exec crowdsec cscli hub upgrade
Grüße,
Caspar
Vielen Dank für die Anleitung!
Trotz das ich meine, alles genau befolgt zu haben, bekomme ich nur lokal in traefik was zu sehen.
Dort wird alles als success angezeigt, auf den Webseiten wird aber dagegen nichts angezeigt.
Die Ausführung erfolgt über ein Synology-NAS, im Container wird folgendes angezeigt:
traefik:
…level=info msg=”Configuration loaded from file: /traefik.yml”
crowdsec:
…level=info msg=”127.0.0.1 – [Sat, 17 Dec 2022 19:18:09 CET] \”GET /v1/heartbeat HTTP/1.1 200 109.498596ms \”crowdsec/v1.4.3-linux-f2528f3e2966d257905cca47fa1fa0e67cc2e2e8\” \””
crowdsec-bounder-traefik:
[GIN-debug] [WARNING] Running in “debug” mode. Switch to “release” mode in production.
– using env: export GIN_MODE=release
– using code: gin.SetMode(gin.ReleaseMode)
[GIN-debug] GET /api/v1/ping –> github.com/fbonalair/traefik-crowdsec-bouncer/controler.Ping (2 handlers)
[GIN-debug] GET /api/v1/healthz –> github.com/fbonalair/traefik-crowdsec-bouncer/controler.Healthz (2 handlers)
[GIN-debug] GET /api/v1/forwardAuth –> github.com/fbonalair/traefik-crowdsec-bouncer/controler.ForwardAuth (2 handlers)
[GIN-debug] GET /api/v1/metrics –> github.com/fbonalair/traefik-crowdsec-bouncer/controler.Metrics (2 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
[GIN-debug] Listening and serving HTTP on :8080
??? Wie kann ich den Port ändern, Port 8080 will Synology haben?
Alle Container werden ausgeführt, aber im traefik.log kommt dies:
level=info msg=”Testing certificate renew…” providerName=duckdns.acme ACME CA=”https://acme-v02.api.letsencrypt.org/directory”
level=error msg=”middleware \”crowdsec-bouncer@file\” does not exist” entryPointName=http routerName=http-to-https@internal
level=warning msg=”SSLRedirect is deprecated, please use entrypoint redirection instead.” entryPointName=https routerName=traefik@docker middlewareType=Headers middlewareName=default-security-headers@file
level=warning msg=”SSLRedirect is deprecated, please use entrypoint redirection instead.” middlewareName=default-security-headers@file middlewareType=Headers entryPointName=https routerName=portainer@docker
level=warning msg=”SSLRedirect is deprecated, please use entrypoint redirection instead.” routerName=nextcloud@docker middlewareName=default-security-headers@file middlewareType=Headers entryPointName=https
level=warning msg=”SSLRedirect is deprecated, please use entrypoint redirection instead.” middlewareName=default-security-headers@file middlewareType=Headers entryPointName=https routerName=portainer@docker
level=warning msg=”SSLRedirect is deprecated, please use entrypoint redirection instead.” middlewareType=Headers entryPointName=https routerName=traefik@docker middlewareName=default-security-headers@file
??? Leider zeigt der Browser immer nur eine leere Seite an, egal bei welchen Container, z.B auch Portainer, Nextcloud.
??? Zu einer Password-Abfrage kommt es auch nicht. Was mache ich falsch?
Hey.
Erstmal vielen Dank für die tollen Anleitungen.
Ich habe Traefik wie oben beschrieben eingerichtet, was auch erstmal zu einem A+ Rating bei ssllabs führt. Wenn ich allerdings Cloudflare als Proxy vor die Seite schalte, kommt nur ein B Rating heraus, da angeblich TLS 1.0 und 1.1 erlaubt seien?
Ist das Thema bekannt? Entsteht durch den Cloudflare-Proxy tatsächlich eine Schwachstelle oder ist das nur eine fehlerhafte Messung?
Danke und viele Grüße,
Patrick
Moin und besten Dank für die Anleitungen.
Ich bin gerade dabei Nextcloud für zu Hause zu eruieren. Dabei bin ich über diese Seite mit der Traefik-Anleitung gestolpert.
Die Lösung mit einem Reverse-Proxy finde ich sehr reizvoll. Allerdings habe ich ein Problem mit folgender Zeile aus der
docker-compose.yml
der Traefik-Installtion.
– “traefik.http.routers.traefik.rule=Host(
traefik.meinedomain.de
)”Ich habe eine Domain bei Strato.
1) Wie realsiere ich die Erreichbarkeit mehrer Dienste (trafik, Nextcloud, Seafile) hinter einer FritzBox (mit Portfreigaben).
Mit einem Aufruf meiner Domain komme ich auf das Traefik-Dashboard (in der docker-compose.yml steht einfach die Domain). Sobald ich das auf traefik.meinedomain.de ändere erfolgt kein Aufruf der der Seite, bzw des Trafik-Dashboards.
mfg
Hi danke für die tollen Anleitungen.
Ich habe aber mal eine Frage durch Traefik wird ja “nur” noch die IP des Traefik Containers an die Container weiter gegeben.
Wenn ich jetzt aber einen Wartungsmodus einstellen möchte oder so benötige ich ja die eigentliche IP damit man den Wartungsmodus umgehen könnte.
Gibt es eine Möglichkeit die Client IP über Traefik weiterzuleiten?
Danke schon mal für die Antworten.
Gruß Dirk
Hallo psycho0verload,Ich habe einige Probleme mit crowdsec. Ich habe einen Server bei mir zu Hause mit dynamischer IP und irgendwie wenn ich Element.io und Matrix nutze banned crowdsec meine IP oder die meiner Nutzer. Ich muss die also immer manuel wieder freischalten, hatt jemand eine Idee wie ich dies verhinderen kann? LG
Hallo, ich habe vorher die Version von Christian genutzt. Praktisch die alte Variante. Nun habe ich alle Dateien geändert und nach der Anleitung angepasst. Leider kommt bei Punkt 3.6 an dem Traefik öffnen soll nur “404 page not found”.
Keiner meiner Container ist mehr erreichbar. Was kann das sein?
Fehler war in der dynamic_conf.yml, habe die nochmal komplett geleert und neu eingefügt.
Jetzt geht es bis auf nextcloud, da kommt jetzt Internal Server Error.
Sagt mal, habt ihr auch das Problem, dass eure Dienste teilweise (nach intensiverem Arbeiten oder Öffnen vieler Seiten nacheinander z.B.) ein “Forbidden” zurückgeben? Also quasi eure eigene IP gesperrt wird? Vermutlich von CrowdSec.
Hatte ich schon ein paar Mal – liegt bei mir vielleicht auch an der Homepage via Apache, wo natürlich durch DB-Verbindungen noch mehr Traffic entsteht. Kann man den Threshold für CrowdSec irgendwie verändern oder hochstellen? Ist ein wenig nervig so. 😀
Hallo, bei mir klappt es einfach nicht, dass crowdsec alle logs liest. Ich kriege nur: file:/var/log/crowdsec/traefik/access.log hin. Habe auch kontrolliert ob alle .log existieren, aber finde den Fehler nicht…
Hi. Danke erstmal für die tolle Anleitung.
Leider häng ich beim öffnen von der Traefik Webpage.
Ich habe die Anleitung wie beschrieben ausgeführt. Server ist ein Ubuntu 22, habe eine Domäne die auf meine öffentliche IP zeigt und von meinem Modem zum Server Anfragen auf Port 80 und 443 leitet.
Bekomme wenn ich extern die hinterlegte Domäne in der Traefik yaml nur “404 Page not found”.
Läuft durch Cloudflare.
Wenn ich meine Modem Weiterleitung abdrehe bekomm ich die typische Cloudflare Meldung, also kann ich das schonmal ausschließen.
Das steht im Log bei Portainer:
time=”2022-09-25T12:13:50Z” level=info msg=”Configuration loaded from file: /traefik.yml”
time=”2022-09-25T12:14:44Z” level=error msg=”Unable to obtain ACME certificate for domains \”traefik.mm-performance.racing\”: unable to generate a certificate for the domains [traefik.mm-performance.racing]: error: one or more domains had a problem:\n[traefik.mm-performance.racing] acme: error: 403 :: urn:ietf:params:acme:error:unauthorized :: 2606:4700:3031::6815:5442: Invalid response from http://traefik.mm-performance.racing/.well-known/acme-challenge/Xs79dl83c_SmBHQR_v0NCC6AwieMCxNYkYc0LKiQ3cA: 522\n” routerName=traefik@docker rule=”Host(
traefik.mm-performance.racing
)” providerName=http.acme ACME CA=”https://acme-v02.api.letsencrypt.org/directory”Ist mein erstes Mal Traefik aufzusetzen, hat irgendjemand eine Idee?
Vielen Dank für diesen Artikel!
Ist diese Konfiguration von Traefik+Crowdsec vollständig kompatibel zu den “alten” Anleitungen von Christian (Traefik ohne Crowdsec-Anbindung)? Kann ich diese neue Anleitung umsetzten und alle Container, deren Labels an diese neue Anleitung noch nicht geupdated wurden, laufen weiter?
Im Artikel steht zwar, dass es keine vollständige Kompatiblität gibt, aber bedeutet das, dass alles normal funktioniert, nur ohne Crowdsec-Anbindung?
Ich denke diese Frage werden sich mehrere Leute stellen, die viele Container nach Christians Anleitungen laufen haben, und jetzt Stück für Stück alle compose-Dateien anpassen wollen. Und das ohne längere Downtime 😀
Bei mir kommt diese Meldung und der API Schlüssel wird nicht generiert. Wo liegt der Fehler. Vielen Dank für eine Rückmeldung. Ich habe das doch richtig verstanden, unter Pkt. 4.4.1 wird die Syntax nur angehängt bzw ergänzt.
WARN[0000] The “TRAEFIK_BOUNCER_KEY” variable is not set. Defaulting to a blank string.
networks.bouncer-traefik Additional property depends_on is not allowed
Hallo, danke, mein Traefik ist erreichbar.
Hast sich in Zeile 11 /opt/containers/traefik/docker-compose.yml ein Tabfehler eingeschlichen, diesen habe ich bei mir geändert. Es wurde zuvor ein roter Balken in meinen Terminal angezeigt.
VG
Thilo
Verbildlichung:
Von mir wurde da nichts rot makiert!
Hallo psycho0verload , vielen Dank für das super Tutorial. Ich habe es erfolgreich geschafft, Traefik mit Crowdsec zum Laufen zu bekommen. Solange alle Dienste über Docker auf dem gleichen Server laufen ist das auch kein Problem. Bitwarden konnte ich problemlos einbinden.
Ich habe jetzt jedoch noch Dienste, welche (meist unter Docker) auf einem anderen Server laufen. Vor Traefik habe ich Nginx Proxy Manager verwendet. Dort konnte ich einfach zur URL die Zieladresse angeben und gut war (dort hatte ich dann aber massiv Probleme mit dem Austellen/Erneuern von SSL Zertifikaten).
Deshalb meine Frage: Wie kann ich solche Dienste, wie z.B. Nextcloud am besten einbinden? Traefik soll auf https hören, ein Zertifikat ausstellen und dann auf eine HTTP Adresse intern weiterleiten. Ich habe mir schon mal durch die Tips in diesem Forumsbreitrag gewühlt, aber ohne Erfolg: https://community.traefik.io/t/how-to-use-traefik-to-redirect-non-docker-domains-to-other-proxy/1736/4
Vielleicht wäre das ja auch was für ein weiteres Tutorial?
Vielen Dank schon mal,
Ich hab da noch eine frage zu Crowdsec an sich. Ich hab mich jetzt mal mit Absicht mehrmals mit falschen Daten bei Portainer und traefik eingeloggt bzw. es versucht. Meine IP wird aber nicht gesperrt. Ich kann also unendlich viel Versuche unternehmen mich einzuloggen. Ist nun an der Konfiguration was faul, oder verstehe ich es falsch, das man hier neben den anderen funktionen wie fail2ban arbeitet ?
Brthld
Ich habe in der traefik.log auch keine IPs. Aber diese Fehlermeldungen.
time=”2022-08-10T22:47:45+02:00″ level=error msg=”close tcp [::]:443: use of closed network connection” entryPointName=https
time=”2022-08-10T22:47:45+02:00″ level=error msg=”close tcp [::]:80: use of closed network connection” entryPointName=http
time=”2022-08-10T22:47:51+02:00″ level=error msg=”middleware \”crowdsec-bouncer@file\” does not exist” entryPointName=http routerName=http-to-https@internal
time=”2022-08-10T22:47:51+02:00″ level=error msg=”middleware \”crowdsec-bouncer@file\” does not exist” entryPointName=http routerName=acme-http@internal
Ich habe die Erfolgskontrolle nun mal nach hinten geschoben 🙂 Damit sollte der ein oder andere gar nicht über das Problem stolpern 🙂
Bin durch, funktioniert soweit prima. Habe nur, komischerweise, den “traefik.log” nicht in der Statistik drin (und auch syslog nicht), obwohl “traefik.log” geschrieben wird und an der Stelle im Filesystem des Hosts liegt. Komisch. Sonst aber alles prima. Danke für die Anleitung! Echt cool.
Jetzt hab ich den Fehler. Ich habe immer die Installation nicht weiter geführt, wenn die metrics nicht alle logs anzeigt, wie im Artikel beschrieben. Nachdem ich auch den Rest mit dem Bouncer ausgeführt habe, erscheint nun auch das traefik.log unter Sources nach Abschluß der gesamten Installation. Also alles gut jetzt.
Vielen Dank für die Anleitung!
Eine Frage, da ich gerade bei der Umsetzung darauf stoße:
Was bringt uns das Setzen von “proxy” als Standard-Netzwerk in der traefik.yml? Heißt das, dass alle Traefik-aktivierten-Container das dann benutzen und wir es nicht mehr in der Compose-Datei deklarieren müssen? Gefühlt doppelt sich das etwas, aber ich bin unwissend. Daher die (vielleicht) blöde Frage.
Arbeite mich dann weiter durch mit der Anleitung. 🙂
Danke das du sogar mit einem neuen Server durch die Anleitung gegangen bist. Ich hab alles nochmal durchgespielt und muss irgendwo einen Fehler haben. Die access.log ist immer noch da, aber die treafik.log will einfach nicht erscheinen. Da du die Anleitung durchgegangen bist und ein anderer User auch erfolgreich alles erstellen konnte, liegt der Fehler eben nicht an der Anleitung, sondern irgendwo bei mir. Im Grunde ist es ja nur Copy und Paste mit ein paar wenigen Edits. Ich weiß wirklich nicht, wie ich den Fehler jetzt finden kann. Zumal ich auch anscheinend immer den gleichen mache. Hast du noch irgendeinen Ansatzpunkt ?
Also, nochmals überprüft und hatte einen Code nicht drin. Obwohl ich alles mehrfach kontrolliert hatte.
Ich hatte bei den middelwares ein http nicht gesehen und nicht übernommen. Anleitung ist fehlerfrei. Kann ich nun bestätigen.
Sorry, natürich habe ich Traefik mit deiner Anleitung installiert.
docker compose exec traefik /bin/sh geht nicht.
docker compose -it traefik /bin/sh geht
Keine logs in /var/log/traefik
Werde nochmal alles überprüfen.
Ich habe im Ordner /var/log/crowdsec/traefik keine Logdateien. Der Ordner ist leer.
Seltsam, neuer Server gekauft. Debian 11. Traefik nach Chrisitans Anleitung läuft. Nun crowdsec und ich habe auf meinem frischem System auch beide log nicht.
Fehler/Warnung
crowdsec | time=”10-08-2022 07:55:32″ level=warning msg=”No matching files for pattern /var/log/syslog” type=file
crowdsec | time=”10-08-2022 07:55:32″ level=warning msg=”No matching files for pattern /var/log/crowdsec/traefik/*.log” type=file