Utilizzare il componente aggiuntivo Secret Manager con Google Kubernetes Engine

L'integrazione tra Secret Manager e Google Kubernetes Engine (GKE) consente di archiviare dati sensibili come password e certificati utilizzati dai cluster GKE come secret in Secret Manager.

Questa pagina spiega come utilizzare il componente aggiuntivo Secret Manager per accedere ai secret archiviati in Secret Manager come volumi montati nei pod Kubernetes.

Questa procedura prevede i seguenti passaggi:

  1. Installa il componente aggiuntivo Secret Manager su un cluster GKE nuovo o esistente.
  2. Configura le applicazioni per l'autenticazione nell'API Secret Manager.
  3. Definisci i secret da montare sui pod Kubernetes utilizzando un file YAML SecretProviderClass.
  4. Crea un volume in cui verranno montati i secret. Una volta collegato il volume, le applicazioni nel container possono accedere ai dati nel file system del container.

Il componente aggiuntivo Secret Manager è derivato dal Driver CSI dell'archivio di secret di Kubernetes open source e dal provider di Google Secret Manager. Se utilizzi il driver CSI open source dell'archivio secret per accedere ai secret, puoi eseguire la migrazione al componente aggiuntivo Secret Manager. Per informazioni, consulta Eseguire la migrazione dal driver CSI dell'archivio secret esistente.

Vantaggi

Il componente aggiuntivo Secret Manager offre i seguenti vantaggi:

  • Puoi utilizzare una soluzione completamente gestita e supportata per accedere ai secret di Secret Manager da GKE senza costi operativi.
  • Non è necessario scrivere codice personalizzato per accedere ai secret archiviati in Secret Manager.
  • Puoi archiviare e gestire tutti i tuoi secret a livello centrale in Secret Manager e accedere in modo selettivo ai secret dei pod GKE utilizzando il componente aggiuntivo di Secret Manager. In questo modo, puoi utilizzare le funzionalità offerte da Secret Manager, come la crittografia CMEK, il controllo dell'accesso granulare, la rotazione gestita, la gestione del ciclo di vita e gli audit log, oltre a utilizzare le funzionalità di Kubernetes come il passaggio di secret ai container sotto forma di volumi montati.
  • Il componente aggiuntivo Secret Manager è supportato sia nei cluster Standard che nei cluster Autopilot.
  • Il componente aggiuntivo Secret Manager supporta i deployment linux/arm64 e linux/amd64.

Limitazioni

Questa release di anteprima del componente aggiuntivo di Secret Manager non supporta le seguenti funzionalità disponibili nel driver CSI dell'archivio Secret open source:

Prima di iniziare

  • Abilita le API Secret Manager and Google Kubernetes Engine.

    Abilita le API

  • Se vuoi utilizzare Google Cloud CLI per questa attività, installa e initialize gcloud CLI. Se hai già installato gcloud CLI, scarica la versione più recente eseguendo il comando gcloud components update.

  • Assicurati che il cluster esegua GKE versione 1.29 o successive con un'immagine del nodo Linux. Il componente aggiuntivo Secret Manager non supporta i nodi Windows Server.

Installa il componente aggiuntivo Secret Manager

Puoi installare il componente aggiuntivo Secret Manager su cluster standard e cluster Autopilot. Assicurati che la federazione di Workload Identity per GKE sia abilitata sul cluster Standard. La federazione delle identità per i carichi di lavoro per GKE è abilitata per impostazione predefinita su un cluster Autopilot. I pod Kubernetes usano l'identità del carico di lavoro per l'autenticazione nell'API Secret Manager.

Installa il componente aggiuntivo Secret Manager su un nuovo cluster GKE

Per installare il componente aggiuntivo Secret Manager durante la creazione del cluster, segui questi passaggi:

Cluster standard

  • Per abilitare il componente aggiuntivo Secret Manager su un nuovo cluster Standard, esegui questo comando:

    gcloud beta container clusters create CLUSTER_NAME \
        --enable-secret-manager \
        --location=LOCATION \
        --cluster-version=VERSION \
        --workload-pool=PROJECT_ID.svc.id.goog
    

    Sostituisci quanto segue:

    • CLUSTER_NAME: il nome del tuo cluster.
    • LOCATION: la regione o la zona di Compute Engine per il cluster.
    • VERSION: la versione specifica di GKE che vuoi utilizzare. Assicurati che il cluster esegua GKE versione 1.29 o successiva. Se il canale di rilascio predefinito non include questa versione, usa il flag --release-channel per scegliere un canale di rilascio che la include.
    • PROJECT_ID: l'ID del tuo progetto Google Cloud.

