Sicheres Verwalten von Geheimnissen mit HashiCorp Vault unter Ubuntu 16.04

Einführung

Vault ist ein Open-Source-Tool, das eine sichere und zuverlässige Möglichkeit zum Speichern und Verteilen von Geheimnissen wie API-Schlüsseln, Zugriffstoken und Kennwörtern bietet. Software wie Vault kann von entscheidender Bedeutung sein, wenn Anwendungen bereitgestellt werden, die die Verwendung von Geheimnissen oder vertraulichen Daten erfordern.

In diesem Tutorial werden Sie:

  • Installieren Sie Vault und konfigurieren Sie es als Systemdienst

  • Initialisieren Sie einen verschlüsselten Datenspeicher auf der Festplatte

  • Speichern und Abrufen eines vertraulichen Werts sicher über TLS

Mit einigen zusätzlichen Richtlinien können Sie Vault verwenden, um vertrauliche Daten für Ihre verschiedenen Anwendungen und Tools sicher zu verwalten.

Wie bei jedem Dienst, der vertrauliche Informationen verwaltet, sollten Sie zusätzliche Dokumentationen zu den Best Practices für die Bereitstellung von Vault lesen, bevor Sie ihn in einer produktionsähnlichen Umgebung verwenden. Beispiel: Vaults Leitfaden zur Produktionshärtung behandelt Themen wie Richtlinien, Stammtoken und Überwachung.

Voraussetzungen

Bevor Sie mit diesem Handbuch beginnen, benötigen Sie Folgendes:

Schritt 1 - Installieren von Vault

HashiCorp stellt Vault als einzelne Binärdatei bereit, sodass wir die ausführbare Datei von Vault manuell herunterladen und installieren.

Laden Sie zunächst das komprimierte Vault-Zip-Archiv für 64-Bit-Linux herunter. Den Link zur neuesten Version (0.9.5 zum Zeitpunkt des Schreibens) finden Sie auf der Download-Seite von Vault.

wget https://releases.hashicorp.com/vault//vault__linux_amd64.zip

Laden Sie dann die Prüfsumme für diese Datei herunter, damit Sie den Download überprüfen können.

wget https://releases.hashicorp.com/vault//vault__SHA256SUMS

Überprüfen Sie anschließend die Integrität des Zip-Archivs. Hiermit wird bestätigt, dass der Inhalt des ZIP-Archivs mit dem übereinstimmt, was Hashicorp in Version 0.9.5 von Vault veröffentlicht hat.

grep linux_amd64 vault_*_SHA256SUMS | sha256sum -c -

Jede Zeile in der Datei "+ SHA256SUMS " enthält eine Prüfsumme und einen Dateinamen, einen für jedes von HashiCorp bereitgestellte ZIP-Archiv. Der ` grep ` - Teil des obigen Befehls gibt die Zeile mit der Prüfsumme und dem Dateinamen der 64-Bit-Linux-Binärdatei aus und leitet (` | `) diese Zeile an den nächsten Befehl weiter. Der Befehl SHA-256 überprüft, ` -c +`, dass die Datei mit dem Dateinamen aus dieser Zeile mit der Prüfsumme aus dieser Zeile übereinstimmt.

Das Ausführen des Befehls sollte anzeigen, dass das Archiv "+ OK +" ist. Wenn nicht, versuchen Sie, die Datei erneut herunterzuladen.

Outputvault__linux_amd64.zip:

Wenn die Überprüfung der Prüfsumme abgeschlossen ist, installieren Sie den Befehl + unzip +, damit Sie das Archiv dekomprimieren können. Stellen Sie zunächst sicher, dass Ihr Paket-Repository auf dem neuesten Stand ist.

sudo apt-get update
sudo apt-get install unzip

Dann entpacken Sie die Vault-Binärdatei in das Arbeitsverzeichnis.

unzip vault_*.zip
OutputArchive:  vault__linux_amd64.zip
 inflating: vault

