Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Secrets wie ein Profi verwalten: Das Secret Manager Add-on für GKE im Einsatz

By Felipe MartinezJul 8, 20247 min read

Diese Seite ist auch in English, Español, Français, Italiano, 日本語 und Português verfügbar.

Die sichere Verwaltung von Secrets ist bei jedem Kubernetes-Deployment essenziell. Bislang wurden Secrets in GKE meist als Umgebungsvariablen oder Volumes in Pods eingebunden. Das funktioniert zwar, ist aber umständlich und wirft Sicherheitsfragen auf. Zum Glück bietet Google Cloud hier eine starke Lösung: das Secret Manager Add-on für GKE.

In diesem Beitrag zeige ich Ihnen, wie Sie mit dem Secret Manager Add-on für GKE auf Secrets aus dem Secret Manager zugreifen, indem Sie sie als Volumes in GKE-Pods einbinden.

:: Stand Mai 2024 befindet sich dieses Feature noch in der Preview – setzen Sie es daher mit Bedacht ein.

Was ist Secret Manager?

Secret Manager ist ein Managed Service der Google Cloud Platform (GCP) zum Speichern und Abrufen sensibler Informationen wie API-Keys, Passwörter und Zertifikate. Die Vorteile auf einen Blick:

  • Zentrale Verwaltung: Secrets liegen an einem einzigen Ort – das vereinfacht Zugriffskontrolle und Auditing.
  • Mehr Sicherheit: Secrets werden im Ruhezustand und während der Übertragung verschlüsselt, das Risiko einer Offenlegung sinkt deutlich.
  • Einfache Workload Identity: Workloads greifen über Workload Identity sicher auf Secrets zu, ohne zusätzliche Anmeldedaten zu benötigen.

Das Secret Manager Add-on im Überblick

Das Secret Manager Add-on für Google Kubernetes Engine (GKE) vereinfacht den Zugriff auf Secrets und deren Verwaltung in Ihren Pods. Das bringt es Ihnen:

  • Einfacher Zugriff: Kein Custom Code erforderlich – Sie greifen direkt aus Ihren GKE-Pods auf Secrets im Secret Manager zu.
  • Zentrale Verwaltung: Speichern und steuern Sie alle Secrets an einem Ort (Secret Manager) und vergeben Sie gezielten Zugriff für Ihre GKE-Pods.
  • Mehr Sicherheit: Nutzen Sie Funktionen des Secret Managers wie Verschlüsselung, Zugriffskontrolle, Rotation und Audit-Logs zusammen mit Kubernetes-Features wie Volume Mounts für Secrets.
  • Breite Kompatibilität: Funktioniert mit Standard- und Autopilot-GKE-Clustern und unterstützt Deployments auf AMD- und ARM-Architekturen.

Das Add-on basiert auf dem Open-Source-Projekt Kubernetes Secrets Store CSI Driver und dem Google Secret Manager Provider. Wer bereits den Open-Source Secrets Store CSI Driver für den Zugriff auf Secrets nutzt, kann zum Secret Manager Add-on migrieren. Details dazu finden Sie unter Migrate from the existing Secrets Store CSI Driver.

Da sich das Add-on aktuell noch in der Preview befindet, fehlen folgende Funktionen:

Wäre der External Secrets Operator nicht die bessere Wahl?

Kurz gesagt: Wenn Sie Compliance-Vorgaben erfüllen müssen und keine nativen Kubernetes-Secrets im Cluster halten dürfen, führt der Weg über den Secrets Store CSI Driver und das GKE Secrets Add-on. Damit binden Sie Secrets aus dem Secret Manager direkt als Volumes in Ihren Pods ein. Wenn diese Anforderung nicht besteht, ist ESO wahrscheinlich eine gute Wahl.

Einen lesenswerten Vergleich zwischen External Secrets Operator und Secrets Store CSI Driver hat ein GitHub-Nutzer namens Lucas in diesem Kommentar veröffentlicht – ich übernehme ihn hier:

ESO synchronisiert Secrets vom Cloud-Anbieter in k8s-Secrets, sodass Sie weiterhin mit k8s-Secrets arbeiten können, wenn Sie das so gewohnt sind.

SSCSID hängt das externe Secret direkt als Volume in einen Pod ein; ein k8s-Secret im Cluster ist optional.

