Mit Hilfe der Webseite SSL Labs könnt ihr die Sicherheit eurer HTTPS Verbindung testen. Standardmäßig schaff Traefik hier leider nur die Note “B”. Ich zeige euch hier, wie ihr dies schnell ändern könnt.
Update
| 12.05.2021 | Fehler verbessert. Login wurde übersprungen. |
| 30.04.2021 | Fehler verbessert. Danke an Sebastian Bauer für die Hinweise. |
| 26.04.2020 | Dynamic.yml erweitert |
| 27.03.2020 | Erstellung dieser Anleitung. |
In dieser Anleitung habe ich bereits beschrieben, wie man Traefik installiert und konfiguriert. Hier beziehe ich mich auf die gesamten Ordner / Dateistrukturen aus dieser Anleitung. Diese müsst ihr bei euch gegebenfalls ändern.
1. dynamic_conf.yml anlegen
Zuerst müssen wir eine Dynamische Konfigurationsdatei für Traefik anlegen.
nano /opt/containers/traefik/data/dynamic_conf.yml
Inhalt:
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:
secHeaders:
headers:
browserXssFilter: true
contentTypeNosniff: true
frameDeny: true
sslRedirect: true
#HSTS Configuration
stsIncludeSubdomains: true
stsPreload: true
stsSeconds: 31536000
customFrameOptionsValue: "SAMEORIGIN"
Code-Sprache: PHP (php)
In dieser Datei werden die TLS Verbindungen für alle späteren Anwendungen festgelegt.
2. bestehende Docker Compose Datei anpassen
Nun müssen wir noch unsere Traefik docker-compose.yml anpassen.
nano /opt/containers/traefik/docker-compose.yml
Dabei müssen wir NUR diese drei Zeilen hinzufügen:
volumes:
- ./data/dynamic_conf.yml:/dynamic_conf.yml
labels:
- "providers.file.filename=/dynamic_conf.yml"
- "traefik.http.routers.traefik-secure.middlewares=secHeaders@file,traefik-auth"Code-Sprache: PHP (php)
Anschließend löscht ihr folgende Zeile:
- "traefik.http.routers.traefik-secure.middlewares=traefik-auth"Code-Sprache: JavaScript (javascript)
Hier ist meine fertige Docker Compose Datei. Bei euch kann diese anders aussehen.
version: '3'
services:
traefik:
image: traefik:v2.1
container_name: traefik
restart: unless-stopped
security_opt:
- no-new-privileges:true
networks:
- proxy
ports:
- 80:80
- 443:443
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./data/traefik.yml:/traefik.yml:ro
- ./data/acme.json:/acme.json
- ./data/dynamic_conf.yml:/dynamic_conf.yml
labels:
- "traefik.enable=true"
- "traefik.http.routers.traefik.entrypoints=http"
- "traefik.http.routers.traefik.rule=Host(`traefik.euredomain.de`)"
- "traefik.http.middlewares.traefik-auth.basicauth.users=xxxx:xxxxxx"
- "traefik.http.middlewares.traefik-https-redirect.redirectscheme.scheme=https"
- "traefik.http.routers.traefik.middlewares=traefik-https-redirect"
- "traefik.http.routers.traefik-secure.entrypoints=https"
- "traefik.http.routers.traefik-secure.rule=Host(`traefik.euredomain.de`)"
- "traefik.http.routers.traefik-secure.tls=true"
- "traefik.http.routers.traefik-secure.tls.certresolver=http"
- "traefik.http.routers.traefik-secure.service=api@internal"
- "providers.file.filename=/dynamic_conf.yml"
- "traefik.http.routers.traefik-secure.middlewares=secHeaders@file,traefik-auth"
networks:
proxy:
external: true
Code-Sprache: PHP (php)
3. bestehende traefik.yml Datei anpassen
Dazu öffnen wir folgende Datei:
nano /opt/containers/traefik/data/traefik.yml
Hier fügt ihr folgendes hinzu:
file:
filename: "./dynamic_conf.yml"Code-Sprache: JavaScript (javascript)
Fertige Datei:
api:
dashboard: true
entryPoints:
http:
address: ":80"
https:
address: ":443"
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
file:
filename: "./dynamic_conf.yml"
certificatesResolvers:
http:
acme:
email: test@example.com
storage: acme.json
httpChallenge:
entryPoint: http
Code-Sprache: JavaScript (javascript)
4. Traefic neu starten
Nun könnt ihr Traefik per Docker neu starten. Gebt dazu folgendes ein:
#beenden
docker-compose -f /opt/containers/traefik/docker-compose.yml down
#starten
docker-compose -f /opt/containers/traefik/docker-compose.yml up -dCode-Sprache: PHP (php)
5. Webseite erneut testen
Nun könnt ihr den Test für euer Webseite erneut starten. Das ist mein Ergebnis.
Wenn ihr noch das Alte seht, dann müsst ihr auf “Clear Cache” klicken.
6. Andere Docker Container absichern
Damit auch eure anderen Docker Container abgesichert sind, müsst ihr in die jeweiligen docker-compose.yml immer folgende Zeile hinzufügen:
labels:
- "traefik.http.routers.<Name der APP>-secure.middlewares=secHeaders@file"Code-Sprache: HTML, XML (xml)
Dadurch wird sich der Container immer diese Einstellungen nehmen.
7. Quellen
https://docs.traefik.io/https/tls/
https://www.ssllabs.com/ssltest/
https://www.simplecto.com/improve-traefik-https-encryption-qualys-ssl-labs-testssl-sh/
https://adminsecurity.guru/traefik-v2-ssllabs-A-plus/



