Docker-Secrets sicher verwalten (auch ohne Kubernetes)
Marcelo Oliveira
24. August 2022
0 Min. LesezeitVerteilte containerisierte Systeme setzen sich aus Anwendungen, Ressourcen, Services, Datenbanken und weiteren Artefakten zusammen. Diese Komponenten benötigen oft vertrauliche Informationen wie Benutzerschlüssel, Passwörter, API-Schlüssel und Zertifikate, um ordnungsgemäß zu funktionieren.
Secrets-Verwaltung ist entscheidend für den angemessenen Umgang mit vertraulichen Informationen. Bei Kubernetes-Deployments kommen häufig der integrierte Ressourcentyp „Secrets“ und die zugehörigen RBAC-Steuerungen zum Einsatz. Doch was, wenn Sie nicht auf Kubernetes deployen? Viele Unternehmen benötigen die Möglichkeiten von Kubernetes schlicht nicht oder möchten sich nicht mit der Komplexität des Betriebs befassen. Trotzdem müssen sie sicherstellen, dass sie Datenlecks und verlorene Passwörter vermeiden. Glücklicherweise bietet der integrierte Swarm-Orchestrator von Docker eine Lösung.
Dieser Artikel erläutert die Verwaltung von Secrets in Docker und beleuchtet Best Practices sowie mögliche Risiken bei ihrer Verwendung. Außerdem enthält er eine einfache Übung zum Erstellen und Auflisten von Docker-Secrets sowie zum Hinzufügen und Entfernen dieser Secrets für einen Service. Grundkenntnisse über die Docker-Container-Runtime und ihren Swarm-Orchestrator werden vorausgesetzt.
Docker-Secrets schützen
Wenn Sie Secrets oder vertrauliche Daten innerhalb Ihres Unternehmens weitergeben, besteht das Risiko von Datenlecks oder verlorenen Passwörtern. Bei der Arbeit an einem Docker-Projekt, in dem Sie vertrauliche Informationen wie Passwörter, private Schlüssel, Token und API-Schlüssel verarbeiten müssen, sollten Sie eine sichere Methode festlegen, um diese Secrets zu speichern und an Container zu übertragen.
Zu den schlechtesten Vorgehensweisen gehört es, vertrauliche Daten im Quellcode zu hinterlegen. Neben den Sicherheitsrisiken bedeutet das Hardcodieren von Secrets in Ihrem Code, dass Sie das Image neu erstellen müssen, wenn sich die Secrets ändern.
Eine weitere schlechte Vorgehensweise ist der „manuelle“ Umgang mit wichtigen Informationen wie Passwörtern und SSH-Schlüsseln, bei dem vertrauliche Informationen auf der lokalen Festplatte verbleiben. Denken Sie daran, dass auch unbefugte oder bösartige Programme Ihre Dateien lesen können.
Entwickler verlassen sich häufig auf Umgebungsvariablen, um vertrauliche Daten zu speichern. Das ist in manchen Szenarien in Ordnung, für Docker-Container jedoch nicht empfehlenswert. Umgebungsvariablen sind sogar weniger sicher als Dateien. Sie sind auf verschiedene Weise gefährdet, zum Beispiel durch:
den Befehl docker inspect
Ereignisprotokolldateien
Eine Anwendung kann beispielsweise im Rahmen der Ausnahmebehandlung den context in ein Protokoll schreiben. Dadurch können vertrauliche Werte aus Umgebungsvariablen im Protokoll landen.
Ein Secret Manager ist den zuvor genannten Möglichkeiten deutlich überlegen, da er in Docker Swarm einen zentralen Ort für die Verwaltung von Secrets bereitstellt. Ein Secret Manager schützt den Zugriff auf Ihre Anwendungen, Services und IT-Ressourcen und bietet einen praktischen Service zum Speichern, Verwalten und Abrufen von Secrets. Dazu gehören API- und Datenbankanmeldedaten, Schlüssel, Passwörter, private SSH-Schlüssel, SSL-Zertifikate und weitere vertrauliche Daten, die eine Anwendung zur Laufzeit benötigt.
So verwaltet Docker Secrets