Cluster Autopilot

  • Per abilitare il componente aggiuntivo Secret Manager su un nuovo cluster Autopilot, esegui questo comando:

    gcloud beta container clusters create-auto CLUSTER_NAME \
        --enable-secret-manager \
        --cluster-version=VERSION \
        --location=LOCATION
    

    Sostituisci quanto segue:

    • CLUSTER_NAME: il nome del cluster
    • VERSION: la versione specifica di GKE che vuoi utilizzare. Assicurati che il cluster esegua GKE versione 1.29 o successiva. Se il canale di rilascio predefinito non include questa versione, usa il flag --release-channel per scegliere un canale di rilascio che includa questa versione.
    • LOCATION: la regione per il cluster, ad esempio us-central1.

Dopo aver abilitato il componente aggiuntivo Secret Manager, puoi utilizzare il driver CSI dell'archivio secret nei volumi Kubernetes utilizzando il nome del driver e del provisioner: secrets-store-gke.csi.k8s.io.

Installa il componente aggiuntivo Secret Manager su un cluster GKE esistente

Per abilitare il componente aggiuntivo Secret Manager su un cluster esistente, esegui questo comando:

  gcloud beta container clusters update CLUSTER_NAME \
      --enable-secret-manager \
      --location=LOCATION

Sostituisci quanto segue:

  • CLUSTER_NAME: il nome del cluster esistente
  • LOCATION: la regione per il cluster, ad esempio us-central1.

Configura le applicazioni per l'autenticazione nell'API Secret Manager

Il provider Google Secret Manager utilizza l'identità del carico di lavoro del pod su cui è montato un secret durante l'autenticazione all'API Secret Manager. Per consentire alle tue applicazioni di eseguire l'autenticazione nell'API Secret Manager utilizzando la federazione di Workload Identity per GKE, segui questi passaggi:

  • Utilizza un criterio di Identity and Access Management (IAM) per associare un account di servizio IAM a un account di servizio Kubernetes. Puoi creare un nuovo ServiceAccount Kubernetes o utilizzarne uno esistente in qualsiasi spazio dei nomi, incluso quello predefinito.
  • Utilizza le associazioni IAM per concedere all'account di servizio IAM l'accesso ai secret in Secret Manager.

I pod che utilizzano l'account di servizio Kubernetes configurato si autenticano automaticamente come account di servizio IAM quando accedono all'API Secret Manager.

Associa l'account di servizio Kubernetes all'account di servizio IAM

Consenti all'account di servizio Kubernetes di impersonare l'account di servizio IAM aggiungendo un'associazione dei criteri IAM tra i due account di servizio.

Usa un nuovo ServiceAccount Kubernetes

  1. Salva il seguente manifest come service-account.yaml:

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: KSA_NAME
      namespace: NAMESPACE
      annotations:
        iam.gke.io/gcp-service-account: GSA_NAME@PROJECT_ID.iam.gserviceaccount.com
    

    Sostituisci quanto segue:

    • KSA_NAME: il nome del tuo nuovo ServiceAccount Kubernetes
    • NAMESPACE: il nome dello spazio dei nomi Kubernetes per il ServiceAccount.
    • GSA_NAME: nome dell'account di servizio IAM
    • PROJECT_ID: l'ID del progetto Google Cloud per il tuo account di servizio IAM
  2. Applica il manifest:

    kubectl apply -f service-account.yaml
    
  3. Per associare l'account di servizio IAM a un nuovo ServiceAccount Kubernetes, esegui questo comando:

    gcloud iam service-accounts add-iam-policy-binding \
        --role roles/iam.workloadIdentityUser \
        --member "serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE/KSA_NAME]" \
        GSA_NAME@PROJECT_ID.iam.gserviceaccount.com
    

Usa un ServiceAccount Kubernetes esistente

Per associare l'account di servizio IAM a un ServiceAccount Kubernetes esistente, esegui questo comando:

gcloud iam service-accounts add-iam-policy-binding \
    --role roles/iam.workloadIdentityUser \
    --member "serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE/KSA_NAME]" \
    GSA_NAME@PROJECT_ID.iam.gserviceaccount.com

Sostituisci quanto segue:

  • KSA_NAME: il nome del tuo account di servizio Kubernetes esistente
  • NAMESPACE: il nome dello spazio dei nomi Kubernetes per il ServiceAccount.
  • GSA_NAME: nome dell'account di servizio IAM
  • PROJECT_ID: l'ID del progetto Google Cloud per il tuo account di servizio IAM

