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"
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"
Anschließend löscht ihr folgende Zeile:
- "traefik.http.routers.traefik-secure.middlewares=traefik-auth"
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
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"
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
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 -d
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"
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.
Christian: Auf deinen ssllabs-Screenshots habe ich nicht gesehen, ob du DNS Certification Authority Authorization (CAA) implementiert hast. Das ändert zwar die Endnote nicht, erhöht die Sicherheit deiner Seite aber bei nur ein paar Minuten Aufwand. Mehr Infos: https://github.com/ssllabs/research/wiki/SSL-and-TLS-Deployment-Best-Practices#16-use-dns-caa & https://sslmate.com/caa/
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
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ß….
Hallo und vielen Dank für die Anleitung, die haben mich echt gerettet.
Bei dem SSL Test ist mir aufgefallen, das der IE11 unter Win7-8.1 und WP 8-8.1 sowie ältere Kombinationen aus Safari und OS X den TLS Handshake verweigern. Wenn diese Kombinationen auf den Server zugreifen können sollen, kann die Liste der cipherSuites um TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 erweitert werden. Dieses wird zwar als schwach bewertet, verschlechtert aber nicht den SSL Test Score.
Hi!
Coole Sache. Nur ist bei mir die dahinterliegende Site schnarchlangsam (nextcloud), und was für mein ein no-go ist, ist die Tatsache, dass traefik google-Schnüffel-Services eingebunden hat, und 3 verschiedene Fremdquellen für JavaScript verwendet. Für ein selbstgehostetes Service no way!
Die anleitungen sind aber prinzipiell sehr gut. Danke dafür!
Hallo,
Warum benutzt du nicht nur 1.3 TLS ?
Für Private zwecke vollkommend ausreichend?
Gabish
stsecludeSubdomains: true
Ich glaube da ist ein Schreibfehler, zumindest hat es bei mir erst funktioniert als ich die ganze Zeile auskommentiert habe.
Lustigerweise kam dann auch noch der “middleware \”secHeaders@file\” does not exist-Fehler, der war aber weg nachdem die dynamic_conf.yml geändert wurde.
docker logs traefik
time=”2020-09-27T17:26:30+02:00″ level=info msg=”Configuration loaded from file: /traefik.yml”
time=”2020-09-27T17:26:30+02:00″ level=error msg=”Cannot start the provider *file.Provider: field not found, node: stsecludeSubdomains”
time=”2020-09-27T17:26:31+02:00″ level=error msg=”middleware \”secHeaders@file\” does not exist” entryPointName=https routerName=traefik-secure@docker
Guten tag, ich habe traefik mit hilfe der obigen anleitung installiert (raspberry 4b, arm64v8, ), allerdings bleibt die datei acme.json leer. D.h. es wird offensichtlich kein zertifikat geholt. In der log-datei von traefik steht:
_the router traefik-secure@docker uses a non-existent resolver: http_. Ich habe die subdomains traefik und nextcloud eingerichtet (A-record) und kann die oberfläche von traefik nach bestätigung der unsicheren verbindung aufrufen. Was könnte ich falsch gemacht haben?
Herzlichen dank.
Mit freundlichen grüßen
Joachim Köstler
Hallo, danke, geile Anleitung, mein Fehler war:
RULE
Host(`xxxxxxxx.net`)
NAME
nextcloud-app-secure@docker
ENTRYPOINTS
https
SERVICE
ERRORS
middleware “secHeaders@file” does not exist
Viele Grüße
Matthias
Hallo,
erst mal viiiieeelen dank für deine super Anleitungen!!!
Ich bin deiner Anleitung zur verbesserung der Sicherheit gefolgt, aber ich bekomme leider immer noch ein B Rating.
Auch Clear Cache hilft nicht.
Der Grund laut SSLLab ist:
# 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.
Hab ich irgendwo einen Fehler gemacht?
Ach ja, ich hab deb Server zuhause stehen und benutze Duckdns. Kann das damit zusammenhängen?
Gruß Bert
Wenn ich diese Zeile nicht auskommentiere, ist traefik und somit auch alle anderen Dienste nicht mehr zu erreichen.
– “traefik.http.routers.traefik-secure.middlewares=traefik-auth,secHeaders@file”
Ist das bei Euch anders?
Was stimmt da nicht?
VG Hardy
Hi Christian!
Vielenvielenvielenvielenvieln VIELEN Dank für diese tollen Anleitungen!
Ich probiere mich gerade daran mittels try and error. Die Anleitungen sind eine super Hilfe!
Stoße aber nun auf ein Problem: ich komme von der Grundinstallation und bin rüber zur Nextlcoud-Installation. Nach dem Punkt der Dateien Anpassungen wollte ich Nextcloud aufrufen zur Datenbankanbindung: da erhalte ich nun einen “404 not found” Fehler.
Traefik Dashboard zeigt an: “secHeaders@file not found”. Habe dieses Problem bereits in einem Kommentar gesehen und anschließend die SSL/TLS-Anleitung umgesetzt.
Dabei ist mir folgendes aufgefallen: /opt/containers/traefik/docker-compose.yml unterscheidet sich neben den Pfaden auch in Zeile 31, da der Eintrag “- “traefik.http.routers.traefik-secure.middlewares=traefik-auth” um den “traefik-auth,secHeaders@file” erweitert wird.
Füge ich dies hinzu, erhalte ich auch beim traefik einen 404 error.
Nun stehe ich ein wenig auf dem Schlauch. Bin ich irgendwo vom roten Faden abgekommen?
Viele Grüße aus Hamburg,
Patrick
Hi, danke für den super Post mit guter Beschreibung der Traefik Konfiguration im Swarm Mode. Bist du noch am forschen, wie man auch ein A+ Rating bekommt?
Dein Screenshot zeigt die Information “This site works only in browsers with SNI support.”, welche ich auch bekomme. Zum Vergleich habe ich ein A+ Rating mit einem HAProxy und diese Information ist der einzige Unterschied. Wäre interessant zu wissen, wie man A+ erreicht.
Danke!