Guter Artikel, endlich mal ziemlich viele Informationen über ein Thema zentral an einer Stelle und das auch noch auf Deutsch 😉
Ein paar Anmerkungen:
– sslRedirect: true im 1. Schritt ist veraltet, es ist besser das zentral in der traefik.yml durchführen zu lassen: https://doc.traefik.io/traefik/routing/entrypoints/#redirection
– mir ist nicht klar, warum providers.file.filename 2x definiert ist. Einmal in der traefik.yml und einmal in der docker-compose (wer gleich mehrere dynamische Konfigurationen laden möchte, sollte ohnehin besser providers.file.directory verwenden)
– anstatt die secHeaders@file jedes Mal via Label einzubinden kann man auch über die traefik.yml gehen. Dann muss man das nicht bei allen Containern angeben. Das sieht dann ungefähr so aus:
entryPoints:
__web:
____address: :80
____# Auto redirect to https
____http:
______redirections:
________entryPoint:
__________to: websecure
__________scheme: https
__________permanent: true
__websecure:
____address: :443
____http:
____# Inject middlewares
____middlewares:
______- redirect-www-to-non-www@file # auto Weiterleitung von http://www.domain.tld auf domain.tld
______- secHeaders@file # Einbinden der secHeaders Middleware
Einbindung via label:
– ‘traefik.http.routers..entrypoints=web, websecure’
Eine schnelle Überprüfung, ob HSTS funktioniert kann auf https://gf.dev/hsts-test durchgeführt werden.
Wer HSTS einsetzt kann auch darüber nachdenken direkt den nächsten Schritt zu gehen: https://hstspreload.org/ und HSTS Preload anbieten.
Dein Domainverwalter muss allerdings das Setzen von CAA-DNS-Einträgen unterstützen.
Hi Christian,
SPEK-TA-KU-LÄR! Vielen Dank!
Ich hab ewig versucht, das mit Containern und SSL hinzubekommen. Bin 1 Mio mal an “could not connect” gescheitert, weil Netzwerk-Rookie. Jetzt hatz geklappt!
Das hätte ohne diese Anleitung nicht gefunzt.
Eine Frage habe ich habe noch: wie komme ich denn nun wieder zum Traefik zurück? Port 80/443 zeigen ja nun auf opencloud. Ein direkter Aufruf der Ip des Traefik-containers klappt auch nicht.
Wo lauscht denn nun die Traefik-UI?
Danke und Grüße,
Thomas