Concedi all'account di servizio IAM l'autorizzazione ad accedere al secret

Per concedere all'account di servizio l'autorizzazione ad accedere al secret, esegui questo comando:

gcloud secrets add-iam-policy-binding SECRET_NAME \
    --member=serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
    --role=roles/secretmanager.secretAccessor

Sostituisci quanto segue:

  • SECRET_NAME: il nome del secret in Secret Manager
  • GSA_NAME: nome dell'account di servizio IAM
  • PROJECT_ID: l'ID del progetto Google Cloud per il tuo account di servizio IAM

Definisci i secret da montare

Per specificare quali secret montare come file nel pod Kubernetes, crea un manifest YAML SecretProviderClass ed elenca i secret da montare e il nome file in cui montarli. Segui questi passaggi:

  1. Salva il seguente manifest come app-secrets.yaml:

    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: SECRET_PROVIDER_CLASS_NAME
    spec:
      provider: gke
      parameters:
        secrets: |
          - resourceName: "projects/PROJECT_ID/secrets/SECRET_NAME/versions/SECRET_VERSION"
            path: "FILENAME.txt"
    

    Sostituisci quanto segue:

    • SECRET_PROVIDER_CLASS_NAME: il nome dell'oggetto SecretProviderClass
    • PROJECT_ID: il tuo ID progetto
    • SECRET_NAME: il nome del secret
    • SECRET_VERSION: la versione del secret
    • FILENAME.txt: il nome file in cui verrà montato il valore del secret. Puoi creare più file utilizzando le variabili resourceName e path.
  2. Applica il manifest:

    kubectl apply -f app-secrets.yaml
    
  3. Verifica che l'oggetto SecretProviderClass sia stato creato:

    kubectl get SecretProviderClasses
    

Configura un volume in cui verranno montati i secret

  1. Salva la seguente configurazione come my-pod.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: POD_NAME
      namespace: default
    spec:
      serviceAccountName: KSA_NAME
      containers:
      - image: IMAGE_NAME
        imagePullPolicy: IfNotPresent
        name: POD_NAME
        resources:
          requests:
            cpu: 100m
        stdin: true
        stdinOnce: true
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        tty: true
        volumeMounts:
          - mountPath: "/var/secrets"
            name: mysecret
      volumes:
      - name: mysecret
        csi:
          driver: secrets-store-gke.csi.k8s.io
          readOnly: true
          volumeAttributes:
            secretProviderClass: SECRET_PROVIDER_CLASS_NAME
    

    Sostituisci quanto segue:

    • POD_NAME: il nome del pod Kubernetes in cui è montato il secret
    • KSA_NAME: l'account di servizio Kubernetes che hai configurato nel passaggio Configurare l'account di servizio Workload Identity
    • IMAGE_NAME: nome dell'immagine container
    • SECRET_PROVIDER_CLASS_NAME: il nome dell'oggetto SecretProviderClass
  2. Applica la configurazione al cluster.

    kubectl apply -f my-pod.yaml
    

Questo passaggio monta un volume mysecret in /var/secrets utilizzando il driver CSI (secrets-store-gke.csi.k8s.io). Questo volume fa riferimento all'oggetto SecretProviderClass che agisce da provider.

Esegui la migrazione dal driver CSI dell'archivio dei secret esistente

Se stai eseguendo la migrazione al componente aggiuntivo Secret Manager dall'installazione esistente del driver CSI dell'archivio secret, aggiorna il manifest del pod come segue:

  1. Aggiorna il nome di SecretProviderClass e provider come descritto nel seguente file manifest:

    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: app-secrets-gke
    spec:
      provider: gke
      parameters:
        secrets: |
          - resourceName: "projects/<project_id>/secrets/<secret_name>/versions/<secret_version>"
            path: "good1.txt"
    
  2. Aggiorna driver e secretProviderClass per il volume Kubernetes come descritto nel seguente manifest:

    volumes:
      - name: mysecret
        csi:
          driver: secrets-store-gke.csi.k8s.io
          readOnly: true
          volumeAttributes:
            secretProviderClass: "app-secrets-gke"
    

Disabilita il componente aggiuntivo Secret Manager

Per disabilitare il componente aggiuntivo Secret Manager su un cluster Standard esistente o su un cluster Autopilot, esegui questo comando:

  gcloud beta container clusters update CLUSTER_NAME \
      --no-enable-secret-manager \
      --region=REGION

Sostituisci quanto segue:

  • CLUSTER_NAME: il nome del cluster
  • REGION: la regione del cluster, ad esempio us-central1