Verschieben Sie die ausführbare Vault-Datei in ein Verzeichnis im "+ PATH +" des Systems, um sie von Ihrer Shell aus zugänglich zu machen.

sudo cp vault /usr/local/bin/

Setzen Sie abschließend ein Linux-Capability-Flag für die Binärdatei. Dies erhöht die Sicherheit, indem die Binärdatei das Sperren des Speichers durchführt, ohne die Berechtigungen unnötig zu erhöhen.

sudo setcap cap_ipc_lock=+ep /usr/local/bin/vault

Sie können jetzt den Befehl + vault + verwenden. Überprüfen Sie die Vault-Version, um sicherzustellen, dass sie funktioniert.

vault --version
OutputVault v0.7.2 ('d28dd5a018294562dbc9a18c95554d52b5d12390')

Die ausführbare Datei von Vault ist auf Ihrem Server installiert. Im nächsten Schritt müssen Sie sie so konfigurieren, dass sie als Systemdienst ausgeführt wird.

Schritt 2 - Erstellen der Vault Unit-Datei

Systemd ist Ubuntus Init-System, das unter anderem die Dienste des Systems verwaltet. Um Vault als Systemdienst einzurichten, müssen folgende Dinge eingerichtet werden:

  • Ein Systembenutzer, unter dem der Vault-Dämon ausgeführt werden soll

  • Ein Datenverzeichnis zum Speichern der Vault-Informationen

  • Konfigurationsdatei von Vault

  • Die Datei + systemd + unit selbst.

Erstellen Sie zunächst einen * Vault * -Systembenutzer.

sudo useradd -r -d /var/lib/vault -s /bin/nologin vault

In diesem Fall verwenden wir "+ / var / lib / vault " als Ausgangsverzeichnis des Benutzers. Dies wird als Vault-Datenverzeichnis verwendet. Wir haben die Shell auch auf " / bin / nologin +" gesetzt, um den Benutzer als nicht interaktives Systemkonto einzuschränken.

Setzen Sie den Besitz von "+ / var / lib / vault +" ausschließlich auf den Benutzer "* vault " und die Gruppe " vault *".

sudo install -o vault -g vault -m 750 -d /var/lib/vault

Nun richten wir die Konfigurationsdatei von Vault ein: "+ / etc / vault.hcl +". Hiermit steuern Sie verschiedene Optionen in Vault, z. B., wo verschlüsselte Geheimnisse gespeichert werden.

Erstellen Sie "+ vault.hcl " mit " nano +" oder Ihrem bevorzugten Texteditor.

sudo nano /etc/vault.hcl

Fügen Sie Folgendes in die Datei ein und stellen Sie sicher, dass Sie Ihren eigenen Domainnamen verwenden:

/etc/vault.hcl

backend "file" {
       path = "/var/lib/vault"
}

listener "tcp" {
       tls_disable = 0
       tls_cert_file = "/etc/letsencrypt/live//fullchain.pem"
       tls_key_file = "/etc/letsencrypt/live//privkey.pem"

}

Diese Konfigurationsdatei weist Vault an, verschlüsselte Geheimnisse in "+ / var / lib / vault +" auf der Festplatte zu speichern, und gibt an, dass Vault mithilfe von Zertifikaten, die im Let’s Encrypt-Lernprogramm generiert wurden, auf Verbindungen über HTTPS warten soll.

Speichern und schließen Sie die Datei und sichern Sie dann die Berechtigungen der Tresorkonfigurationsdatei, indem Sie nur dem Benutzer * vault * erlauben, sie zu lesen.

sudo chown vault:vault /etc/vault.hcl
sudo chmod 640 /etc/vault.hcl

Damit Systemd den beständigen Vault-Daemon verwalten kann, erstellen Sie eine unit file unter `+ / etc / systemd / system / vault.service + `.

sudo nano /etc/systemd/system/vault.service

Kopieren Sie das Folgende und fügen Sie es in die Datei ein. Dadurch kann Vault im Hintergrund als beständiger Systemdienst-Daemon ausgeführt werden.

/etc/systemd/system/vault.service

