Table of Contents
Warum Secrets Management in Docker Swarm wichtig ist
In modernen containerisierten Workflows müssen sensible Informationen wie Datenbankpasswörter, API-Token, TLS-Zertifikate und Verschlüsselungsschlüssel äußerst sorgfältig behandelt werden. Das Speichern von Geheimnissen in Umgebungsvariablen, Konfigurationsdateien, die in Bildern eingebrannt oder im Anwendungscode fest codiert sind, birgt ernsthafte Sicherheitsrisiken: Geheimnisse können durch Bildschichten sickern, in Protokollen ausgesetzt werden oder von nicht autorisierten Containern aufgerufen werden. Docker Swarm Mode adressiert diese Bedenken mit einem nativen Secrets-Management-System, das Geheimnisse in Ruhe und auf der Durchreise verschlüsselt, Zugriff nur auf explizit autorisierte Dienste gewährt und sie in Containern als ephemere Dateien einfügt - sie werden niemals im Bild verbleiben oder durch Laufzeitbefehle ausgesetzt.
Richtiges Secrets Management ist ein Eckpfeiler der Containerorchestrierung in der Produktion. Durch die Nutzung der eingebauten Secrets-Funktion von Docker können Teams die Angriffsfläche reduzieren, die Einhaltung von Standards wie PCI-DSS oder SOC 2 vereinfachen und einen klaren Audit-Trail darüber führen, welche Dienste Zugriff auf welche Secrets haben. Dieser Artikel bietet eine maßgebliche, schrittweise Anleitung zur Implementierung von Secrets Management im Docker Swarm Mode, die von grundlegenden Konzepten bis hin zu fortschrittlichen operativen Praktiken alles abdeckt.
Docker Secrets in der Tiefe verstehen
Was sind Docker Secrets?
Docker-Secrets sind verschlüsselte Blobs sensibler Daten, die im internen Datenspeicher des Schwarms gespeichert werden (verwaltet von der Raft-Konsensusgruppe) und nur an die Container geliefert werden, die sie benötigen. Im Gegensatz zu Umgebungsvariablen sind Geheimnisse niemals über oder in der Containerumgebung sichtbar - sie werden als Dateien im Container-Dateisystem gespeichert, typischerweise unter . Dieser dateibasierte Ansatz stellt sicher, dass Geheimnisse nicht versehentlich durch Befehlszeilenhistorie, Protokollausgaben oder Debugging-Tools aufgedeckt werden.
Wie sich Schwarmgeheimnisse von anderen Ansätzen unterscheiden
Viele Orchestrierungslösungen setzen auf externe Secret Stores (HashiCorp Vault, AWS Secrets Manager, Azure Key Vault) und erfordern benutzerdefinierte Sidecar-Container oder SDK-Integrationen. Die eingebauten Secrets von Docker Swarm bieten einen einfacheren, integrierten Pfad: keine zusätzlichen Dienste, keine Anbieter-Lock-in und keine komplexen Sanitärinstallationen. Secrets werden automatisch mit der kryptografischen Schicht von Swarm (AES‐256‐GCM in modernen Versionen) verschlüsselt und über TLS‐gesicherte Steuerungsebenenkanäle übertragen. Dieser native Ansatz ist ideal für Teams, die eine schlüsselfertige Lösung ohne Hinzufügen externer Abhängigkeiten wünschen.
Hauptmerkmale von Docker Swarm Secrets
- Verschlüsselung im Ruhezustand und im Transit: Geheimnisse werden verschlüsselt, wenn sie im Raft-Log des Schwarms gespeichert und an Manager- und Worker-Knoten übertragen werden.
- Unveränderlichkeit: Einmal erstellt, kann ein Geheimnis nicht geändert werden. Um ein Geheimnis zu „aktualisieren, müssen Sie ein neues erstellen und Dienste, die darauf verweisen, neu bereitstellen.
- Zugang zu den am wenigsten privilegierten Zugriffen: Geheimnisse werden nur in Containern gespeichert, deren Servicedefinition das Geheimnis explizit einschließt.
- Keine Umgebung variable Leckage: Im Gegensatz zu werden Geheimnisse nie über Umgebungsvariablen übergeben, wodurch das Risiko einer versehentlichen Exposition in Kind Prozesse oder Debugging Befehle.
- Automatische Bereinigung: Wenn ein Dienst entfernt wird, werden die zugehörigen geheimen Dateien aus dem Container-Dateisystem gelöscht.
Voraussetzungen für die Verwendung von Docker Swarm Secrets
Bevor Sie in die Umsetzung einsteigen, stellen Sie sicher, dass Ihre Umgebung diese Anforderungen erfüllt:
- Ein Docker-Swarm-Cluster (ein einzelner Knotenschwarm reicht zum Testen aus, aber die Produktion sollte mehrere Manager verwenden).
- Docker Engine 1.13 oder höher (Geheimnisse wurden in Docker 1.13 / API v1.25) eingeführt.
- Alle Knoten im Schwarm müssen Teil des gleichen Clusters und zeitsynchronisiert (NTP empfohlen) sein, um Probleme mit der Zertifikatvalidierung zu vermeiden.
- wurde auf dem Manager-Knoten ausgeführt, und alle Arbeiter-Knoten haben sich dem Schwarm angeschlossen.
Schritt-für-Schritt-Anleitung zur Implementierung von Geheimnissen in Docker Swarm
Ein Geheimnis schaffen
Geheimnisse können aus Dateien oder aus wörtlichen Strings erstellt werden. Der empfohlene Ansatz ist die Verwendung von Dateien, da sie vermeiden, den geheimen Wert in Shell-Historie oder Protokollen zu enthüllen.
Erstellen eines Geheimnisses aus einer Datei
echo "my-super-secure-password" > secret-file.txt
docker secret create db_password secret-file.txt
Der Befehl gibt die ID des Geheimnisses zurück (eine 25-stellige Hex-Zeichenfolge), mit der Sie die Schöpfung überprüfen können.
Erstellen eines Geheimnisses von Stdin (ohne eine Datei auf der Festplatte zu hinterlassen)
printf "my-api-token" | docker secret create api_token -
Die Verwendung von anstelle von verhindert, dass eine zusätzliche Newline hinzugefügt wird (abhängig vom Betriebssystem). Der Bindestrich zeigt an, dass das Geheimnis von stdin gelesen wird, was die sicherste Methode beim Skripting ist.
Erstellen eines Geheimnisses aus einem Literalen Wert (nicht für das Skripting empfohlen)
docker secret create my_secret "literal-value"
Diese Methode ist weniger sicher, da der Literalwert in der Shell-Historie, den Befehls-Audit-Logs oder den Prozesslisten erscheinen kann, vorzugsweise in der datei- oder stdinbasierten Erstellung.
Auflistung und Inspektion von Geheimnissen
Um alle Geheimnisse im Schwarm aufzulisten:
docker secret ls
Um Details zu überprüfen (nur Metadaten - der geheime Wert wird nie offenbart):
docker secret inspect db_password
Die Ausgabe enthält die ID, den Namen, das Erstellungsdatum und die Etiketten (falls vorhanden), aber niemals die tatsächlichen geheimen Daten.
Bereitstellung eines Dienstes, der ein Geheimnis verwendet
Wenn Sie einen Dienst erstellen oder aktualisieren, gewähren Sie Zugriff auf Geheimnisse mit dem Flag Das Geheimnis wird als Datei im Container unter gespeichert.
Erstellen Sie einen Dienst mit einem einzigen Geheimnis
docker service create \
--name web_app \
--secret db_password \
--publish 80:80 \
my_alatest
Im Container enthält die Datei den geheimen Wert.
Anpassen des Mount Target
Wenn Sie das Geheimnis auf einem anderen Pfad oder mit einem anderen Dateinamen montieren müssen, verwenden Sie das Flag mit und :
docker service create \
--name web_app \
--secret src=db_password,target=/etc/app/db_pass \
my_alatest
Jetzt ist das Geheimnis bei im Container verfügbar.
Zugriff auf Geheimnisse im Container
Anwendungen, die in jeder Sprache geschrieben sind, können das Geheimnis lesen, indem sie die Datei öffnen und lesen, zum Beispiel in einer Bash-Shell im Container:
cat /run/secrets/db_password
In einem Python-Skript:
with open('/run/secrets/db_password', 'r') as f:
db_password = f.read().strip()
Geheimnisse werden niemals über -Umgebungsinspektion aufgedeckt; die Datei ist im Besitz von root und nur vom Benutzer des Containers lesbar, wenn die Standardberechtigungen (0400) des Geheimnisses angemessen sind. Sie können Berechtigungen über die -Optionen , und außer Kraft setzen, wenn dies erforderlich ist (z. B. ).
Update eines Geheimnisses (Rotation)
Da Geheimnisse unveränderlich sind, bedeutet das Aktualisieren eines Geheimnisses eigentlich, ein neues Geheimnis zu erstellen und dann alle Dienste zu aktualisieren, die es verwenden.
- Erschaffe ein neues Geheimnis:
- Aktualisieren Sie den Dienst, um das neue Geheimnis zu verwenden und das alte zu entfernen:
- Optional das alte Geheimnis entfernen, nachdem der Dienst korrekt ausgeführt wurde:
Dieser Ansatz sorgt für null Ausfallzeiten: Das rollende Update ersetzt Container einzeln, wobei jeder die neue geheime Datei erhält.
Geheimnisse entfernen
Geheimnisse, auf die kein Dienst mehr verweist, können entfernt werden. Der Versuch, ein noch verwendetes Geheimnis zu entfernen, schlägt mit einem Fehler fehl.
docker secret rm db_password_v2
Überprüfen Sie immer, dass kein laufender Dienst vom Geheimnis abhängt, bevor Sie es löschen. Verwenden Sie und überprüfen Sie die geheimen Referenzen.
Fortgeschrittene Überlegungen und Best Practices
Verschlüsselung und Speichersicherheit
Docker Swarm verschlüsselt Geheimnisse im Raft-Protokoll (dem verteilten State Store) mit einem Schlüssel, der aus den TLS-Zertifikaten des Schwarms abgeleitet wird. Der Verschlüsselungsschlüssel wird niemals auf der Festplatte im Klartext gespeichert. Die geheimen Daten werden jedoch auf Managerknoten entschlüsselt, wenn sie an Mitarbeiter übertragen werden. Um Geheimnisse noch weiter zu schützen, sollten Sie ein Hardware-Sicherheitsmodul (HSM) oder einen Schlüsselverwaltungsdienst (KMS) verwenden, wenn Ihr Unternehmen die FIPS‐140‐2 Compliance benötigt. Docker Enterprise bietet integrierte Unterstützung für externe KMS - überprüfen Sie die Docker-Dokumentation auf Konfigurationsdetails.
Zugang und Segmentierung zu den am wenigsten privilegierten Einrichtungen
- Gewähren Sie Geheimnisse nur für die spezifischen Dienste, die sie unbedingt benötigen. Vermeiden Sie die Verwendung von Wildcard- oder "Alle Geheimnisse" -Flags.
- Beschriften Sie Geheimnisse und Dienste, um organisatorische Grenzen durchzusetzen (z. B. .
- Verwenden Sie separate Geheimnisse für verschiedene Umgebungen (Staffing vs. Produktion), anstatt das gleiche Geheimnis über Stapel hinweg zu teilen.
Rotation und Expiration
- Automatisieren Sie die geheime Rotation mit CI/CD-Pipelines. Erstellen Sie ein neues Geheimnis, aktualisieren Sie den Dienst, entfernen Sie das alte Geheimnis.
- Implementieren Sie einen Zeitplan (z. B. alle 90 Tage oder nach einem Sicherheitsvorfall).
- Für Hochsicherheitsumgebungen sollten Sie die Integration mit HashiCorp Vault oder ähnlichen Tools für dynamisches Secret Generation und Leasing Management in Betracht ziehen, was jedoch zu mehr Komplexität führt.
Audit und Monitoring
- Aktivieren Sie die Docker-Audit-Logging (z. B. durch mit oder die Integration in ein zentrales Logging-System).
- Überwachen Sie geheime Erstellungs-, Aktualisierungs- und Löschungsereignisse mit Docker Events: .
- Achten Sie auf unerwartete geheime Zugriffsversuche, indem Sie Anwendungsprotokolle oder Systemaufruf-Auditing überprüfen (z. B. .
Integration mit externen Secret Stores
Während die eingebauten Geheimnisse von Docker Swarm für viele Anwendungsfälle ausreichen, benötigen einige Organisationen ein zentrales Geheimmanagement über mehrere Orchestratoren (Kubernetes, Docker Swarm, VMs). In solchen Szenarien können Sie Docker Swarm-Geheimnisse weiterhin als Bereitstellungsmechanismus verwenden, während Sie die tatsächlichen Werte aus einem externen Tresor beziehen. Beispielsweise kann ein Startskript im Container die Vault-API aufrufen, um ein Token abzurufen (das selbst als Docker-Geheimnis geliefert wird) und dann die tatsächlichen Geheimnisse zur Laufzeit abzurufen. Dieser hybride Ansatz bietet die operative Einfachheit von Docker-Geheimnissen mit der Governance eines dedizierten Geheimspeichers.
Häufige Fallstricke und wie man sie vermeidet
- Pitfall: Versehentlich Aufdecken von Geheimnissen in Protokollen oder Fehlermeldungen. Abwehr: Niemals den Inhalt von geheimen Dateien protokollieren.
- Pitfall: Mit veralteten Geheimnissen nach der Rotation. Abwehr: Automatisieren Sie die geheime Rotation und Service-Updates in Ihrer Deployment-Pipeline. Verwenden Sie orchestrierungsbewusste Überwachung, um zu bestätigen, dass alte Geheimnisse entfernt werden.
- Pitfall: Erstellen von Geheimnissen auf einem Managerknoten, der nicht Teil des Schwarms ist (z. B. mit auf einem eigenständigen Knoten). Abwehr: Führen Sie immer geheime Managementbefehle auf einem Schwarmmanagerknoten aus.
- Fall: Angenommen, Geheimnisse werden jederzeit automatisch verschlüsselt. Abwehr: Stellen Sie sicher, dass Ihre Docker-Version die Geheimverschlüsselung unterstützt (1.13+) und dass der Schwarm ordnungsgemäß initialisiert ist. In älteren Versionen wurden Geheimnisse nur im Transit verschlüsselt, nicht in Ruhe.
Real-World-Beispiel: Sicherung einer Datenbankverbindung in einem Multi-Service-Stack
Betrachten Sie einen typischen Stapel: eine WordPress-Website, die von MySQL unterstützt wird. Ohne Geheimnisse würde das MySQL-Passwort über die Umgebungsvariable weitergegeben, die in offengelegt wird. Mit Swarm Secrets erstellen Sie ein Geheimnis und stellen dann beide Dienste mit separatem Zugriff auf Geheimnisse bereit.
- Erschaffe das Geheimnis: [[([([([((((((()))])]]]]]]]
- MySQL-Dienst bereitstellen:
- WordPress-Dienst bereitstellen:
Beide Dienste lesen das Passwort aus der Datei. Das Passwort erscheint nie in Umgebungsvariablen, und kein Angreifer kann es ohne Zugriff des Schwarmmanagers aus der Docker-API abrufen.
Externe Ressourcen und weitere Lesung
- Offizielle Docker-Dokumentation: Verwalten Sie sensible Daten mit Docker Secrets
- Docker CLI Referenz: docker secret create
- Docker Swarm Mode Architektur und Sicherheit
- Docker Blog: Best Practices für Secrets Management
- OWASP Secrets Management Cheat Sheet
Schlussfolgerung
Docker Swarm Mode bietet ein robustes, integriertes Secrets Management System, das einfach einzurichten und zu bedienen ist. Indem Sie Geheimnisse als verschlüsselte, unveränderliche Assets behandeln, die nur in autorisierte Dienste eingepasst sind, eliminieren Sie viele der häufigsten Angriffsvektoren für den Diebstahl von Berechtigungen. Der Prozess des Erstellens, Bereitstellens, Zugriffs, Rotierens und Entfernens von Geheimnissen ist einfach und kann als Teil einer CI / CD-Pipeline vollständig automatisiert werden. Wenn Sie Ihre containerisierten Anwendungen skalieren, werden diese Praktiken Ihre sensiblen Daten schützen und Ihnen helfen, die Sicherheitskonformitätsanforderungen zu erfüllen, ohne den operativen Aufwand zu erhöhen.
Für Teams, die noch fortschrittlichere Funktionen benötigen – wie dynamische Geheimerzeugung, feine Zugriffskontrolle über mehrere Orchestratoren hinweg oder die Integration mit Hardware-Sicherheitsmodulen – können Docker Secrets mit externen Gewölbesystemen kombiniert werden. Für die überwiegende Mehrheit der Docker Swarm-Bereitstellungen ist die native Secrets-Funktion jedoch mehr als ausreichend. Beginnen Sie noch heute mit der Implementierung des Secrets Managements und machen Sie es zu einem integralen Bestandteil Ihrer Container-Sicherheitsstrategie.