Bei ESO liegt die Konfiguration auf der CRD; im Secret Store des Anbieters hinterlegen Sie nur den eigentlichen Secret-Wert.

SSCSID erfordert, dass die gesamte Konfiguration bzw. das Secret direkt beim Anbieter abgelegt wird, da die Anwendung es so konsumiert. Bei umfangreicheren Konfigurationen mit eingebetteten Secrets kann das schnell unhandlich werden.

ESO-Secrets lassen sich nativ mit jeder beliebigen Ressource in k8s nutzen – das ist offensichtlich, aber 👇

SSCSID benötigt einen Pod-Webhook, damit es wirklich rund läuft. SSCSID-Secrets lassen sich nicht ohne Weiteres in Ingress-Ressourcen oder in der dockerconfig zum Pullen von Images referenzieren, da sie ausschließlich darauf ausgelegt sind, in einen Pod gemountet zu werden. Selbst für die Synchronisation als k8s-Secret muss das Secret zunächst in einen Pod gemountet werden.

Da ESO Secrets mit nativen k8s-Secrets synchronisiert, können Sie bei Verbindungsproblemen weiterhin auf das im Cluster vorhandene Secret zugreifen. Sobald die Verbindung wiederhergestellt ist, läuft die Synchronisation einfach weiter.

Bei SSCSID hingegen funktionieren die CSI-Driver-Mounts nicht mehr, wenn die Verbindung wegbricht und es zu Restarts kommt. Daran wird gearbeitet, der aktuelle Stand ist mir aber nicht bekannt: doc. Am besten direkt dort nachfragen.

ESO ist nur ein einziges Operator-Deployment in Ihrem Cluster.

SSCSID benötigt ein privilegiertes Provider-DaemonSet, das die Mounts in Ihren Pods übernimmt.

Gibt es weitere Optionen?

Wenn Sie nach einer alternativen, sicheren Methode suchen, um Secrets aus Secret-Management-Diensten direkt in ein Volume zu laden – ohne den Kubernetes Secrets Store CSI Driver zu nutzen – sollten Sie sich das unbedingt ansehen.

Außerdem hat Abdellfetah SGHIOUAR, Dev Advocate bei Google, 2001 einen lesenswerten Artikel verfasst, der weitere Möglichkeiten zur Speicherung von Secrets in GKE behandelt. Sie finden ihn hier.

**Erste Schritte mit dem** Secret Manager Add-on für GKE

Zunächst aktivieren wir das Secret Manager Add-on im Cluster. Alternativ lässt sich beim Anlegen eines neuen Clusters direkt das passende Flag setzen. Achten Sie darauf, CLUSTER_NAME und REGION/ZONE entsprechend zu ersetzen.

  gcloud beta container clusters update <CLUSTER_NAME> \
      --enable-secret-manager \
      --location=<ZONE/REGION>

Stellen Sie außerdem sicher, dass Workload Identity Federation in Ihrem Cluster aktiv ist.

Nach Aktivierung des Secret Manager Add-ons stehen zwei neue APIs mit der API-Version secrets-store.csi.x-k8s.io/v1 bereit:

$ kubectl api-resources | grep secrets-store
secretproviderclasses                                 secrets-store.csi.x-k8s.io/v1                true         SecretProviderClass
secretproviderclasspodstatuses                        secrets-store.csi.x-k8s.io/v1                true         SecretProviderClassPodStatus

Damit der Cluster mit dem Secret Manager kommunizieren kann, muss der genutzte Kubernetes-Service-Account die nötigen Berechtigungen erhalten.

Zuerst legen wir Namespace und Service-Account im Cluster an.

kubectl create ns secret-manager-access
kubectl create sa secret-manager-access-sa

Anschließend nutzen wir Workload Identity Federation, um dem K8s-Service-Account die passenden Berechtigungen zuzuweisen. Ersetzen Sie dabei Project ID und Project Number in den Variablen.