[Unit]
Description=a tool for managing secrets
Documentation=https://vaultproject.io/docs/
After=network.target
ConditionFileNotEmpty=/etc/vault.hcl

[Service]
User=vault
Group=vault
ExecStart=/usr/local/bin/vault server -config=/etc/vault.hcl
ExecReload=/usr/local/bin/kill --signal HUP $MAINPID
CapabilityBoundingSet=CAP_SYSLOG CAP_IPC_LOCK
Capabilities=CAP_IPC_LOCK+ep
SecureBits=keep-caps
NoNewPrivileges=yes
KillSignal=SIGINT

[Install]
WantedBy=multi-user.target

Die vollständige Liste der Service Unit-Optionen ist umfangreich. Zu den wichtigsten Konfigurationsoptionen, die in der obigen Definition zu beachten sind, gehören:

  • + ConditionFileNotEmpty + stellt sicher, dass die Konfigurationsdatei + / etc / vault.hcl + existiert.

  • + User und` + Group`, die die Benutzerberechtigungen steuern, mit denen der Vault-Daemon ausgeführt wird.

  • + ExecStart +, das auf die zuvor installierte ausführbare Datei verweist und definiert, was gestartet werden soll, um den Dienst auszuführen.

  • "+ ExecReload ", das aufgerufen wird, wenn Vault seine Konfigurationsdatei neu lädt, z. B. wenn " systemctl reload vault +" ausgeführt wird.

  • + [Install] +, mit dem wir diesen Dienst beim Start dauerhaft ausführen können, sodass wir ihn nach dem Neustart nicht manuell starten müssen.

Schließlich benötigt Vault die Berechtigung zum Lesen der mit Certbot erstellten Zertifikate. Standardmäßig sind diese Zertifikate und privaten Schlüssel nur für * root * zugänglich. Um diese sicher verfügbar zu machen, erstellen wir eine spezielle Gruppe mit dem Namen * pki *, um auf diese Dateien zuzugreifen. Wir werden die Gruppe erstellen und dann den Benutzer * vault * hinzufügen.

Speichern und schließen Sie die Datei und erstellen Sie dann die Gruppe * pki *.

sudo groupadd pki

Aktualisieren Sie die Berechtigungen für die beiden Verzeichnisse im Verzeichnis "+ / etc / letsencrypt +", damit die Gruppe "* pki *" den Inhalt lesen kann.

sudo chgrp pki /etc/letsencrypt/{archive,live}
sudo chmod g+rx /etc/letsencrypt/{archive,live}

Fügen Sie dann den Benutzer * vault * zur Gruppe * pki * hinzu. Dadurch erhält Vault Zugriff auf die Zertifikate, sodass Anforderungen sicher über HTTPS verarbeitet werden können.

sudo gpasswd -a vault pki

Als letzten Schritt zur Vereinfachung fügen Sie eine Regel in "+ / etc / hosts " hinzu, um Anfragen an Vault an " localhost +" zu leiten.

Standardmäßig wartet Vault nur auf Anfragen von der Loopback-Schnittstelle (+ lo + oder Adresse + 127.0.0.1 +). Dies soll sicherstellen, dass der Dienst nicht dem öffentlichen Internet ausgesetzt wird, bevor er ordnungsgemäß gesichert wurde. Sie können dies später aktualisieren, aber jetzt können wir mit dieser Konfigurationsänderung den Befehl "+ vault +" verwenden und den HTTPS-gesicherten Domänennamen korrekt auflösen.

Ersetzen Sie "++" im folgenden Befehl durch die Domäne, für die Sie das Let’s Encrypt-Zertifikat erworben haben:

echo 127.0.0.1  | sudo tee -a /etc/hosts

Dadurch wird die Zeile "127.0.0.1 +" an " / etc / hosts " angehängt, sodass alle HTTP-Anforderungen an "+" an "+ localhost +" weitergeleitet werden.

