Sichere Geheimnisse für Apps mit Vault Dedicated und dem External Secrets Operator
In diesem Tutorial erfahren Sie, wie Sie mit IBM Cloud und Vault Enterprise Geheimnisse für Anwendungen verwalten, die in Ihrem IBM Cloud Kubernetes Service-Cluster ausgeführt werden, und zwar mithilfe des Open-Source-Tools External Secrets Operator.
Sie sind Entwickler in einem Unternehmen, und Ihr Team nutzt Kubernetes Service, um containerisierte Anwendungen und Dienste auf IBM Cloud bereitzustellen. Sie möchten Ihre Anwendungsgeheimnisse in Vault Dedicated speichern, dem von IBM Cloud verwalteten HashiCorp Vault-Dienst, wo Sie diese im Ruhezustand verschlüsseln, ihren Lebenszyklus verwalten und sie problemlos rotieren lassen können.
Mit Vault Dedicated und dem External Secrets Operator können Sie die Geheimnisse, die von den in Ihren Kubernetes-Clustern ausgeführten Anwendungen verwendet werden, zentral verwalten und sichern. Anstatt Ihre Geheimnisse zum Zeitpunkt der Bereitstellung einzubinden, können Sie Ihre Anwendungen so konfigurieren, dass sie Geheimnisse zur Laufzeit sicher aus Vault Dedicated abrufen. Nehmen Sie beispielsweise folgendes Szenario an:
{: caption="externer Geheimnisse
- Als Entwickler nutzen Sie Vault Dedicated, um ein Geheimnis für eine Anwendung zu speichern, die Sie in einem Kubernetes-Cluster bereitstellen möchten.
- Sie konfigurieren den External Secrets Operator so, dass er über den HashiCorp Vault-Anbieter eine Verbindung zu Ihrer Vault Dedicated-Instanz herstellt.
- Der Controller für externe geheime Schlüssel ruft die
ExternalSecrets-Objekte in der Konfigurationsdatei ab, die Sie mithilfe der Kubernetes-API definiert haben. - Zur Laufzeit der Anwendung ruft der Controller die geheimen Daten aus Vault Dedicated ab und wandelt die Objekte
ExternalSecretsin Kubernetes-Geheimnisse für Ihren Cluster um.
Dieses Szenario verfügt über ein Tool eines anderen Anbieters, das sich auf die Konformitätsbereitschaft von Workloads auswirken kann, die in Ihrem Kubernetes-Cluster ausgeführt werden. Wenn Sie ein Community-Tool oder ein Tool eines Drittanbieters hinzufügen, beachten Sie bitte, dass Sie für die Einhaltung der Compliance-Vorgaben Ihrer Anwendungen verantwortlich sind und bei der Behebung etwaiger Probleme mit dem jeweiligen Anbieter zusammenarbeiten müssen. Weitere Informationen finden Sie im Abschnitt Ihre Verantwortlichkeiten bei der Verwendung von IBM Cloud Kubernetes Service.
Vorbereitende Schritte
Stellen Sie vor dem ersten Start sicher, dass Sie über den Administrator-Plattformzugriff verfügen, damit Sie Kontoberechtigungsnachweise und Einrichtungsressourcen erstellen können. Außerdem müssen die folgenden Voraussetzungen erfüllt sein:
- Laden Sie die IBM Cloud-CLI herunter und laden und installieren Sie sie.
- Installieren Sie die Kubernetes-CLI(
kubectl). - Installieren Sie Helm t unter 3.x.
- Herunterladen und installieren
jq.
jq unterstützt Sie beim Ausschneiden und Filtern von JSON-Daten. Sie verwenden jq in diesem Lernprogramm, um gespeicherte Umgebungsvariablen zu erfassen und zu verwenden.
- Eine in Ihrem IBM Cloud-Konto bereitgestellte dedizierte Vault-Instanz. Weitere Informationen finden Sie unter Einrichten Ihrer Vault Dedicated-Instanz.
Umgebung einrichten
Um mit Vault Dedicated und Kubernetes Service arbeiten zu können, müssen Sie einen Cluster in Ihrem IBM Cloud-Konto erstellen und den Zugriff auf Ihre Vault Dedicated-Instanz konfigurieren.
Kubernetes-Cluster erstellen
Erstellen Sie einen Kubernetes-Cluster in Ihrem IBM Cloud-Konto.
-
Melden Sie sich in der Befehlszeile bei IBM Cloud über die IBM Cloud-CLI an.
ibmcloud loginWenn die Anmeldung fehlschlägt, führen Sie den Befehl
ibmcloud login --ssoaus, um es erneut zu versuchen. Der Parameter--ssoist erforderlich, wenn Sie sich mit einer föderierten ID anmelden. Wenn diese Option verwendet wird, rufen Sie den Link auf, der in der Ausgabe der Befehlszeilenschnittstelle aufgelistet ist, um einen einmalig verwendbaren Kenncode zu generieren. -
Wählen Sie das Konto, die Region und die Ressourcengruppe aus, in der Sie Ihren Cluster erstellen möchten.
ibmcloud target -r REGION -g RESOURCE_GROUPErsetzen Sie durch
REGIONIhre Zielregion (zum Beispielau-syd) undRESOURCE_GROUPdurch den Namen Ihrer Ressourcengruppe. -
Erstellen Sie einen Kubernetes-Cluster.
ibmcloud ks cluster create vpc-gen2 --zone ZONE --flavor FLAVOR --workers 1 --name eso-test-cluster --vpc-id VPC_ID --subnet-id SUBNET_IDErsetzen Sie
ZONE,FLAVOR,VPC_ID, undSUBNET_IDdurch Ihre Werte. Die Bereitstellung Ihres Kubernetes-Clusters dauert 5 bis 15 Minuten. -
Bevor Sie mit dem nächsten Schritt fortfahren, vergewissern Sie sich, dass Ihr Cluster erfolgreich bereitgestellt wurde.
ibmcloud ks worker ls --cluster eso-test-clusterWenn Einrichtung Ihres Workerknotens abgeschlossen ist, ändert sich der Status in Bereit.
-
Legen Sie den Kontext für Ihren Kubernetes-Cluster in der Befehlszeilenschnittstelle fest.
ibmcloud ks cluster config --cluster eso-test-cluster -
Überprüfen Sie, ob
kubectl-Befehle ordnungsgemäß ausgeführt werden und ob der Kubernetes-Kontext auf Ihren Cluster gesetzt ist.kubectl config current-context
Bereiten Sie Ihre Vault Dedicated-Instanz vor
Konfigurieren Sie Ihre Vault Dedicated-Instanz, um mit Geheimnissen zu arbeiten, und richten Sie die Authentifizierung für den External Secrets Operator ein.
-
Exportieren Sie Umgebungsvariablen mit den Details Ihrer Vault Dedicated-Instanz.
export VAULT_DEDICATED_ADDR="https://<your-vault_dedicated-instance-id>.vault.<region>.appdomain.cloud" export VAULT_DEDICATED_NAMESPACE="admin"Ersetzen Sie
<your-vault_dedicated-instance-id>durch die ID Ihrer Vault Dedicated-Instanz und<region>durch Ihre Vault Dedicated-Region (zum Beispielau-syd). -
Beziehen Sie ein Vault-Token von Ihrer Vault Dedicated-Instanz.
Sie können ein Token über die Benutzeroberfläche von Vault Dedicated oder mithilfe der Vault-CLI generieren. Für Entwicklungs- und Testzwecke können Sie ein Root-Token verwenden. Erstellen Sie für die Produktionsumgebung ein Token mit entsprechenden Richtlinien.
export VAULT_TOKEN="<your-vault-token>" -
Überprüfen Sie den Einhängepunkt der KV-Secrets-Engine in Vault Dedicated.
Bei dedizierten Vault-Instanzen ist die KV- v2-Secrets-Engine
kv/standardmäßig unter eingebunden. Sie können dies in der Benutzeroberfläche von Vault Dedicated überprüfen oder durch Auflisten der Einbindungen.curl -k -X GET \ -H "X-Vault-Token: $VAULT_TOKEN" \ -H "X-Vault-Namespace: $VAULT_DEDICATED_NAMESPACE" \ $VAULT_DEDICATED_ADDR/v1/sys/mounts | jq -
Erstellen Sie ein Testgeheimnis in Vault Dedicated.
curl -k -X POST \ -H "X-Vault-Token: $VAULT_TOKEN" \ -H "X-Vault-Namespace: $VAULT_DEDICATED_NAMESPACE" \ -d '{"data":{"username":"user123","password":"cloudy-rainy-coffee-book"}}' \ $VAULT_DEDICATED_ADDR/v1/kv/data/example_username_passwordBeachten Sie, dass Vault Dedicated
kv/als Einhängepfad für die KV-Secrets-Engine verwendet. -
Überprüfen Sie, ob das Geheimnis erstellt wurde.
curl -k -X GET \ -H "X-Vault-Token: $VAULT_TOKEN" \ -H "X-Vault-Namespace: $VAULT_DEDICATED_NAMESPACE" \ $VAULT_DEDICATED_ADDR/v1/kv/data/example_username_password | jq
External Secrets Operator installieren
Installieren Sie den External Secrets Operator mithilfe von Helm.
-
Fügen Sie das Repository External Secrets Helm hinzu.
helm repo add external-secrets https://charts.external-secrets.io helm repo update -
Installieren Sie den External Secrets Operator.
helm install external-secrets \ external-secrets/external-secrets \ --namespace external-secrets \ --create-namespace \ --set installCRDs=true -
Überprüfen Sie die Installation.
kubectl get pods -n external-secretsWarten Sie, bis sich alle Pods im Status Running befinden.
-
Stellen Sie sicher, dass die Custom Resource Definitions (CRDs) installiert sind.
kubectl get crd | grep external-secretsSie sollten CRDs wie
secretstores,clustersecretstores, und sehenexternalsecrets.
SecretStore für Vault Dedicated konfigurieren
Erstellen Sie eine Ressource SecretStore, die beschreibt, wie der External Secrets Operator eine Verbindung zu Ihrer Vault Dedicated-Instanz herstellt.
-
Erstellen Sie mit Ihrem Vault-Token einen Kubernetes-Secret.
kubectl create secret generic vault-token \ --namespace external-secrets \ --from-literal=token="$VAULT_TOKEN" -
Erstellen Sie eine
secretstore.yaml-Datei.touch secretstore.yaml -
Fügen Sie die folgende Konfiguration in die Datei ein.
apiVersion: external-secrets.io/v1beta1 kind: SecretStore metadata: name: vault-dedicated-secretstore namespace: default spec: provider: vault: server: "<VAULT_DEDICATED_ADDR>" path: "kv" version: "v2" namespace: "admin" auth: tokenSecretRef: name: "vault-token" key: "token" namespace: "external-secrets"Ersetzen Sie
<VAULT_DEDICATED_ADDR>durch die Adresse Ihrer Vault Dedicated-Instanz. Beachten Sie, dass auf gesetzt istpath``kv, was dem Standard-Einhängepunkt für die KV-Secrets-Engine in Vault Dedicated entspricht. -
Wenden Sie die Konfiguration SecretStore an.
kubectl apply -f secretstore.yaml -
Überprüfen Sie, ob der SecretStore gültig ist.
kubectl get secretstore vault-dedicated-secretstore -n default kubectl describe secretstore vault-dedicated-secretstore -n defaultDer Status sollte Gültig anzeigen, wenn die Verbindung zu Vault Dedicated erfolgreich hergestellt wurde.
Erstellen Sie eine ExternalSecret
Erstellen Sie eine Ressource ExternalSecret, die festlegt, welche Geheimnisse aus Vault Dedicated abgerufen werden sollen.
-
Erstellen Sie eine Datei
externalsecret.yaml.touch externalsecret.yaml -
Fügen Sie die folgende Konfiguration hinzu.
apiVersion: external-secrets.io/v1beta1 kind: ExternalSecret metadata: name: vault-dedicated-app-secret namespace: default spec: refreshInterval: 1h secretStoreRef: name: vault-dedicated-secretstore kind: SecretStore target: name: my-k8s-secret creationPolicy: Owner data: - secretKey: username remoteRef: key: example_username_password property: username - secretKey: password remoteRef: key: example_username_password property: passwordDer legt
refreshIntervalfest, wie oft der External Secrets Operator Vault Dedicated nach Aktualisierungen abfragt. Der Standardwert und empfohlene Wert beträgt 1 Stunde. -
Wenden Sie die Konfiguration ExternalSecret an.
kubectl apply -f externalsecret.yaml -
Stellen Sie sicher, dass der External Secrets Operator das Geheimnis aus Vault Dedicated abgerufen hat.
kubectl get secret my-k8s-secret -o json | jq '.data | map_values(@base64d)'Beispielausgabe:
{ "password": "cloudy-rainy-coffee-book", "username": "user123" }Erfolgreich! Sie können nun vertrauliche Daten aus Ihrer Vault Dedicated-Instanz abrufen und in Ihrem Kubernetes-Cluster verwenden.
App für den Cluster implementieren
Schließlich können Sie in Ihrem Cluster eine Anwendung bereitstellen, die das Vault Dedicated Secret verwendet. Zur Laufzeit der Anwendung werden die aus Vault Dedicated abgerufenen geheimen Daten in ein Kubernetes-Geheimnis umgewandelt, das von Ihrem Cluster verwendet werden kann.
-
Erstellen Sie eine einfache Testbereitstellung, die das Geheimnis verwendet.
cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: test-app namespace: default spec: containers: - name: app image: busybox command: ['sh', '-c', 'echo "Username: \$USERNAME"; echo "Password: \$PASSWORD"; sleep 3600'] env: - name: USERNAME valueFrom: secretKeyRef: name: my-k8s-secret key: username - name: PASSWORD valueFrom: secretKeyRef: name: my-k8s-secret key: password EOF -
Überprüfen Sie die Pod-Protokolle, um sicherzustellen, dass das Secret eingefügt wurde.
kubectl logs test-app -n defaultErwartete Ausgabe:
Username: user123 Password: cloudy-rainy-coffee-book
Suchen Sie nach weiteren Beispielen zur Bereitstellung einer App? Lesen Sie den Artikel Bereitstellung von Kubernetes-nativen Apps in Clustern, um mehr über die Bereitstellung von Anwendungen zu erfahren.
(Optional) Ressourcen bereinigen
Wenn Sie die Ressourcen, die Sie in diesem Lernprogramm erstellt haben, nicht mehr benötigen, können Sie die folgenden Schritte ausführen, um sie aus Ihrem Konto zu entfernen.
-
Löschen Sie den Test Kubernetes-Cluster.
ibmcloud ks cluster rm --cluster eso-test-cluster -
Test-Geheimnisse in einem dedizierten Vault bereinigen.
curl -k -X DELETE \ -H "X-Vault-Token: $VAULT_TOKEN" \ -H "X-Vault-Namespace: $VAULT_DEDICATED_NAMESPACE" \ $VAULT_DEDICATED_ADDR/v1/kv/metadata/example_username_password
Wichtige Hinweise
Beachten Sie beim Erstellen Ihrer YAML-Dokumente bitte die folgenden Punkte:
-
Abfrageintervall: Standardmäßig ist das Abfrageintervall auf 1 Stunde eingestellt und stellt den bevorzugten Wert dar.
refreshInterval: 1hSie können diesen Wert in der Vorlage ExternalSecret ändern. Das Intervall kann in den Einheitens,m, oder ausgedrückt werdenh. -
Vault Dedicated-Einbindungspfad: Vault Dedicated verwendet
kv/als Standard-Einbindungspfad für die KV-Secrets-Engine, nichtsecret/. Stellen Sie sicher, dass Sie in Ihrer Konfiguration unter SecretStore den richtigen Pfad angeben. -
Vault Dedicated-Namespaces: Vault Dedicated verwendet Vault Enterprise-Namespaces. Der Standard-Namespace lautet
admin. Stellen Sie sicher, dass Sie in Ihrer SecretStore-Konfiguration den richtigen Namespace angeben. -
Authentifizierungsmethoden: In diesem Tutorial wird der Einfachheit halber die Token-Authentifizierung verwendet. In Produktionsumgebungen sollten Sie zur Erhöhung der Sicherheit die Authentifizierungsmethoden AppRole oder Kubernetes in Betracht ziehen.
-
TLS Zu beachten: Für Vault Dedicated sind TLS-Verbindungen erforderlich. Stellen Sie in Produktionsumgebungen sicher, dass eine ordnungsgemäße Zertifikatsvalidierung konfiguriert ist, anstatt … zu verwenden
skipTLSVerify.
Nächste Schritte
Gut gemacht! In diesem Tutorial haben Sie gelernt, wie Sie Vault Dedicated einrichten, um Anwendungsgeheimnisse mithilfe des External Secrets Operator sicher in Ihren Kubernetes-Cluster einzuspielen. Sehen Sie sich weitere Ressourcen an, die Ihnen den Einstieg in Vault Dedicated erleichtern.
- Erfahren Sie mehr über den Vault Secrets Operator, den offiziellen Operator von HashiCorp's für die Integration von Kubernetes.
- Lesen Sie die Dokumentation zum External Secrets Operator Vault-Anbieter durch.
- Entdecken Sie die Dokumentation zu Vault Dedicated für fortgeschrittene Funktionen und Konfigurationen.
- Erfahren Sie mehr über HashiCorp Vault.