Vault fĂĽr Entwickler: Geheimnisse in Webanwendungen schĂĽtzen
Seite 2: Geheimnisse persistieren
Da Docker zumindest in der Entwicklung häufig anzutreffen ist, spricht nichts dagegen, Vault mit dem offiziellen HashiCorp Image zu verwenden und den Betrieb damit noch etwas mehr zu vereinfachen.
Zum Start im Dev-Modus ist nur die Eingabe von docker run vault notwendig. Auch hier bietet sich der Prod-Modus fĂĽr Entwicklungsteams an. Die Hauptanforderung ist sicherlich, dass gespeicherte Geheimnisse einen Neustart des Servers beziehungsweise von Vault (etwa bei einem Update) ĂĽberstehen. Dazu ist etwas Konfiguration in Form der HashiCorp Configuration Language (HCL) notwendig, die man anschlieĂźend dem Vault-Container ĂĽbergeben muss. Das folgende Listing zeigt die als dev-file.hcl gespeicherte Datei.
storage "file" {
path = "/vault/file/vault_dev"
}
listener "tcp" {
address = "0.0.0.0:8200"
tls_disable = 1
}
disable_mlock = true
ui = true
Die Datei weist Vault an, alle Daten im Dateisystem abzulegen, ohne https (TLS) erreichbar zu sein und aktiviert die Web-UI als Alternative für die Entwickler, die kein CLI verwenden möchten. Wer Consul im Entwicklungsteam einsetzt, kann statt file auch darauf zurückgreifen und die Geheimnisse dort sicher ablegen. Die Konfiguration muss dann für das Consul-Storage-Backend angepasst werden.
Per docker-compose.yml binden Anwender die Konfiguration in den Vault-Start ein:
services:
vault:
image: vault
cap_add:
- IPC_LOCK
environment:
VAULT_ADDR: http://127.0.0.1:8200
ports:
- "8200:8200"
volumes:
- ./file:/vault/file
- ./config:/vault/config
entrypoint: vault server -config=/vault/config/dev-file.hcl
In der Compose-Konfiguration sind vor allem die konfigurierten Verzeichnisse (Volumes) wichtig:
- /vault/file speichert im Container sämtliche Vault-Daten (sofern nicht die in-memory-Variante aktiv ist). Um einen Neustart zu überstehen, muss man das Verzeichnis daher zwingend als Volume einbinden.
- /vault/config beinhaltet die angepasste Vault-Konfiguration, darunter die im ersten Listing angelegte dev-file.hcl.
Der Start des Vault-Containers erfolgt wie in Docker üblich mit docker-compose up -d. Anschließend müssen Entwickler Vault initialisieren und "aufschließen" (unsealed). Das lässt sich zum per Kommandozeile mit den folgenden Befehlen erledigen:
- export VAULT_ADDR=http://127.0.0.1:8200 konfiguriert die Umgebung fĂĽr den gestarteten Vault.
- vault operator init -key-shares=1 -key-threshold=1 initialisiert Vault. Der key-shares-Parameter gibt die Gesamtzahl zu generierender Schlüssel an, key-threshold legt die zum Öffnen nötige Anzahl fest. Für beides den Wert eins zu verwenden, ist für eine Entwicklungsumgebung legitim, dadurch ist nur ein Entwickler zum Öffnen des Safes notwendig.
Den bei der Initialisierung einmalig angezeigten Key muss man an alle Entwickler verteilen, die den Safe nach einem Neustart aufschließen können müssen. Beim ebenfalls einmalig angezeigten Root-Token hängt es davon ab, ob alle Entwickler denselben Zugang nutzen sollen oder jeder einen eigenen User erhält (Komfort versus Sicherheit). Generell empfiehlt es sich, das Root-Token nicht zu verteilen.
Stattdessen sollte jeder Entwickler einen eigenen User erhalten, selbst wenn alle die gleichen Rechte und damit die gleiche Policy besitzen. Für jede Applikation wird anschließend ebenfalls ein eigener User oder ein eigenes Token generiert, wobei der Zugriff nur auf die notwendige Konfiguration gestattet ist. Nachteil ist, dass damit ein oder mehrere Entwickler zu Vault-Admins werden und die Zugänge für die übrigen Entwickler verwalten müssen. Gewinner ist ganz klar die Sicherheit, denn dadurch lassen sich Zugänge einfacher beschränken und notfalls entziehen. Ob das in einem Entwicklungsteam in einer Entwicklungsumgebung notwendig ist, mag jeder für sich entscheiden.
Neben diesen Befehlen stehen noch viele weitere für Vault zur Verfügung. Wer nicht in die Kommandozeile eintauchen möchte findet sich vermutlich einfacher in der Web-UI zurecht, die unter http://localhost:8200/ui zur Verfügung steht. Dort lässt sich Vault initialisieren, wie in Abbildung 1 gezeigt.