Das Diagramm oben zeigt, dass Docker Raft, einen Konsensalgorithmus, zur Verwaltung eines replizierten Logs in einem verteilten System verwendet. So bleiben Ihre Daten im gesamten Swarm und in allen darauf ausgeführten Services konsistent. Der Raft-Algorithmus überträgt ein Secret durchgängig in verschlüsselter Form an alle Manager-Nodes.
Das Diagramm zeigt außerdem die Worker-Nodes. Dabei handelt es sich um Docker-Engine-Instanzen, die für die Ausführung von Containern vorgesehen sind. Die Manager-Nodes verteilen Secrets an die Container, die zu dem Service mit dem Schlüssel gehören.
Docker-Secrets funktionieren wie ein Tresor für vertrauliche Daten. Sie können nur darauf zugreifen, wenn Sie den Tresorschlüssel haben. Diesen erhalten Sie von den Service-Nodes, denen Sie den Schlüssel zugewiesen haben.
Der Secrets-Verwaltungsservice von Docker ist Teil des Container-Orchestrierungs-Stacks und bietet einen automatisierten Prozess, um diese Daten zu schützen.
In Docker-Swarm-Services sind Secrets sowohl im Ruhezustand als auch während der Übertragung verschlüsselt.
Docker-Secrets lassen sich zentral verwalten und sicher an die Container übertragen, die Zugriff darauf benötigen. Jedes Secret ist ausschließlich für Services zugänglich, denen explizit Zugriff gewährt wurde, und auch nur, solange der Service ausgeführt wird.
Wenn ein Service Zugriff auf Secrets erhält, entschlüsselt er diese und stellt sie dem Container in einem In-Memory-Dateisystem bereit. Sobald die Container-Task beendet wird, werden die entschlüsselten Secrets sofort getrennt und aus dem Arbeitsspeicher des Nodes gelöscht.
Secrets mit der Docker-CLI verwalten
Die integrierten Funktionen von Docker ermöglichen es Benutzern, Secrets einzugeben und genau zu steuern, welche Services unter welchen Bedingungen darauf zugreifen können.
In dieser einfachen Übung erstellen Sie einen MySQL-Service mit einem Root-Passwort und fügen die Anmeldedaten als Secrets hinzu.
Da Docker-Secrets nur für Swarm-Services verfügbar sind, müssen Sie einen Docker Swarm einrichten, um sie zu demonstrieren. Stellen Sie zunächst sicher, dass Sie die Kommandozeile von Docker (Docker CLI) installiert haben. Falls noch nicht geschehen, initialisieren Sie den Swarm oder treten Sie ihm bei:
Fügen Sie jetzt ein Secret zu Docker hinzu.
Erstellen Sie eine Textdatei, in der Sie Ihr Secret speichern möchten. Mit dem folgenden Befehl wird die Datei password.txt erstellt, die die Zeichenfolge this-is-a-mysql-password enthält.
Verwenden Sie jetzt den Befehl docker secret create, um mithilfe der im vorherigen Schritt erstellten Datei ein neues Secret anzulegen:
Beachten Sie, dass die obige Zeichenfolge l1m5jvgcox1l96i6bjbz4dvnt die Secret-ID und nicht das Secret selbst darstellt. In Ihrer Umgebung sieht sie daher wahrscheinlich anders aus.
Sehen wir uns nun eine weitere Möglichkeit an, den Befehl docker secret create zu verwenden. Lassen Sie den Dateinamen weg, indem Sie das letzte Argument, das die Datei angibt, auf das Minuszeichen (-) setzen:
Dieser Befehl erzeugt eine Ausgabe wie die folgende:
Dabei wird die Datei weggelassen, aus der das Secret gelesen werden soll. Der Befehl docker secret create liest stattdessen die Standardeingabe another-mysql-password.
Docker-Secrets auflisten
Führen Sie den Befehl docker secret ls aus, um die verfügbaren Secrets im Docker Swarm aufzulisten:
Die Ausgabe enthält die Secrets, die Sie im Docker Swarm erstellt haben:
Service mit Secrets erstellen
Sie können einen Service mit einem der oben erstellten Secrets anlegen.
Erstellen Sie den Service mysql-service und verwenden Sie das Flag --secret, um dem Container Zugriff auf das Secret another-mysql-secret zu gewähren:
Secrets zu einem bestehenden Service hinzufügen oder daraus entfernen
Sie können ein Secret aus einem bestehenden Service entfernen:
Oder Sie fügen einem laufenden Service ein Secret hinzu:
Wenn Sie ein Secret an einen Service binden, erstellt Docker eine Textdatei mit dem Namen des Secrets. Die Textdatei enthält eine Zeichenfolge, die das Secret darstellt, und befindet sich standardmäßig im Verzeichnis /run/secrets, das in einen temporären Dateispeicher (TMPFS) im Container eingebunden ist. In unserem Beispiel liegt die Datei unter dem Pfad /run/secrets/mysql-password-secret. Nach ihrer Erstellung steht das Secret allen Containern dieses Services zur Verfügung.
Alternativen für die externe Verwaltung von Secrets
Docker-Secrets sind eine hervorragende Lösung. Sie sollten jedoch auch erwägen, diese Aufgabe an externe Secret-Speicherlösungen von Drittanbietern auszulagern. Das gilt insbesondere, wenn Ihr Unternehmen bereits Erfahrung mit einer bestimmten Plattform hat und in sie investiert hat.
Wenn Ihr Unternehmen beispielsweise bereits Hashicorp Vault verwendet und Ihre Anwendungen damit integriert sind, gibt es wenig Grund, zu Docker-Secrets – oder Kubernetes-Secrets – zu wechseln, nur weil diese in der Plattform verfügbar sind. Nutzen Sie in Ihren Services die vorhandenen Prozesse, Bibliotheken und das Know-how rund um diese Lösung.
Zu den beliebten Alternativen für die Secrets-Verwaltung gehören:
Lösungen von Cloud-Anbietern (AWS Secrets Manager, GCP Secret Manager usw.)
Schützen Sie Ihre Secrets
Dieser Artikel hat das Konzept von Secrets und ihrer Verwaltung im Kontext von Docker Swarm vorgestellt und gezeigt, wie Docker Secrets verwaltet. Außerdem wurde veranschaulicht, warum ein Secret Manager besser ist als das Hardcodieren vertraulicher Daten, ihre Speicherung in Umgebungsvariablen oder die manuelle Verwaltung von Secrets.
Datensicherheit ist eine der Säulen einer wirksamen Unternehmensführung. Mit CLI-Befehlen und einer In-Memory-Architektur, die eine präzise Bereitstellung vertraulicher Daten ermöglicht, bietet Docker solide Tools für die Secrets-Verwaltung. Damit können Sie die Informationssicherheit Ihres Unternehmens angemessen umsetzen.
Secrets vor neugierigen Blicken zu schützen, ist ein Schritt auf dem Weg zu sicheren Containern. Snyk Code hilft Ihnen, hartcodierte Secrets zu finden. Snyk Container und Snyk Open Source zeigen Ihnen die sichersten Basis-Images und Pakete für Ihre Container. Und wenn Sie bereit für die Produktion sind, hilft Snyk IaC Ihnen, Risiken vor und nach dem Deployment zu reduzieren. Starten Sie noch heute kostenlos und finden und beheben Sie automatisch Schwachstellen in Ihrem Code, Open-Source-Abhängigkeiten, Containern und Ihrer Cloud-Infrastruktur.
Container-Sicherheit mit Fokus auf Entwickler
Snyk findet und behebt automatisch Schwachstellen in Container-Images und Kubernetes-Workloads.
