Usar el complemento Secret Manager con Google Kubernetes Engine

La integración entre Secret Manager y Google Kubernetes Engine (GKE) te permite almacenar datos sensibles, como contraseñas y certificados utilizados por los clústeres de GKE, como secretos en Secret Manager.

En esta página se explica cómo puedes usar el complemento Secret Manager para acceder a los secretos almacenados en Secret Manager como volúmenes montados en pods de Kubernetes.

Este proceso implica los siguientes pasos:

  1. Habilita el complemento Secret Manager en un clúster de GKE nuevo o ya creado.
  2. Configura las aplicaciones para que se autentiquen en la API Secret Manager.
  3. Define qué secretos se van a montar en los pods de Kubernetes mediante un archivo SecretProviderClass YAML. El complemento Secret Manager admite secretos globales y regionales.
  4. Crea un volumen en el que se montarán los secretos. Una vez que se haya adjuntado el volumen, las aplicaciones del contenedor podrán acceder a los datos del sistema de archivos del contenedor.

El complemento Secret Manager se deriva del controlador CSI de Secrets Store de Kubernetes de código abierto y del proveedor Google Secret Manager. Si usas el controlador CSI de Secrets Store de código abierto para acceder a los secretos, puedes migrar al complemento Secret Manager. Para obtener información, consulta el artículo Migrar desde el controlador CSI de Secrets Store.

Ventajas

El complemento Secret Manager ofrece las siguientes ventajas:

  • Puedes usar una solución totalmente gestionada y compatible para acceder a los secretos de Secret Manager desde GKE sin ninguna sobrecarga operativa.
  • No tienes que escribir código personalizado para acceder a los secretos almacenados en Secret Manager.
  • Puedes almacenar y gestionar todos tus secretos de forma centralizada en Secret Manager y acceder a ellos de forma selectiva desde pods de GKE mediante el complemento Secret Manager. De esta forma, puedes usar las funciones que ofrece Secret Manager, como el cifrado con CMEK, el control de acceso detallado, la rotación gestionada, la gestión del ciclo de vida y los registros de auditoría, así como las funciones de Kubernetes, como la transferencia de secretos a contenedores en forma de volúmenes montados.
  • El complemento Secret Manager es compatible con clústeres Standard y clústeres Autopilot.
  • El complemento Secret Manager es compatible con los nodos que usan imágenes de nodo de Container-Optimized OS o Ubuntu.

Limitaciones

El complemento Secret Manager tiene las siguientes limitaciones:

  • El complemento Secret Manager no admite la siguiente función, que está disponible en el controlador CSI de Secrets Store de código abierto:

  • El complemento Secret Manager no es compatible con los nodos de Windows Server.

Antes de empezar

  • Enable the Secret Manager and Google Kubernetes Engine APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  • Si quieres usar Google Cloud CLI para esta tarea, instala y, a continuación, inicializa gcloud CLI. Si ya has instalado la CLI de gcloud, obtén la versión más reciente ejecutando el comando gcloud components update.

    No puedes configurar manualmente el complemento Secret Manager con el SDK de Google Cloud ni con la Google Cloud consola.

  • Asegúrate de que tu clúster ejecute la versión 1.27.14-gke.1042001 de GKE o una posterior con una imagen de nodo de Linux.

  • Si usas un clúster Estándar de GKE, asegúrate de que tenga habilitada la federación de Workload Identity para GKE. Workload Identity Federation para GKE está habilitado de forma predeterminada en los clústeres Autopilot. Los pods de Kubernetes usan Workload Identity Federation para GKE para autenticarse en la API Secret Manager.

Habilita el complemento Secret Manager

Puedes habilitar el complemento Secret Manager tanto en clústeres estándar como en clústeres Autopilot.

Habilitar el complemento Secret Manager en un clúster de GKE nuevo

Para habilitar el complemento Secret Manager al crear un clúster, sigue estos pasos:

Consola

  1. En la Google Cloud consola, ve a la página Google Kubernetes Engine.

    Ir a Google Kubernetes Engine

  2. Haz clic en Crear.

  3. En el cuadro de diálogo Crear clúster, haz clic en Configurar.

  4. En el menú de navegación, en la sección Clúster, haga clic en Seguridad.

  5. Marca la casilla Habilitar Secret Manager.

  6. Selecciona la casilla Habilitar Workload Identity.

  7. Sigue configurando el clúster y, a continuación, haz clic en Crear.

gcloud

{ Standard cluster}

Para habilitar el complemento Secret Manager en un clúster Standard nuevo, ejecuta el siguiente comando:

Antes de usar los datos de los comandos que se indican a continuación, haz los siguientes cambios:

  • CLUSTER_NAME: el nombre de tu clúster.
  • LOCATION: la región de Compute Engine del clúster, como us-central1.
  • VERSION: la versión específica de GKE que quieres usar. Asegúrate de que tu clúster ejecute la versión 1.27.14-gke.1042001 de GKE o una posterior. Si el canal de lanzamiento predeterminado no incluye esta versión, usa la marca --release-channel para elegir un canal de lanzamiento que sí la incluya.
  • PROJECT_ID: el ID de tu proyecto de Google Cloud .

Ejecuta el siguiente comando:

Linux, macOS o Cloud Shell

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

Windows (PowerShell)

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

Windows (cmd.exe)

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

{Clúster de Autopilot}

Para habilitar el complemento Secret Manager en un clúster de Autopilot nuevo, ejecuta el siguiente comando:

Antes de usar los datos de los comandos que se indican a continuación, haz los siguientes cambios:

Ejecuta el siguiente comando:

Linux, macOS o Cloud Shell

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

Windows (PowerShell)

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

Windows (cmd.exe)

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

Una vez que hayas habilitado el complemento Secret Manager, podrás usar el controlador de CSI de Secrets Store en volúmenes de Kubernetes con el nombre del controlador y del aprovisionador: secrets-store-gke.csi.k8s.io.

Habilitar el complemento Secret Manager en un clúster de GKE

Para habilitar el complemento Secret Manager en un clúster, sigue estos pasos:

Consola

  1. En la Google Cloud consola, ve a la página Google Kubernetes Engine.

    Ir a Google Kubernetes Engine

  2. En la lista de clústeres, haga clic en el nombre del clúster que quiera modificar.

  3. En la página de detalles del clúster, en la sección Seguridad, haga clic en Secret Manager.

  4. En el cuadro de diálogo Editar Secret Manager, selecciona la casilla Habilitar Secret Manager.

  5. Haz clic en Guardar cambios.

gcloud

Antes de usar los datos de los comandos que se indican a continuación, haz los siguientes cambios:

  • CLUSTER_NAME: el nombre de tu clúster
  • LOCATION: la región de Compute Engine del clúster, como us-central1

Ejecuta el siguiente comando:

Linux, macOS o Cloud Shell

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

Windows (PowerShell)

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

Windows (cmd.exe)

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

Configurar la rotación automática de secretos

Puedes configurar el complemento Secret Manager para que rote automáticamente los secretos, de forma que los secretos actualizados en Secret Manager después de la implementación inicial del pod se envíen al pod de forma automática y periódica. La rotación automática de secretos montados permite que las aplicaciones reciban automáticamente secretos actualizados sin necesidad de reiniciarse ni de intervención manual. Esta función asegura que las aplicaciones siempre usen los secretos más actualizados.

Ten en cuenta lo siguiente sobre la configuración de la rotación automática de secretos:

  • La rotación automática de secretos es una configuración opcional.
  • Puedes configurar esta función al crear un clúster o al actualizar uno que ya tengas.
  • La rotación automática de secretos se admite en la versión 1.32.2-gke.1059000 de GKE o una posterior.

Para configurar la rotación automática de secretos, debes habilitar la función enable-secret-manager-rotation y configurar el intervalo de rotación definiendo secret-manager-rotation-interval.