Nachdem die ausführbare Vault-Datei eingerichtet, die Servicedatei geschrieben und die Vault-Konfigurationsdatei abgeschlossen ist, können Sie Vault jetzt starten und den geheimen Speicher initialisieren.

Schritt 3 - Vault initialisieren

Wenn Sie Vault zum ersten Mal starten, wird es nicht initialisiert. Dies bedeutet, dass es nicht bereit ist, Daten abzurufen und zu speichern.

Wenn Sie Vault zum ersten Mal starten, wird auch das Backend, in dem die verschlüsselten Geheimnisse gespeichert werden, nicht initialisiert. Starten Sie den Vault-Systemdienst, um das Backend zu initialisieren und Vault selbst auszuführen.

sudo systemctl start vault

Sie können eine schnelle Überprüfung durchführen, um sicherzustellen, dass der Dienst erfolgreich gestartet wurde.

sudo systemctl status vault

Die Ausgabe dieses Befehls sollte mehrere Informationen zum ausgeführten Dienst enthalten, z. B. die Prozess-ID und die Ressourcennutzung. Stellen Sie sicher, dass die folgende Zeile in der Ausgabe enthalten ist, die angibt, dass der Dienst ordnungsgemäß ausgeführt wird.

Output. . .
Active: active (running)
. . .

Wenn der Dienst nicht aktiv ist, sehen Sie sich die zugehörigen Protokollzeilen am Ende der Befehlsausgabe an, um die Ausgabe von Vault zu sehen, die Sie bei der Ermittlung von Problemen unterstützen kann.

Als nächstes setzen wir eine Umgebungsvariable, um dem Befehl "+ vault " mitzuteilen, wie eine Verbindung zum Vault-Server hergestellt werden soll. In diesem Fall wurde Vault so konfiguriert, dass nur die lokale Loopback-Schnittstelle überwacht wird. Setzen Sie daher die Umgebungsvariable " VAULT_ADDR +" auf den lokalen HTTPS-Endpunkt.

export VAULT_ADDR=https://:8200

Der Befehl + vault + kann jetzt mit dem Dämon kommunizieren. Beachten Sie, dass die Definition des tatsächlichen Hostnamens anstelle von "+ localhost " oder " 127.0.0.1 +" erforderlich ist, um das HTTPS-Zertifikat ordnungsgemäß zu validieren.

Stellen Sie sicher, dass sich der Tresor in einem nicht initialisierten Zustand befindet, indem Sie seinen Status überprüfen.

vault status

Der Server sollte einen 400-Fehler zurückgeben, der besagt, dass der Server noch nicht initialisiert ist.

OutputError checking seal status: Error making API request.

URL: GET https://example.com:8200/v1/sys/seal-status
Code: 400. Errors:

* server is not yet initialized

Es gibt zwei Informationen, die Vault zum Zeitpunkt der Initialisierung bereitstellt und die zu keinem anderen Zeitpunkt verfügbar sind:

  • * Anfängliches Root-Token *. Dies entspricht den Root-Berechtigungen für Ihre Vault-Bereitstellung, mit denen alle Vault-Richtlinien, Bereitstellungen usw. verwaltet werden können.

  • * Entsiegeln von Schlüsseln *. Diese werden verwendet, um Vault beim Start des Dämons zu entsiegeln, wodurch der Vault-Dämon den geheimen Back-End-Speicher entschlüsseln kann.

Insbesondere entschlüsselt der Entsiegelungsprozess von Vault das Backend mithilfe eines Schlüssels, der aus Schlüsselfreigaben besteht. Das heißt, beim Initialisieren von Vault können Sie festlegen, wie viele Entsiegelungsschlüssel erstellt werden sollen und wie viele zum Entsiegelungszeitpunkt erforderlich sind, um Vault erfolgreich zu entsiegeln.

Ein typischer, einfacher Wert für die Entsiegelungsparameter besteht darin, drei Schlüssel zu erstellen und mindestens zwei dieser Schlüssel zum Entsiegelungszeitpunkt zu benötigen. Auf diese Weise können die wichtigen Schlüsselfreigaben getrennt und an unterschiedlichen Orten gespeichert werden, um sicherzustellen, dass ein Kompromittieren nicht ausreicht, um Vault zu entsiegeln.

