Zertifikate mit Traefik und Google Trust Services in Docker
Gerade wenn es um Side-Projects oder Hobbyprojekte geht, ist das Budget oft begrenzt.
Dann ist es besonders wichtig, dass keine zusätzlichen Kosten für TLS Zertifikate anfallen.
Im Zentrum eines solchen Projekts steht ein Vue.js-Frontend, das sich mit einer HTTP API verbinden soll.
Natürlich mit der erforderlichen Sicherheit, die Transport Layer Security (TLS) bieten kann.
Bislang war ZeroSSL besonders deswegen attraktiv, da keine Rate-Limits kreativer Forschung entgegen standen. Allerdings liefert ZeroSSL seit einiger Zeit fehlerhafte (abgelaufene) Zertifikate aus der Vergangenheit oder auch API Fehler.
Da ACME ein Standard ist, sollte das auch mit anderen Anbietern gehen, und ein weiterer Anbieter ist Google.
Ausgangslage
Die Bedeutung von TLS kann nicht genug betont werden, vor allem wenn Anwendungen über das Internet zugänglich sind. Mit der zunehmenden Anzahl von Cyberangriffen und Datenlecks ist es wichtiger denn je, dass der Datenverkehr zwischen Client und Server verschlüsselt ist, um die Privatsphäre der Nutzer und die Integrität der übertragenen Daten zu schützen.
Darüber hinaus erleichtert die Integration in moderne Technologien wie Docker und Traefik die Implementierung von TLS erheblich. Traefik, ein moderner Reverse Proxy und Load Balancer, ist dafür bekannt, dass er die Bereitstellung von Microservices vereinfacht. Eine der Eigenschaften von Traefik ist seine Fähigkeit, nahtlos mit Containertechnologien wie Docker zu arbeiten. Durch die richtige Konfiguration von Traefik kann ein Entwickler einfach ein Label zu einem Docker-Container hinzufügen, das den Hostnamen angibt. Traefik kümmert sich dann automatisch um alles Weitere: Es besorgt ein gültiges SSL-Zertifikat für diesen Hostnamen, implementiert TLS für die sichere Kommunikation und hält das Zertifikat aktuell. Dieser Prozess entlastet Entwickler erheblich, da sie sich nicht um die manuelle Verwaltung und Erneuerung von Zertifikaten kümmern müssen.
Die Kombination von kostenlosen SSL-Zertifikatsdiensten und der Automatisierung durch Traefik bietet eine starke Grundlage für die Sicherheit privater Projekte. Dies ermöglicht es Entwicklern, sich auf das Wesentliche zu konzentrieren: Die Entwicklung von Anwendungen, ohne Kompromisse bei der Sicherheit eingehen zu müssen.
Tschüss ZeroSSL
In letzter Zeit scheint es um ZeroSSL eher ruhig geworden zu sein. Ein Blick auf ihre Social-Media-Aktivitäten, speziell X, verrät, dass der letzte Tweet bereits im Februar 2021 veröffentlicht wurde, gefolgt von einem Repost im November desselben Jahres. Diese Stille wirft Fragen über die Dynamik und Aktualität ihrer Kommunikation auf.
Ein Besuch auf der ACME API Statuspage von ZeroSSL offenbart ein aufschlussreiches Bild: Der Service scheint intermittierend verfügbar zu sein. Mal funktioniert er, mal nicht. Diese Beobachtung deckt sich mit unseren eigenen Erfahrungen und lässt uns über die Zuverlässigkeit und Stabilität des Dienstes nachdenken.
Hallo Google Trust Services
Google Trust Services (GTS) ist ein von Google bereitgestellter Dienst, der darauf abzielt, das Internet sicherer zu machen, indem es vertrauenswürdige digitale Zertifikate für die Verschlüsselung von Webverkehr anbietet. Diese Zertifikate sind ein wesentlicher Bestandteil der SSL/TLS-Verschlüsselung, die dazu dient, die Daten, die zwischen einem Webbrowser und einem Server übertragen werden, zu sichern. Das Hauptziel von Google Trust Services ist es, eine zuverlässige und skalierbare Infrastruktur zur Verfügung zu stellen, die es ermöglicht, dass Websites und digitale Dienste sichere Verbindungen aufbauen können. Dadurch wird nicht nur der Datenschutz und die Datensicherheit für Endbenutzer erhöht,sondern auch das Vertrauen in digitale Transaktionen und Kommunikation gestärkt.
GTS entstand aus der Notwendigkeit heraus, ein einheitlicheres und kontrollierteres Umfeld für die Ausstellung und Verwaltung von digitalen Zertifikaten zu schaffen. In der Vergangenheit war der Markt für SSL/TLS-Zertifikate von einer Vielzahl von Zertifizierungsstellen (CAs) geprägt, was zu Inkonsistenzen in der Qualität und Sicherheit der Zertifikate führte. Google wollte mit GTS eine zuverlässigere Lösung anbieten, die strenge Sicherheitsstandards und Best Practices in der Branche einhält.
Google Trust Services einrichten
Der Beginn ist ein Google Cloud Konto. Falls Sie noch keins besitzen, erstellen Sie sich hier ein Google Cloud Konto. Dies geht schnell, erfordert allerdings die Angabe einer Kreditkarte als Zahlungsmittel, damit geprüft werden könne, dass man kein Roboter ist und um Missbrauch zu vermeiden. Um die Google Trust Services nutzen zu können braucht man aber keine Kostenpflichtigen Abonnements abzuschliessen, das Testkonto reicht völlig. Wenn die Probezeit abgelaufen ist, kann man die kostenfreien Angebote trotzdem weiter benutzen.
Mit der Cloudshell
Am einfachsten geht die Konfiguration vonstatten, wenn Sie die Cloud Shell verwenden.
Um ein Projekt anzulegen muss zunächst eine initiale Authentifizierung erfolgen.
$ gcloud auth login
Ist dieser Schritt geschafft, erstellen wir ein neues Google Cloud-Projekt mit dem Namen cert-signing
:
$ gcloud projects create cert-signing
Wählen Sie das von Ihnen erstellte Google Cloud-Projekt aus:
$ gcloud config set project cert-signing
Nun aktivieren wir noch die Public CA API als Service:
$ gcloud services enable publicca.googleapis.com
Führen Sie nun diesen Befehl aus, um eine EAB-Schlüssel-ID und einen HMAC anzufordern:
$ gcloud publicca external-account-keys create
Dies gibt ein EAB-Secret zurück, das in der Produktionsumgebung der Public CA gültig ist.
Im Antworttext enthält das Feld keyId
die EAB-Schlüssel-ID und das Feld b64MacKey
den EAB-HMAC.
Sie müssen ein EAB-Secret innerhalb von sieben Tagen nach Erhalt verwenden. Das EAB-Secret wird entwertet, wenn Sie es nicht innerhalb von sieben Tagen verwenden. Das mit einem EAB-Secret registrierte ACME-Konto hat kein Ablaufdatum.
Betrieb von Traefik mit docker-compose.yml
Um Traefik effizient zusammen mit Containern zu nutzen, bietet sich die Verwendung von Docker in Kombination mit Docker-Compose an.
Dies ermöglicht es, Traefik als Reverse Proxy und automatischen Zertifikatsmanager für ihre Containeranwendungen zu konfigurieren.
Hier ist ein beispielhaftes docker-compose.yml
-File für den Betrieb von Traefik:
docker-compose
für Traefikversion: '3.9'
services:
traefik:
image: "traefik:latest"
command:
- "--api.insecure=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--entrypoints.web.http.redirections.entrypoint.to=websecure"
- "--entrypoints.web.http.redirections.entrypoint.scheme=https"
- "--certificatesresolvers.myCertResolver.acme.httpchallenge=true"
- "--certificatesresolvers.myCertResolver.acme.httpchallenge.entrypoint=web"
- "--certificatesresolvers.myCertResolver.acme.storage=/certs/acme.json"
- "--certificatesresolvers.myCertResolver.acme.email=muster@example.com"
- "--certificatesresolvers.myCertResolver.acme.caserver=https://dv.acme-v02.api.pki.goog/directory"
- "--certificatesresolvers.myCertResolver.acme.eab.kid=EAB-Schlüssel-ID"
- "--certificatesresolvers.myCertResolver.acme.eab.hmacencoded=EAB-HMAC"
ports:
- "80:80"
- "443:443"
- "8080:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
- "./certs:/certs"
networks:
- traefik_network
networks:
traefik_network:
external: true
Erstellen Sie im selben Verzeichnis wo die docker-compose.yml
liegt einen Ordner certs
.
Darin wird die acme.json
erstellt, wo die Zertifikate gespeichert werden.
Beschränken Sie mit
$ chmod 600 certs/acme.json
die Zugriffsrechte auf die Datei.
Traefik External Network
Das Einrichten des traefik_network
als externes Netzwerks ist eine Möglichkeit um sicherzustellen, dass Traefik unabhängig von anderen Docker-Compose Setups verwendet werden kann.
Zudem ermöglicht ein separates Netzwerk eine klarere Trennung des Datenverkehrs der durch Traefik verwaltet wird, von dem restlichen Netzwerkverkehr in Ihrer Docker-Umgebung.
Die Erstellung eines solchen Netzwerks erfolgt mit folgendem Befehl
$ docker network create traefik_network
Betrieb einer API in einem Docker Container, die von Traefik TLS gesichert werden soll
Nachfolgend ein Beispiel für ein docker-compose.yml
, das zeigt, wie ein FastAPI-Service, der auf Port 8000 lauscht, durch Traefik mit TLS gesichert werden kann:
docker-compose
für einen Python fastAPI Serviceversion: '3.9'
services:
api:
restart: unless-stopped
stop_signal: SIGINT
labels:
- "traefik.enable=true"
- "traefik.http.routers.api.rule=Host(`host.example.com`)"
- "traefik.http.routers.api.tls.certresolver=myCertResolver"
- "traefik.http.routers.api.entrypoints=websecure"
- "traefik.http.routers.api.tls=true"
- "traefik.http.services.api.loadbalancer.server.port=8000"
networks:
- traefik_network
networks:
traefik_network:
external: true
Wie im Beispiel ersichtlich, genügen sechs Traefik-Labels, um den Container abzusichern.
Bei traefik.http.routers.api.rule
sollte natürlich Ihr Host eingetragen werden.
Hört ihre API auf Port 80, kann die Zeile traefik.http.services.api.loadbalancer.server.port=8000
weg gelassen werden.
Fazit
Dank dieser Konfiguration gelingt es, Projekte nicht nur rasch, sondern auch mit einem hohen Maß an Sicherheit zu deployen.
Um die Effizienz dieses Prozesses weiter zu steigern, kann der Einsatz eines
Wildcard-DNS-Eintrags wie *.dev.example.com
hilfreich sein.
Dieser verweist auf die Traefik-Adresse.
Das bedeutet, für weitere Anwendungen muss lediglich der gewünschten Hostnamen im Label spezifiziert werden und der Container ist unmittelbar verfügbar.
Diese Methode erlaubt eine nahtlose und dynamische Handhabung von Projekten, indem sie die Notwendigkeit eliminiert, manuell Eingriffe in die DNS-Konfiguration für jedes neue Subdomain-Projekt vorzunehmen.
Ein echter Game-Changer, der Zeit spart und gleichzeitig die Flexibilität der Projekte erhöht.