Por ejemplo, para configurar la rotación automática en un clúster de GKE, usa el siguiente comando:

  gcloud container clusters update CLUSTER_NAME \
      --enable-secret-manager \
      --location=LOCATION \
      --enable-secret-manager-rotation \
      --secret-manager-rotation-interval=ROTATION_INTERVAL

Haz los cambios siguientes:

  • CLUSTER_NAME: el nombre del clúster
  • LOCATION: la ubicación de tu clúster, como us-central1
  • ROTATION_INTERVAL: el intervalo de rotación en segundos. El intervalo de rotación predeterminado es de 120 segundos.

Verificar la instalación del complemento Secret Manager

Para verificar que el complemento Secret Manager está instalado en el clúster de Kubernetes, ejecuta el siguiente comando:

  gcloud container clusters describe CLUSTER_NAME --location LOCATION | grep secretManagerConfig -A 4

Haz los cambios siguientes:

  • CLUSTER_NAME: el nombre del clúster
  • LOCATION: la ubicación de tu clúster, como us-central1

Configurar aplicaciones para autenticarse en la API Secret Manager

El proveedor de Google Secret Manager usa la identidad de carga de trabajo del pod en el que se monta un secreto al autenticarse en la API Secret Manager. Para permitir que tus aplicaciones se autentiquen en la API Secret Manager mediante Workload Identity Federation para GKE, sigue estos pasos:

  • Crea una cuenta de servicio de Kubernetes o usa una que ya tengas en el mismo espacio de nombres que el pod en el que quieras montar el secreto.

  • Crea una política de gestión de identidades y accesos (IAM) para el secreto en Secret Manager.

Los pods que usan la cuenta de servicio de Kubernetes configurada se autentican automáticamente como el identificador principal de gestión de identidades y accesos que corresponde a la cuenta de servicio de Kubernetes al acceder a la API Secret Manager.

Crear una cuenta de servicio de Kubernetes

  1. Guarda el siguiente archivo de manifiesto como service-account.yaml:

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: KSA_NAME
      namespace: NAMESPACE
    

    Haz los cambios siguientes:

    • KSA_NAME: el nombre de tu nueva cuenta de servicio de Kubernetes
    • NAMESPACE: el nombre del espacio de nombres de Kubernetes de ServiceAccount
  2. Aplica el archivo de manifiesto:

    kubectl apply -f service-account.yaml
    
  3. Crea una política de gestión de identidades y accesos de permiso que haga referencia a la nueva cuenta de servicio de Kubernetes y concédele permiso para acceder al secreto:

    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
    

    Haz los cambios siguientes:

    • SECRET_NAME: el nombre del secreto en Secret Manager
    • PROJECT_NUMBER: tu Google Cloud número de proyecto
    • PROJECT_ID: el ID del proyecto Google Cloud que contiene tu clúster de GKE
    • NAMESPACE: el nombre del espacio de nombres de Kubernetes de ServiceAccount
    • KSA_NAME: el nombre de tu cuenta de servicio de Kubernetes

Usar una cuenta de servicio de Kubernetes

Crea una política de gestión de identidades y accesos de permiso que haga referencia a la cuenta de servicio de Kubernetes y concédele permiso para acceder al secreto:

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

Haz los cambios siguientes:

  • SECRET_NAME: el nombre del secreto en Secret Manager
  • PROJECT_NUMBER: tu Google Cloud número de proyecto
  • PROJECT_ID: el ID del proyecto Google Cloud que contiene tu clúster de GKE
  • NAMESPACE: el nombre del espacio de nombres de Kubernetes de ServiceAccount
  • KSA_NAME: el nombre de tu cuenta de servicio de Kubernetes

Define qué secretos quieres montar

