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/



ich bekommen auch nur noch ein B Note
Schuld ist evtl.
This server does not support Forward Secrecy with the reference browsers. Grade capped to B.
This server supports TLS 1.0 and TLS 1.1. Grade capped to B.
Trotzdem schneidet meine Seite aktuell sehr schlecht mit der Standardconfig bei https://observatory.mozilla.org ab.
V.a. wegen dieser Punkte:
– Content Security Policy (CSP) header not implemented
– HTTP Strict Transport Security (HSTS) header not implemented
– X-Content-Type-Options header not implemented
– X-Frame-Options (XFO) header not implemented
– X-XSS-Protection header not implemented
– Referrer-Policy header not implemented (optional)
Hallo, ich habe mit deiner Anleitung meine externen Zugriffe eingerichtet. Soweit ist alles super. Rating A usw.
Ich habe aber noch eine Synology NAS auf die auch extern zugreifen will. Habe dazu viel in Google gesucht.
Wenn ich in die dynamic_conf.yml um diesen Eintrag ergänze, kann ich beim Container bitwarden nicht mehr erreichen. Die anderen Container laufen weiterhin.
http:
routers:
nas220:
service: dsm
middlewares:
– “user-auth”
rule: Host(`123.example.de`)
middlewares:
secHeaders:
headers:
browserXssFilter: true
contentTypeNosniff: true
frameDeny: true
sslRedirect: true
#HSTS Configuration
stsIncludeSubdomains: true
stsPreload: true
stsSeconds: 31536000
customFrameOptionsValue: “SAMEORIGIN”
#AUTH
user-auth:
basisAuth:
users: “user:$$xyz”
services:
dsm:
loadBalancer:
servers:
– url: “http://192.168.178.22:5000” # Auf die richtige URL anpassen.
Ich erhalte dann den Fehler: „404 not found“
Traefik Dashboard zeigt an: „secHeaders@file not found“.
Ich weiß echt nicht mehr weiter. Ohne die Ergänzung zu deinen Einträgen läuft alles.
Kannst du mir bitte weiterhelfen!!!
Hi, leider startet der Docker alle paar Sekunden neu, wenn ich die Änderungen der https Verschlüsselung mache. Hab es mehrere male überprüft und auch schon 2x mal alles von vorne gemacht. keine Chance. der Docker startet, die Ports werden angezeigt und im Status kommt ” Up Less than a second”. Die das Dashboard ist aber nicht erreichbar, beim erneuten Prüfen kommt im Status “Restarting (1) 27 seconds ago”.
Wenn ich die Änderungen zurücksetze, erscheint das Dashboard wieder
Hi Christian,
vielen Dank für die Anleitung, die neben den beiden anderen Teilen so bei mir auch ziemlich gut funktioniert.
Eine einzige Einschränkung habe ich, die ich mir nicht ganz erklären kann:
Für das A+ Rating bei Traefik benötigt es ja u.a. diesen Eintrag in der docker.compose:
– “traefik.http.routers.traefik-secure.middlewares=secHeaders@file”
Wenn ich den hinzufüge, entfällt bei mir die Passwortabfrage beim Aufruf der Traefik-Domain. Nehme ich den Eintrag wieder raus, ist sie wieder da. Kannst du dir das erklären?
Wenn ich nichts sehr dummes übersehen habe, habe ich mich an alle Schritte wie bei dir beschrieben gehalten.
Viele Grüße,
Martin
Wenn das label
38 # - "providers.file.filename=/dynamic_conf.yml"
39 # - "traefik.http.routers.traefik-secure.middlewares=secHeaders@file"
in der docker-compose.yml aktiv sind, ist das Traefik-Dashboard bei mir auch ohne jegliche Authentifizierung erreichbar, wenn die beiden Zeilen auskommentiert sind wie hier zitiert, dann kommt der Login-Dialog….
Was läuft da möglicherweise falsch? Wäre etwas fatal, wenn jeder über die subdomain traefik.example.org auf das Traefik-Dashboard schauen könnte….
Hallo zusammen,
tausend Dank für die super Anleitung, die hat mir wirklich weiter geholfen,
bei mir läuft das ganze auf einem Pi unter Raspian Buster.
Hier noch zwei Korrekturen die ich einbauen musste:
– Beim Filename in der traefik.yaml hat ein “.” gefehlt, sonst wurde die dynamic_conf.yml nicht gezogen
Old:
file:
filename: “/dynamic_conf.yml”
New:
file:
filename: “./dynamic_conf.yml”
– Für A+ bei SSLLabs war eigentlich alles da, ich musste aber in jeder docker-compose.yml folgende Zeile bei den Labels einbauen:
– “traefik.http.routers.APPNAME-secure.middlewares=secHeaders@file”
Old:
– “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.middlewares=traefik-auth,secHeaders@file”
– “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”
New:
– “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=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.middlewares=traefik-auth”
– “traefik.http.routers.traefik-secure.tls=true”
– “traefik.http.routers.traefik-secure.tls.certresolver=http”
– “traefik.http.routers.traefik-secure.service=api@internal”
– “traefik.http.routers.traefik-secure.middlewares=secHeaders@file”
– “providers.file.filename=/dynamic_conf.yml”
Zur Aufklärung, ich habe für jeden Container ein eignes docker-compose.yml File, deshalb habe ich diese Zeile in jedem YML einfügen müssen.
Seit dem haben alle Seiten eine A+ Bewertung.
Hallo,
vielen Dank für die sehr ausführlichen Anleitungen. Ich habe die Anleitung hier auf zwei Rechner 1zu1
umgesetzt. Bei dem einen erhalte ich ein A-Report und bei dem anderen nur ein B.
Sehr merkwürdig. Gibt es noch andere Faktoren die das ganze beeinflussen?
Hallo,
weiß nicht mehr weiter. Habe die Anleitungen befolgt.
Bei mir kommt im Firefox erst:
PR_END_OF_FILE_ERROR
und dann
SSL_ERROR_INTERNAL_ERROR_ALERT
Wenn ich traefik lokal aufrufe, geht alles. Dort wird auch kein Fehler angezeigt im Webinterface.
Weiß jemand Rat?
Danke.
Tobias
Vielen Dank mal wieder für die super Anleitung.
Für alle die mit Gnome Online Accounts auf ihre Nextcloud zugreifen könnte es hier nach zu Problemen kommen weil openssl anscheinend mit dieser Cipher strenge noch nicht ganz klar kommt.
Mit diesen TLS1.2 Ciphers konnte ich den Fehler bei der Anmeldung über das Gnome Controler Center beheben:
TLS_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA256
TLS_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_AES_256_GCM_SHA384
Bin mir nicht ganz sicher, wie ich herausfinde was OpenSSL in Verbindung mit goa für Ciphers tatsächlich unterstützt, aber anscheinend braucht es eine Kombination auf RSA und AES für den Handshake.
Wer näheres weiß….