2015-06-10 5 views
5

ich die mysql Bild als Beispiel bin mit, aber die Frage ist generisch.Hide/verschleiern Umweltparameter in Docker

Das Passwort starten mysqld in Docker verwendet wird, ist in Docker ps nicht sichtbar aber es in Docker sichtbar ist inspizieren:

sudo docker run --name mysql-5.7.7 -e MYSQL_ROOT_PASSWORD=12345 -d mysql:5.7.7 

CONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS    NAMES 
b98afde2fab7  mysql:5.7.7   "/entrypoint.sh mysq 6 seconds ago  Up 5 seconds  3306/tcp   mysql-5.7.7 

sudo docker inspect b98afde2fab75ca433c46ba504759c4826fa7ffcbe09c44307c0538007499e2a 

"Env": [ 
     "MYSQL_ROOT_PASSWORD=12345", 
     "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", 
     "MYSQL_MAJOR=5.7", 
     "MYSQL_VERSION=5.7.7-rc" 
    ] 

Gibt es eine Möglichkeit bestand Umgebungsparameter zu verstecken/verschleiern, wenn die Behälter zu starten. Ist es alternativ möglich, sensible Parameter über eine Datei zu übergeben?

+2

Duplikat http://security.stackexchange.com/questions/70827/passing-secret-keys-securely-to-docker-containers? – user2915097

+0

@ user2915097 - Einige gute Informationen in der security.EX-Verknüpfung, aber es bietet keine Lösung für die Übergabe von Umgebungsvariablen als Datei an docker? Es kommt vielmehr zu dem Schluss, dass, wenn der Zugang zum Hafenarbeiter besteht, alle Wetten aus sind. Ich bin auf der Suche nach praktischen Möglichkeiten, um env zu passieren. Variablen zu Container, ohne sie als Klartext zu "info" oder "inspect" –

+0

offen zu legen, können Sie ein verschlüsseltes Passwort übergeben und entschlüsseln es in den Container, bevor Sie es verwenden, fügt eine Ebene – user2915097

Antwort

2

Sie sagen "Alternativ ist es möglich, sensible Parameter durch Verweis auf eine Datei zu übergeben?", Auszug aus dem Dokument http://docs.docker.com/reference/commandline/run/--env-file=[] Read in a file of environment variables.

+0

Ziemlich sicher, dass es immer noch in Docker Inspect und allen verknüpften Containern sichtbar ist. –

7

Seltsam, ich schreibe gerade einen Artikel zu diesem Thema.

I gegen die Verwendung von Umgebungsvariablen raten würde Geheimnisse zu speichern, vor allem aus den Gründen Diogo Monica outlines here; Sie sind an zu vielen Stellen sichtbar (verknüpfte Container, docker inspect, untergeordnete Prozesse) und werden wahrscheinlich in Debug-Informationen enden und Berichte ausgeben. Ich denke nicht, dass die Verwendung einer Umgebungsvariablendatei dazu beiträgt, diese Probleme zu mindern, obwohl dies das Speichern von Werten in Ihrem Shellverlauf verhindern würde.

Stattdessen Sie in Ihrem Geheimnis in einem Volumen zB passieren kann:

$ docker run -v $(pwd)/my-secret-file:/secret-file .... 

Wenn Sie wirklich eine Umgebungsvariable verwenden möchten, könnten Sie es als ein Skript übergeben in bezogen werden, das wäre zumindest verstecken Sie es vor inspect und verknüpften Containern (zB CMD source /secret-file && /run-my-app).

Der Hauptnachteil mit einem Volumen ist, dass Sie das Risiko, versehentlich überprüft die Datei in der Versionskontrolle ausgeführt werden.

Eine bessere, aber kompliziertere Lösung ist es von einem Schlüssel-Wert-Speicher zu erhalten, wie ETCD (mit crypt), keywhiz oder vault.

+0

Ordentlich, bitte posten Sie einen Link zu dem Artikel, sobald es fertig ist. Hoffentlich gibt es einen Verweis auf ein Beispiel Dockerfile. Die env-Datei könnte übrigens nach dem Start gelöscht werden. –

+0

Wenn Sie eine Datei mit --env-Datei übergeben, sind die vars weiterhin für docker inspect und verknüpfte Container sichtbar, selbst wenn Sie die Datei löschen. Der Artikel ist wirklich ein Teil meines Buches, aber ich könnte auch einen eigenen Blog schreiben. –

+1

Eine Variante eines Dateivolumes ist ein zentraler Konfigurationsverwaltungsspeicher wie Etcd oder Consul. Siehe auch das Tresorprojekt, um Geheimnisse sicher zu speichern. Kommt von denselben Leuten, die Konsul gebaut haben und damit eingesetzt werden können. Dies ist ein schwer zu lösendes Problem: https: // vaultproject.io/ –