Docker Secrets – Passwörter in Containern

Passwörter und Docker, das war bisher eine eher schwierige Geschichte. Eigentlich sollten diese weder im Source Code, noch im Dockerfile direkt angeben werden. Klar, sie sind dort lesbar abgelegt. Doch wie dann?

Seit Docker 1.13 unterstützt der Docker Swarm Mode sogenannte Secrets. Was sind Secrets? Vereinfacht gesagt, Binärblobs, die von Docker auf dem Raft Log gespeichert werden.

Dieser ist seit Docker 1.13 verschlüsselt. Aber Achtung, in vorhergehenden Versionen ist dieser unverschlüsselt! Daher besser vorher alle Swarm-Nodes auf Docker 1.13 aktualisieren. Sonst finden sich die Secrets plötzlich unverschlüsselt im Raft Log wieder.

Wie funktioniert das nun?

Erzeugt man mittels

$docker secret create

ein neues Secret, wird dieses im Raft Log abgelegt und über die anderen Swarm Manager repliziert. Die Container haben dann Zugriff auf die Secrets, die unter /run/secrets/ bereitgestellt werden. Haben die Container damit Zugriff auf alle Secrets? Nein. Die Container erhalten nur Zugriff auf die Secrets, für die Sie berechtigt wurden.

Ein Container berechtigen

Sie können bereits beim Starten des Containers angeben, welche Secrets gemountet werden sollen. Dafür gibt es die Option --secret.

$docker service create […] --secret="secret_name" […]

Nun steht dem Service dieses Secret unter /run/secrets/secret_name zur Verfügung. Nach dem Starten des Services kann, je nach Image-Konfiguration, das Secret wieder entfernt werden.

Ein Secret entfernen

Um ein Secret entfernen zu können, muss zuerst das Secret aus dem Service entfernt werden. Dies geschieht mit

$docker service update -- secret-rm secret_name

Damit ist das Secret nicht mehr in den Container gemountet. Vorsicht dabei vor File Locks auf der Datei mit dem Secret. Ist die Datei geöffnet, schlägt zumeist das Entfernen fehl. Nun kann das Secret mit

$docker secret rm secret_name

komplett entfernt werden.

Images fit für Secrets machen

Damit ein Image von dem neuen Feature profitieren kann, muss das Image angepasst werden. Statt die Passwörter im Image zu übergeben, wird nun der Pfad zur Passwortdatei als Environment-Variable mitgegeben.

[...] -e MYSQL_PASSWORD_FILE="/run/secrets/secret_name" [..]

Diese kann entweder von einem Startup-Script oder direkt vom entsprechenden (Micro-)Service verarbeitet werden. Beispiele für die Verarbeitung im Startup Script finden sich in den offiziellen Images. Diese wurden bereits für den Umgang mit Secrets fit gemacht. Einfach bei Google nach docker-entrypoint.sh suchen.

Weitere Details zum Umgang mit Secrets sowie einige ausführliche Beispiele finden sich in der Docker Dokumentation.

Short URL for this post: http://wp.me/p4nxik-2OV
Patrick Rudloff

About Patrick Rudloff

Patrick Rudloff ist bei der Mannheimer Firma OIO - Orientation in Objects GmbH als Trainer, Berater und Entwickler tätig. Dort beschäftigt er sich mit agilen Methoden, Softwarearchitektur und dem Atlassian Tool-Stack. Patrick twittert unter @RudloffPatrick.
This entry was posted in Build, config and deploy and tagged , , , . Bookmark the permalink.

Leave a Reply