Mit anderen Worten, wann immer Vault gestartet wird, sind mindestens zwei Entsiegelungsschlüssel erforderlich, um den Dienst verfügbar und einsatzbereit zu machen. Während der Versiegelung bleiben die Dateien, in denen die tatsächlichen geheimen Werte gespeichert sind, verschlüsselt und es besteht kein Zugriff auf sie.

Initialisieren Sie Vault mit den oben genannten Parametern:

vault init -key-shares=3 -key-threshold=2

Speichern Sie jedes entsiegelte Token und das ursprüngliche Root-Token auf sichere Weise. Beispielsweise besteht eine Option darin, einen Entsiegelungsschlüssel in einem Kennwortmanager, einen anderen auf einem USB-Laufwerk und einen anderen in einer GPG-verschlüsselten Datei zu speichern.

Sie können Vault jetzt mithilfe der neu erstellten Entsiegelungstoken entsiegeln. Beginnen Sie mit dem Entsiegeln mit einem Schlüssel.

vault operator unseal

Der Befehl fragt nach einem Entsiegelungs-Token:

OutputKey (will be hidden):

Nach der Eingabe zeigt die Ausgabe des Befehls an, dass das Entsiegeln ausgeführt wird, erfordert jedoch noch einen weiteren Entsiegelungsschlüssel, bevor Vault einsatzbereit ist.

OutputSealed: true
Key Shares: 3
Key Threshold: 2
Unseal Progress: 1
Unseal Nonce: 3bdc838e-1b74-bc13-1d6f-c772f1694d83

Führen Sie den Befehl + unseal + erneut aus.

vault operator unseal

Und geben Sie ein anderes Token ein als das, das Sie bereits verwendet haben:

OutputKey (will be hidden):

Die Ausgabe des Befehls zeigt an, dass der Entsiegelungsprozess erfolgreich abgeschlossen wurde.

OutputSeal Type       shamir
Sealed          false
Total Shares    3
Threshold       2
Version         0.9.5
Cluster Name    vault-cluster-5511b3ff
Cluster ID      53522534-8ee1-8aec-86db-e13e4a499dd0
HA Enabled      false

Der Tresor ist jetzt entsiegelt und einsatzbereit. Diese Schritte zum Entsiegeln sind erforderlich, wenn Vault gestartet oder neu gestartet wird.

Das Aufheben der Versiegelung unterscheidet sich jedoch von der normalen Interaktion mit Vault (z. B. Lesen und Schreiben von Werten), die durch Tokens authentifiziert werden. Im letzten Schritt erstellen wir die erforderlichen Zugriffstoken und Richtlinien, um geheime Werte zu speichern und auf bestimmten Pfaden in Vault zu lesen / schreiben.

Schritt 4 - Lesen und Schreiben von Geheimnissen

Es gibt mehrere secret-Backends, die in der Vault-Dokumentation aufgeführt sind. Für dieses Beispiel wird jedoch die https://www.vaultproject.io/docs/ verwendet. secrets / generic / index.html [generisches geheimes Backend]. Dieses Backend speichert einfache Schlüssel / Wert-Paare in Vault.

Speichern Sie zunächst das zuvor generierte Root-Token in einer Shell-Variablen, um die Verwendung zu vereinfachen.

root_token=

Schreiben Sie zunächst einen Wert in einen Pfad in Vault.

VAULT_TOKEN=$root_token vault write secret/message value=mypassword

In diesem Befehl gibt das Präfix "+ secret / " an, dass wir in das generische Backend schreiben, das im Pfad " secret " eingebunden ist, und dass wir den Schlüssel " value " im Pfad " message " speichern mit dem Wert " meinKennwort +". Wir haben das Root-Token verwendet, das Superuser-Berechtigungen hat, um das generische Geheimnis zu schreiben.