Para especificar qué secretos se van a montar como archivos en el pod de Kubernetes, crea un manifiesto YAML SecretProviderClass y enumera los secretos que se van a montar y el nombre de archivo con el que se van a montar. Sigue estos pasos:

  1. Guarda el siguiente archivo de manifiesto como 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"
    

    Haz los cambios siguientes:

    • SECRET_PROVIDER_CLASS_NAME: el nombre del objeto SecretProviderClass.
    • PROJECT_ID: tu ID de proyecto.
    • SECRET_NAME: el nombre del secreto.
    • SECRET_VERSION: la versión del secreto. La versión del secreto debe estar en la misma región que el clúster.
    • FILENAME.txt: el nombre del archivo en el que se montará el valor del secreto. Puedes crear varios archivos con las variables resourceName y path.

    En el caso de un secreto regional, resourceName es la ruta completa al recurso del secreto, que incluye la ubicación del secreto regional. Por ejemplo: "projects/PROJECT_ID/locations/LOCATION/secrets/SECRET_NAME/versions/SECRET_VERSION"

  2. Aplica el archivo de manifiesto:

    kubectl apply -f app-secrets.yaml -n NAMESPACE
    

    Sustituye NAMESPACE por el nombre del espacio de nombres de Kubernetes de ServiceAccount.

  3. Verifica que se haya creado el objeto SecretProviderClass:

    kubectl get SecretProviderClasses -n NAMESPACE
    

Configura un volumen en el que se montarán los secretos.

  1. Guarda la siguiente configuración como my-pod.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: POD_NAME
      namespace: NAMESPACE
    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
    

    Haz los cambios siguientes:

    • POD_NAME: el nombre del pod de Kubernetes en el que se monta el secreto
    • NAMESPACE: el nombre del espacio de nombres de Kubernetes de ServiceAccount
    • KSA_NAME: la cuenta de servicio de Kubernetes que has configurado en el paso Configurar aplicaciones para que se autentiquen en la API Secret Manager
    • IMAGE_NAME: nombre de la imagen del contenedor
    • SECRET_PROVIDER_CLASS_NAME: el nombre del objeto SecretProviderClass
  2. Solo en clústeres estándar, añade lo siguiente al campo template.spec para colocar los pods en grupos de nodos que usen Workload Identity Federation para GKE.

    Omite este paso en los clústeres de Autopilot, que rechazan este nodeSelector, ya que todos los nodos usan Workload Identity Federation para GKE.

    spec:
      nodeSelector:
        iam.gke.io/gke-metadata-server-enabled: "true"
    
  3. Aplica la configuración a tu clúster.

    kubectl apply -f my-pod.yaml
    

En este paso se monta un volumen mysecret en /var/secrets mediante el controlador de CSI (secrets-store-gke.csi.k8s.io). Este volumen hace referencia al objeto SecretProviderClass, que actúa como proveedor.

Migrar desde el controlador de CSI de Secrets Store

Si vas a migrar al complemento Secret Manager desde tu instalación del controlador CSI de Secrets Store, actualiza el manifiesto de tu pod de la siguiente manera:

  1. Actualiza el nombre de tu SecretProviderClass y el provider tal como se describe en el siguiente archivo de manifiesto:

    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. Actualiza driver y secretProviderClass de tu volumen de Kubernetes, tal como se describe en el siguiente archivo de manifiesto:

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

Inhabilitar el complemento Secret Manager

Para inhabilitar el complemento Secret Manager en un clúster estándar o Autopilot, ejecuta el siguiente comando:

Consola

  1. En la Google Cloud consola, ve a la página Google Kubernetes Engine.

    Ir a Google Kubernetes Engine

  2. En la lista de clústeres, haga clic en el nombre del clúster que quiera modificar.

  3. En la página de detalles del clúster, en la sección Seguridad, haga clic en Secret Manager.

  4. En el cuadro de diálogo Editar Secret Manager, desmarca la casilla Habilitar Secret Manager.

  5. Haz clic en Guardar cambios.

gcloud

Antes de usar los datos de los comandos que se indican a continuación, haz los siguientes cambios:

  • CLUSTER_NAME: el nombre de tu clúster
  • REGION: la región de Compute Engine del clúster, como us-central1

Ejecuta el siguiente comando:

Linux, macOS o Cloud Shell

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

Windows (PowerShell)

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

Windows (cmd.exe)

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