PROJECT_NUMBER=<ADD_YOUR_PROJECT_NUMBER>
PROJECT_ID=<ADD_YOUR_PROJECT_ID>
NAMESPACE=secret-manager-access
gcloud projects add-iam-policy-binding projects/star-sorceress \
    --role=roles/secretmanager.secretAccessor \
    --member=principal://iam.googleapis.com/projects/${PROJECT_NUMBER}/locations/global/workloadIdentityPools/${PROJECT_ID}.svc.id.goog/subject/ns/${NAMESPACE}/sa/secret-manager-access-sa \
    --condition=None

PS: Die Einrichtung von Workload Identity Federation hat sich kürzlich geändert. Wer mehr dazu erfahren möchte, findet in diesem Blogpost eine ausführliche Erklärung von einem Doe'r-Kollegen.

Im nächsten Schritt legen wir unser Super-Secret im Google Secret Manager an und erzeugen die erste Version:

echo "This is my awesome secret, please don't share!" > super-secret.txt
gcloud secrets create super-secret  --replication-policy="automatic" --data-file="super-secret.txt"

Nun erstellen wir die Custom Resource SecretProviderClass, die mit dem zuvor angelegten GCP-Secret verknüpft wird. Vergessen Sie nicht, Ihre Project ID einzutragen.

kubectl apply -f - <<EOF
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: super-secret
spec:
  provider: gke
  parameters:
    secrets: |
      - resourceName: "projects/<PROJECT_ID>/secrets/super-secret/versions/1"
        path: "super-secret.txt"
EOF

Pod-Volume konfigurieren

kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: test-pod
  namespace: secret-manager-access
spec:
  serviceAccountName: secret-manager-access-sa
  containers:
  - name: test-pod
    image: google/cloud-sdk:slim
    command: ["sleep","infinity"]
    volumeMounts:
      - mountPath: "/var/secrets"
        name: super-secret
  volumes:
  - name: super-secret
    csi:
      driver: secrets-store-gke.csi.k8s.io
      readOnly: true
      volumeAttributes:
        secretProviderClass: super-secret
EOF

Prüfen wir nun, ob das Secret tatsächlich vorhanden ist:

kubectl exec -it test-pod -- cat  /var/secrets/super-secret.txt
This is my awesome secret, please don't share

Vorteile des Secret Manager CSI Drivers:

  • Mehr Sicherheit: Secrets liegen nie in den Pods selbst – das verkleinert die Angriffsfläche.
  • Schlankeres Workload-Management: Workload Identity macht das Verwalten von Anmeldedaten in Pods überflüssig.
  • Bessere Konfigurierbarkeit: Granulare Steuerung des Secret-Zugriffs ermöglicht feingliedrige Berechtigungen.
  • Zentrales Audit-Logging: Alle Zugriffsversuche auf Secrets werden im Secret Manager protokolliert – ideal fürs Auditing.

Fazit

Mit dem Secret Manager Add-on für GKE setzen Sie auf einen vollständig verwalteten Secret Manager CSI Driver, heben das Sicherheitsniveau Ihres GKE-Clusters spürbar an und vereinfachen das Secret-Management in Ihren Anwendungen. Dank zentraler Steuerung, automatisiertem Mounting und robuster Zugriffskontrolle können Sie sich entspannt auf das Entwickeln und Ausrollen Ihrer Anwendungen konzentrieren.

Referenzen:

https://github.com/kubernetes-sigs/secrets-store-csi-driver

https://github.com/GoogleCloudPlatform/secrets-store-csi-driver-provider-gcp

https://cloud.google.com/secret-manager/docs/secret-manager-managed-csi-component#migrate

https://github.com/external-secrets/external-secrets/issues/478#issuecomment-964413129

https://medium.com/google-cloud/consuming-google-secret-manager-secrets-in-gke-911523207a79

https://cloud.google.com/kubernetes-engine/docs/concepts/workload-identity

https://github.com/doitintl/kube-secrets-init

Ich hoffe, dieser Beitrag hat Ihnen weitergeholfen! Bei Fragen freue ich mich über einen Kommentar.

Sie kennen DoiT International noch nicht? Dann werfen Sie unbedingt einen Blick auf uns. Unser Team möchte mehr über Sie und Ihre Anforderungen rund um Cloud Engineering erfahren. Mit ausschließlich erfahrenen Senior Engineers sind wir auf Cloud-Consulting, Architekturdesign und Debugging-Beratung auf hohem Niveau spezialisiert. Kontaktieren Sie uns – sprechen wir!