Neuigkeiten von trion.
Immer gut informiert.

Zertifikate mit Traefik und Google Trust Services in Docker

Illustration SecOps Fox

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.

Still Reliable?
Abbildung 1. Ist ZeroSSL noch immer ein verlässlicher Partner in der Welt der SSL-Zertifikate?

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:

Beispiel docker-compose für Traefik
version: '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:

Beispiel docker-compose für einen Python fastAPI Service
version: '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.




Feedback oder Fragen zu einem Artikel - per Twitter @triondevelop oder E-Mail freuen wir uns auf eine Kontaktaufnahme!

Los geht's!

Bitte teilen Sie uns mit, wie wir Sie am besten erreichen können.