In diesem Dokument wird beschrieben, wie Sie in Secret Manager gespeicherte Secrets mit Kubernetes-Secrets in Ihren Google Kubernetes Engine-Clustern (GKE) synchronisieren.
Durch die Synchronisierung können Anwendungen, die in GKE ausgeführt werden, mit Standard-Kubernetes-Methoden wie Umgebungsvariablen oder Volume-Bereitstellungen auf Secrets aus Secret Manager zugreifen. Das ist nützlich für Anwendungen, die bereits so konzipiert sind, dass sie Secrets aus dem Kubernetes-Secret-Objekt lesen, und nicht aktualisiert werden müssen, um direkt auf Secret Manager zuzugreifen.
Empfehlung: Die Funktion zur Secret-Synchronisierung ist eine Alternative zum Secret Manager-Add-on, mit dem Secrets als In-Memory-Dateien direkt in Ihre Pods bereitgestellt werden. Verwenden Sie das Secret Manager-Add-on, wenn Ihre Anwendung es unterstützt, da es eine sicherere Methode ist, um in GKE auf Secrets aus Secret Manager zuzugreifen.
Hinweis
Führen Sie die folgenden Schritte aus, bevor Sie Secrets synchronisieren:
-
Aktivieren Sie die Secret Manager API und die Google Kubernetes Engine API.
Rollen, die zum Aktivieren von APIs erforderlich sind
Zum Aktivieren von APIs benötigen Sie die IAM-Rolle „Service Usage-Administrator“ (
roles/serviceusage.serviceUsageAdmin), die die Berechtigungserviceusage.services.enableenthält. Informationen zum Zuweisen von Rollen. Installieren und dann initialisieren Sie die gcloud CLI. Wenn Sie die gcloud CLI bereits installiert haben, rufen Sie die neueste Version mit dem Befehl
gcloud components updateab.Prüfen Sie, ob ein GKE-Cluster ausgeführt wird. Für diese Funktion ist GKE-Version 1.33 oder höher erforderlich.
Prüfen Sie, ob die Workload Identity-Föderation für GKE in Ihrem GKE-Cluster aktiviert ist. Dies ist für die Authentifizierung erforderlich. Die Workload Identity-Föderation für GKE ist in einem Autopilot-Cluster standardmäßig aktiviert.
Prüfen Sie, ob Sie die erforderlichen Identity and Access Management-Berechtigungen zum Verwalten von GKE-Clustern und Secret Manager haben.
Secret-Synchronisierung in einem GKE-Cluster aktivieren
Aktivieren Sie die Funktion zur Secret-Synchronisierung, wenn Sie einen neuen Cluster erstellen oder einen vorhandenen Cluster aktualisieren. Diese Funktion ist sowohl für Standard- als auch für Autopilot-Cluster verfügbar.
Secret-Synchronisierung in einem neuen Cluster aktivieren
Verwenden Sie einen der folgenden gcloud CLI-Befehle, um einen neuen Cluster mit Secret-Synchronisierung zu erstellen:
Standard-Cluster
Um Secret Manager in der Befehlszeile zu verwenden, installieren Sie zuerst die Google Cloud CLI Version 378.0.0 oder höher oder aktualisieren Sie darauf. In Compute Engine oder GKE müssen Sie sich mit dem Bereich cloud-platform authentifizieren.
Secret-Synchronisierung ohne automatische Rotation aktivieren.
gcloud container clusters create CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--workload-pool=PROJECT_ID.svc.id.goog \
--enable-secret-sync
Secret-Synchronisierung mit automatischer Rotation aktivieren. Das Standardintervall beträgt 2 Minuten.
gcloud container clusters create CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--workload-pool=PROJECT_ID.svc.id.goog \
--enable-secret-sync \
--enable-secret-sync-rotation
Secret-Synchronisierung mit einem benutzerdefinierten Rotationsintervall aktivieren. Das Mindestintervall beträgt 1 Minute.
gcloud container clusters create CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--workload-pool=PROJECT_ID.svc.id.goog \
--enable-secret-sync \
--enable-secret-sync-rotation \
--secret-sync-rotation-interval=60s
Ersetzen Sie Folgendes:
CLUSTER_NAME: der Name Ihres GKE-ClusterCONTROL_PLANE_LOCATION: die Region oder Zone Ihrer Cluster-Steuerungsebene, z. B.us-central1oderus-east1-aPROJECT_ID: Ihre Google Cloud Projekt-ID
Autopilot-Cluster
Um Secret Manager in der Befehlszeile zu verwenden, installieren Sie zuerst die Google Cloud CLI Version 378.0.0 oder höher oder aktualisieren Sie darauf. In Compute Engine oder GKE müssen Sie sich mit dem Bereich cloud-platform authentifizieren.
Secret-Synchronisierung ohne automatische Rotation aktivieren.
gcloud container clusters create-auto CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--enable-secret-sync
Secret-Synchronisierung mit automatischer Rotation aktivieren. Das Standardintervall beträgt 2 Minuten.
gcloud container clusters create-auto CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--enable-secret-sync \
--enable-secret-sync-rotation
Secret-Synchronisierung mit einem benutzerdefinierten Rotationsintervall aktivieren. Das Mindestintervall beträgt 1 Minute.
gcloud container clusters create-auto CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--enable-secret-sync \
--enable-secret-sync-rotation \
--secret-sync-rotation-interval=60s
Ersetzen Sie Folgendes:
CLUSTER_NAME: der Name Ihres GKE-ClusterCONTROL_PLANE_LOCATION: die Region oder Zone Ihrer Cluster-Steuerungsebene, z. B.us-central1oderus-east1-a
Secret-Synchronisierung in einem vorhandenen Cluster aktivieren
Verwenden Sie einen der folgenden gcloud CLI-Befehle, um vorhandene Cluster mit Secret-Synchronisierung zu aktualisieren:
gcloud
Um Secret Manager in der Befehlszeile zu verwenden, installieren Sie zuerst die Google Cloud CLI Version 378.0.0 oder höher oder aktualisieren Sie darauf. In Compute Engine oder GKE müssen Sie sich mit dem Bereich cloud-platform authentifizieren.
Secret-Synchronisierung in einem vorhandenen Cluster aktivieren
gcloud container clusters update CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--enable-secret-sync
Rotation mit einem benutzerdefinierten Intervall aktivieren
gcloud container clusters update CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--enable-secret-sync-rotation \
--secret-sync-rotation-interval=300s
Rotation deaktivieren
gcloud container clusters update CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--no-enable-secret-sync-rotation
Ersetzen Sie Folgendes:
CLUSTER_NAME: der Name Ihres GKE-ClusterCONTROL_PLANE_LOCATION: die Region oder Zone Ihrer Cluster-Steuerungsebene, z. B.us-central1oderus-east1-a
Secret-Synchronisierung konfigurieren
Führen Sie die folgenden Schritte aus, um Secrets zu synchronisieren:
Erstellen Sie mit dem folgenden Befehl ein Kubernetes-ServiceAccount:
kubectl create serviceaccount KSA_NAME --namespace NAMESPACE
Ersetzen Sie Folgendes:
KSA_NAME: der Name Ihres Kubernetes-ServiceAccountNAMESPACE: der Kubernetes-Namespace, in dem Sie das ServiceAccount erstellen möchten
Erstellen Sie eine IAM-Zulassungsrichtlinie, die auf das neue Kubernetes-ServiceAccount verweist, und gewähren Sie dem ServiceAccount die Berechtigung für den Zugriff auf das Secret:
gcloud
Um Secret Manager in der Befehlszeile zu verwenden, installieren Sie zuerst die Google Cloud CLI Version 378.0.0 oder höher oder aktualisieren Sie darauf. In Compute Engine oder GKE müssen Sie sich mit dem Bereich cloud-platform authentifizieren.
gcloud secrets add-iam-policy-binding SECRET_NAME \ --role=roles/secretmanager.secretAccessor \ --member=principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME
Ersetzen Sie Folgendes:
SECRET_NAME: der Name des Secrets in Secret ManagerPROJECT_NUMBER: Ihre Google Cloud ProjektnummerPROJECT_ID: Ihre Google Cloud Projekt-IDNAMESPACE: der Kubernetes-NamespaceKSA_NAME: der Name Ihres Kubernetes-ServiceAccount
Erstellen Sie mit einem YAML-Manifest eine benutzerdefinierte SecretProviderClass-Ressource. Die SecretProviderClass-Ressource definiert die spezifischen Secrets, die aus Secret Manager abgerufen werden sollen, einschließlich ihrer Ressourcennamen und -pfade. Das Secret Manager-Add-on verwendet die SecretProviderClass-Ressource auch, um die bereitzustellenden Secrets und den Dateinamen aufzulisten, unter dem sie bereitgestellt werden sollen.
Erstellen Sie eine Datei
spc.yamlmit folgendem Inhalt:apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: SECRET_PROVIDER_CLASS_NAME namespace: NAMESPACE spec: provider: gke parameters: secrets: | - resourceName: "projects/SECRET_PROJECT_ID/secrets/SECRET_NAME_1/versions/SECRET_VERSION_1" path: "FILENAME.txt" - resourceName: "projects/SECRET_PROJECT_ID/secrets/SECRET_NAME_2/versions/SECRET_VERSION_2" path: "FILENAME1.txt"Ersetzen Sie Folgendes:
SECRET_PROVIDER_CLASS_NAME: der Name für Ihr SecretProviderClass-Objekt.NAMESPACE: der Kubernetes-Namespace, in dem Sie diese Ressource erstellen.resourceName: die vollständige Ressourcen-ID für das Secret in Secret Manager. Sie muss die Projekt-ID, den Secret-Namen und die Version im folgenden Format enthalten: projects/SECRET_PROJECT_ID/secrets/SECRET_NAME/versions/SECRET_VERSION.SECRET_PROJECT_ID: die ID des Google Cloud Projekts , in dem das Secret gespeichert ist. Dies kann mit der PROJECT_ID identisch sein, wenn das Secret im selben Projekt wie der GKE-Cluster gespeichert ist.SECRET_NAME: der Secret-Name.SECRET_VERSION: die Secret-Version. Die Secret-Version muss sich in derselben Region wie der Cluster befinden.
path: der lokale Dateiname oder Alias, unter dem der Secret-Wert in der Kubernetes-Umgebung verfügbar gemacht wird. Es ist die eindeutige ID, die eine bestimmte Secret Manager-Version mit der lokalen Darstellung verknüpft, die vom Cluster verwendet wird. Wenn das Secret mit der SecretSync-Ressource mit einem Kubernetes-Secret synchronisiert wird, wird in diesem Pfad über das FeldsourcePathauf den Secret-Wert für die Synchronisierung verwiesen. Sie können mehrere Secrets (definiert durchresourceName) verschiedenen Pfadnamen innerhalb derselben SecretProviderClass zuordnen.
Führen Sie den folgenden Befehl aus, um das Manifest anzuwenden:
kubectl apply -f spc.yaml
Erstellen Sie mit einem YAML-Manifest eine benutzerdefinierte SecretSync-Ressource. Diese Ressource weist den Synchronisierungscontroller an, ein Kubernetes-Secret basierend auf den in der SecretProviderClass definierten Inhalten zu erstellen oder zu aktualisieren.
Erstellen Sie eine Datei
secret-sync.yamlmit folgendem Inhalt:apiVersion: secret-sync.gke.io/v1 kind: SecretSync metadata: name: KUBERNETES_SECRET_NAME namespace: NAMESPACE spec: serviceAccountName: KSA_NAME secretProviderClassName: SECRET_PROVIDER_CLASS_NAME secretObject: type: KUBERNETES_SECRET_TYPE data: - sourcePath: "FILENAME.txt" targetKey: "TARGET_KEY1" - sourcePath: "FILENAME1.txt" targetKey: "TARGET_KEY2"Ersetzen Sie Folgendes:
KUBERNETES_SECRET_NAME: der Name, den Sie dem neuen Kubernetes-Secret geben möchten, das von der SecretSync-Ressource erstellt wird.NAMESPACE: der Kubernetes-Namespace, in dem die neue Ressource erstellt wird. Er muss mit dem Namespace der SecretProviderClass identisch sein.KSA_NAME: der Name des Kubernetes-ServiceAccount, das vom SecretSync-Controller zum Erstellen und Aktualisieren des Ziel-Kubernetes-Secret verwendet wird. Dieses ServiceAccount muss die erforderlichen Berechtigungen für den Zugriff auf externe Secrets aus Secret Manager haben.SECRET_PROVIDER_CLASS_NAME: der Name des SecretProviderClass-Objekts, das Sie im vorherigen Schritt erstellt haben. Die SecretSync-Ressource verwendet dies, um die richtige Konfiguration für die Secrets zu finden.KUBERNETES_SECRET_TYPE: der Typ des zu erstellenden Kubernetes-Secret, z. B.Opaque,tlsoderdocker-registry. Dadurch wird festgelegt, wie Kubernetes die Secret-Daten verarbeitet.sourcePath: der lokale Dateiname oder Alias (der Wert des Feldspathin der SecretProviderClass), der die abzurufenden Secret-Daten identifiziert. Der SecretSync-Controller verwendet diesensourcePath, um den spezifischen Secret-Inhalt anzufordern und in ein neues Kubernetes-Secret zu konvertieren.targetKey: der Schlüssel, der im Abschnittdatades neu erstellten Kubernetes-Secret verwendet wird. Dadurch wird definiert, wie der mitsourcePathabgerufene Secret-Inhalt benannt und im endgültigen Kubernetes-Secret-Objekt gespeichert wird. Mit mehreren Einträgen im Datenarray können Sie mehrere Schlüssel/Wert-Paare innerhalb desselben Ziel-Secret definieren.
Führen Sie den folgenden Befehl aus, um das Manifest anzuwenden:
kubectl apply -f secret-sync.yaml
Der Synchronisierungscontroller erstellt ein Kubernetes-Secret im angegebenen Namespace. Dieses Secret enthält die aus Secret Manager zugeordneten Daten.
Prüfen Sie, ob das Kubernetes-Secret erstellt wurde:
kubectl get secret KUBERNETES_SECRET_NAME -n NAMESPACE -o yaml
Ersetzen Sie Folgendes:
KUBERNETES_SECRET_NAME: der Name des neuen Kubernetes-SecretNAMESPACE: der Kubernetes-Namespace, in dem das neue Secret erstellt wird
Verwenden Sie den folgenden Befehl, um ein Synchronisierungsproblem zu beheben:
kubectl describe secretSync KUBERNETES_SECRET_NAME -n NAMESPACE
Ersetzen Sie Folgendes:
KUBERNETES_SECRET_NAME: der Name des neuen Kubernetes-SecretNAMESPACE: der Kubernetes-Namespace, in dem das neue Secret vorhanden sein sollte
Secret-Rotation verwalten
Wenn Sie das Flag --enable-secret-sync-rotation aktivieren
in Ihrem Cluster, prüft der Synchronisierungscontroller regelmäßig in Secret Manager
nach neuen Versionen der in der SecretProviderClass-Ressource angegebenen Secrets. Das Flag --secret-sync-rotation-interval bestimmt, wie oft der Controller nach Updates sucht.
Wenn der Controller eine neue Secret-Version in Secret Manager erkennt, aktualisiert er das entsprechende Kubernetes-Secret. Der Controller vergleicht Hashes des Secret-Inhalts, um Secrets nur bei Änderungen zu aktualisieren.
Anwendungen, die diese Secrets verwenden, müssen die aktualisierten Secret-Werte aus dem Kubernetes-Secret erkennen und neu laden. Wie dies gehandhabt wird, hängt vom Design der Anwendung ab.
Secret-Synchronisierung deaktivieren
Führen Sie den folgenden gcloud CLI-Befehl aus, um die Secret-Synchronisierung zu deaktivieren:
gcloud
Um Secret Manager in der Befehlszeile zu verwenden, installieren Sie zuerst die Google Cloud CLI Version 378.0.0 oder höher oder aktualisieren Sie darauf. In Compute Engine oder GKE müssen Sie sich mit dem Bereich cloud-platform authentifizieren.
gcloud container clusters update CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--no-enable-secret-sync
Ersetzen Sie Folgendes:
CLUSTER_NAME: der Name Ihres GKE-ClusterCONTROL_PLANE_LOCATION: die Region oder Zone Ihrer Cluster-Steuerungsebene, z. B.us-central1oderus-east1-a
Mit diesem Befehl wird der Synchronisierungscontroller beendet. Bereits erstellte Kubernetes-Secrets werden nicht gelöscht. Sie müssen alle synchronisierten Kubernetes-Secrets manuell löschen, wenn Sie sie nicht mehr benötigen.
Synchronisierte Secrets löschen
Wenn Sie ein synchronisiertes Kubernetes-Secret löschen möchten, löschen Sie die SecretSync-Ressource mit dem folgenden Befehl:
kubectl delete secretsync KUBERNETES_SECRET_NAME --namespace NAMESPACE
Ersetzen Sie Folgendes:
KUBERNETES_SECRET_NAME: der Name des Kubernetes-SecretNAMESPACE: der Kubernetes-Namespace, in dem das Secret vorhanden ist
Von vorhandenem CSI-Treiber für Secrets-Speicher migrieren
Wenn Sie von Ihrer vorhandenen Installation des CSI-Treibers für Secrets-Speicher migrieren, gehen Sie so vor:
Aktualisieren Sie das Feld
providerin Ihrer SecretProviderClass vongcpzugke. Im folgenden Beispiel wird gezeigt, wie Sie das Feldprovideraktualisieren:apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: app-secrets-gke spec: provider: gke parameters: secrets: | - resourceName: "projects/87654321/secrets/api-key-secret/versions/2" path: "good1.txt"Erstellen Sie eine SecretSync-Ressource. Verwenden Sie die folgende Beispielkonfiguration:
apiVersion: secret-sync.gke.io/v1 kind: SecretSync metadata: name: my-kube-secret namespace: NAMESPACE spec: serviceAccountName: KSA_NAME secretProviderClassName: my-app-secrets secretObject: type: Opaque # Or other Kubernetes Secret types data: - sourcePath: "my-secret.txt" targetKey: "USERNAME" - sourcePath: "another-secret.txt" targetKey: "PASSWORD"
Sicherheitsaspekte
Secret Manager bietet Sicherheitsfunktionen wie die Zugriffssteuerung mit IAM, kundenverwaltete Verschlüsselungsschlüssel (Customer-Managed Encryption Keys, CMEK) und Audit-Logging. Secrets werden in Secret Manager im Ruhezustand und bei der Übertragung verschlüsselt. Wenn Sie Secrets mit Kubernetes-Secrets synchronisieren, hängt ihre Sicherheit im Cluster von der Konfiguration Ihres GKE-Cluster ab. Berücksichtige Folgendes:
Speicher: Kubernetes-Secrets werden in etcd gespeichert, dem primären Datenspeicher von GKE. Standardmäßig verschlüsselt GKE alle inaktiven Daten. Für mehr Sicherheit, können Sie Kubernetes-Secrets auf Anwendungsebene verschlüsseln mit einem Schlüssel, den Sie in Cloud Key Management Service(Cloud KMS) verwalten. Durch das Verschlüsseln von Secrets wird eine zusätzliche Sicherheitsebene für vertrauliche Arbeitslasten geschaffen.
Zugriffssteuerung: GKE unterstützt mehrere Optionen zum Verwalten des Zugriffs auf Ressourcen in Projekten und deren Clustern mithilfe der rollenbasierten Zugriffssteuerung (Role-Based Access Control, RBAC). Zu weit gefasste RBAC-Berechtigungen können Secrets für unbeabsichtigte Arbeitslasten oder Nutzer zugänglich machen. Gewähren Sie Zugriff nach dem Prinzip der geringsten Berechtigung und prüfen Sie regelmäßig den Zugriff auf Secret Manager und die Kubernetes-Secrets.
Umgebungsvariablen: Um die Sicherheit zu verbessern, sollten Sie Kubernetes-Secrets als Volumes bereitstellen, anstatt sie als Umgebungsvariablen zu verwenden. Dadurch wird das Risiko einer versehentlichen Protokollierung oder Offenlegung gegenüber anderen Prozessen verringert.
Nächste Schritte
- Weitere Informationen zu Kubernetes-Secrets
- Weitere Informationen zur Workload Identity