In einem realen Szenario können Sie Werte wie API-Schlüssel oder Kennwörter speichern, die von externen Tools verwendet werden können. Obwohl Sie den geheimen Wert möglicherweise erneut mit dem Root-Token lesen, ist es nur beispielhaft, ein weniger privilegiertes Token mit Leseberechtigungen für unser einzelnes Geheimnis zu generieren.

Erstellen Sie eine Datei mit dem Namen "+ policy.hcl +".

nano policy.hcl

Füllen Sie die Datei mit der folgenden Vault-Richtlinie, die den schreibgeschützten Zugriff auf den geheimen Pfad in Ihrem Arbeitsverzeichnis definiert:

policy.hcl

path "secret/message" {
    capabilities = ["read"]
}

Speichern und schließen Sie die Datei und schreiben Sie diese Richtlinie in Vault. Mit dem folgenden Befehl wird eine Richtlinie mit dem Namen "+ message-readonly +" mit den Rechten der Richtlinie erstellt.

VAULT_TOKEN=$root_token vault policy write message-readonly policy.hcl

Sie können jetzt ein Token mit den in der Richtlinie angegebenen Rechten erstellen.

VAULT_TOKEN=$root_token vault token create -policy="message-readonly"

Die Ausgabe sieht folgendermaßen aus:

OutputKey             Value
---             -----
token
token_accessor  your_token_accessor
token_duration  768h0m0s
token_renewable true
token_policies  [default message-readonly]

Speichern Sie den Wert "+ token" in einer Variablen mit dem Namen "+ id_token".

app_token=

Sie können den Wert von "+ app_token " verwenden, um auf die im Pfad " secret / message +" gespeicherten Daten zuzugreifen (und keine anderen Werte in Vault).

VAULT_TOKEN=$app_token vault read secret/message
OutputKey                     Value
---                     -----
refresh_interval        768h0m0s
value

Sie können auch testen, ob dieses nicht privilegierte Token keine anderen Vorgänge ausführen kann, z. B. das Auflisten von Geheimnissen in Vault.

VAULT_TOKEN=$app_token vault list secret/
OutputError reading secret/: Error making API request.

URL: GET https://example.com:8200/v1/secret?list=true
Code: 403. Errors:

*

Hiermit wird sichergestellt, dass das weniger privilegierte App-Token keine destruktiven Aktionen ausführen oder auf andere geheime Werte zugreifen kann, die nicht ausdrücklich in der Vault-Richtlinie angegeben sind.

Fazit

In diesem Artikel haben Sie Vault unter Ubuntu 16.04 installiert, konfiguriert und bereitgestellt. Obwohl in diesem Lernprogramm nur die Verwendung eines nicht privilegierten Tokens demonstriert wurde, enthält die Vault-Dokumentation weitere Informationen zu zusätzlichen Möglichkeiten zum Speichern und Zugreifen auf Geheimnisse sowie zu https: //www.vaultproject.io/docs/auth/index.htm[alternative Authentifizierungsmethoden].

In diesen Anweisungen wird beschrieben, wie Sie Vault auf relativ einfache Weise bereitstellen und verwenden. Lesen Sie daher unbedingt die Vault-Dokumentation und nehmen Sie die entsprechenden Konfigurationsänderungen für Ihre Anforderungen vor. Einige produktionsreife Änderungen umfassen:

  • Generieren von weniger privilegierten Tokens für den täglichen Gebrauch. Die spezifischen Richtlinien, die diese Token verwenden sollten, hängen vom jeweiligen Anwendungsfall ab. Das vorangegangene "+ app_token +" zeigt jedoch, wie Token und Richtlinien mit eingeschränkten Berechtigungen erstellt werden können.

  • Wenn Vault als Teil eines Teamdienstes bereitgestellt wird, kann durch das Initialisieren von Vault mit entsiegelten Schlüsseln für jedes Teammitglied sichergestellt werden, dass der Speicher von Vault nur dann entschlüsselt wird, wenn mehr als ein Teammitglied an dem Prozess teilnimmt.