Autenticación de clústeres de Workload Identity

En este documento, se describe cómo configurar y usar la autenticación de clústeres de Workload Identity para Google Distributed Cloud connected. En lugar de las claves de cuenta de servicio, la autenticación de clústeres de Workload Identity usa tokens de corta duración y la federación de identidades para cargas de trabajo para permitir que tus cargas de trabajo accedan a los Google Cloud recursos de forma segura. Las credenciales de corta duración son tokens de acceso de OAuth 2.0. De forma predeterminada, los tokens de acceso vencen después de 1 hora.

Con la autenticación de clústeres de Workload Identity, tus cargas de trabajo pueden usar su propia identidad de Kubernetes para acceder Google Cloud a los recursos directamente o suplantar una cuenta de servicio de Google.

La autenticación de clústeres de Workload Identity proporciona dos beneficios principales en comparación con el uso de claves de cuenta de servicio:

  • Seguridad mejorada: Las claves de cuenta de servicio son un riesgo de seguridad si no se administran de forma adecuada. Los tokens de OAuth 2.0 y la federación de identidades para cargas de trabajo se consideran alternativas de prácticas recomendadas a las claves de cuenta de servicio. Para obtener más información sobre los tokens de cuenta de servicio, consulta Credenciales de cuenta de servicio de corta duración. Para obtener más información sobre la federación de identidades para cargas de trabajo, consulta Federación de identidades para cargas de trabajo.

  • Mantenimiento reducido: Las claves de cuenta de servicio requieren más mantenimiento. Rotar y proteger estas claves con regularidad puede crear una carga administrativa.

Esta página está destinada a administradores, arquitectos y operadores que configuran, supervisan y administran el ciclo de vida de la infraestructura tecnológica subyacente. Para obtener más información sobre los roles comunes y las tareas de ejemplo a las que hacemos referencia en Google Cloud el contenido, consulta Roles y tareas comunes de los usuarios de GKE.

Administración de clústeres

En esta guía, se aborda la federación de identidades para cargas de trabajo para tus aplicaciones. La federación de identidades para cargas de trabajo a nivel del clúster se administra automáticamente para los clústeres de Distributed Cloud connected.

Google crea y administra los clústeres de Distributed Cloud connected a través de la API de Distributed Cloud Edge Container, ya sea con el gcloud edge-cloud container clusters create comando o en la Google Cloud consola.

Los clústeres de Distributed Cloud connected se registran automáticamente en una flota en el proyecto en el que se crean. No es necesario realizar ningún registro manual de la flota. El grupo de federación de identidades para cargas de trabajo está disponible automáticamente y sigue el formato PROJECT_ID.svc.id.goog.

Antes de comenzar

  • Antes de configurar la federación de identidades para cargas de trabajo, verifica que las siguientes APIs en tu Google Cloud proyecto estén habilitadas. Para obtener información sobre cómo habilitar las APIs, consulta Habilita servicios:

    • iam.googleapis.com
    • sts.googleapis.com
    • iamcredentials.googleapis.com
    • gkehub.googleapis.com
  • Asegúrate de tener instaladas las siguientes herramientas de línea de comandos:

    • La versión más reciente de la Google Cloud CLI, que incluye gcloud, la herramienta de línea de comandos para interactuar con Google Cloud.
    • kubectl

    Si usas Cloud Shell como entorno de shell para interactuar con Google Cloud, estas herramientas están instaladas.

  • Asegúrate de haber inicializado la gcloud CLI para usarla en tu proyecto.

  • Asegúrate de tener los siguientes roles de IAM en el proyecto. Estos roles son necesarios para realizar la configuración:

    • Propietario (roles/owner) o
    • Administrador de seguridad de IAM (roles/iam.securityAdmin) y administrador de cuentas de servicio (roles/iam.serviceAccountAdmin)

En las siguientes secciones, crearás cuentas de servicio y otorgarás los roles necesarios para la autenticación de clústeres de Workload Identity.

Recomendado: Acceso directo a los recursos de la federación de identidades para cargas de trabajo

Con el acceso directo a los recursos de la federación de identidades para cargas de trabajo, usas la federación de identidades para cargas de trabajo para otorgar un rol de IAM a una ServiceAccount de Kubernetes de modo que pueda acceder directamente a los Google Cloudrecursos.

Identidad Objetivo Funciones
Cuenta de servicio de Kubernetes La identidad de Kubernetes que usa tu carga de trabajo. Otorga a esta identidad los roles necesarios para acceder a los recursos requeridos Google Cloud . En este ejemplo, se otorgan el rol roles/storage.objectViewer y el rol roles/logging.admin. roles/storage.objectViewer
roles/logging.admin

Alternativa: Suplantación de identidad temporal como cuenta de servicio de IAM

Como alternativa, puedes configurar tu ServiceAccount de Kubernetes para que use la identidad temporal como cuenta de servicio de IAM.

Cuenta de servicio Objetivo Funciones
Cuenta de servicio de Google La cuenta de servicio de Google que suplanta tu carga de trabajo en el clúster. Otorga a esta cuenta de servicio los roles necesarios para acceder a los recursos requeridos Google Cloud Depende de los recursos a los que se accede.
Cuenta de servicio de Kubernetes Otorga a esta identidad la capacidad de suplantar la cuenta de servicio de Google. Esta concesión usa el rol roles/iam.workloadIdentityUser. roles/iam.workloadIdentityUser

Configura cuentas de servicio

En las siguientes secciones, se incluyen instrucciones para crear la ServiceAccount de Kubernetes requerida y otorgarle los roles necesarios para la autenticación de clústeres de Workload Identity con el acceso directo a los recursos de la federación de identidades para cargas de trabajo o la suplantación de la identidad de la cuenta de servicio de Google.

Crea una ServiceAccount de Kubernetes

En tu clúster, usa el kubectl create comando para crear una ServiceAccount de Kubernetes para tus pods. También puedes usar cualquier ServiceAccount existente, incluida la ServiceAccount predeterminada en el espacio de nombres.

kubectl create serviceaccount KSA_NAME --namespace NAMESPACE

Reemplaza los siguientes valores:

  • KSA_NAME: Un nombre para tu ServiceAccount de Kubernetes

  • NAMESPACE: El espacio de nombres de tu clúster

Usa la federación de identidades para cargas de trabajo para otorgar acceso directo a los recursos

Para otorgar roles de Identity and Access Management directamente a la identidad de tu ServiceAccount de Kubernetes, sigue estos pasos.

  1. Usa el comando gcloud projects describe para encontrar el número de tu proyecto:

    gcloud projects describe PROJECT_ID --format="value(projectNumber)"
    

    Reemplaza PROJECT_ID por el ID de tu proyecto.

  2. Usa el comando gcloud projects add-iam-policy-binding para otorgar los roles necesarios al principal de identidad de Kubernetes:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="principal://iam.gserviceaccount.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \
        --role=roles/storage.objectViewer
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="principal://iam.gserviceaccount.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \
        --role=roles/logging.admin
    

    Reemplaza los siguientes valores:

    • PROJECT_NUMBER: El número de tu proyecto
    • NAMESPACE: El espacio de nombres de tu clúster
    • KSA_NAME: El nombre de tu ServiceAccount de Kubernetes

Alternativa: Usa la suplantación de la identidad de la cuenta de servicio de IAM para otorgar acceso

Si prefieres que tus cargas de trabajo suplanten una cuenta de servicio de Google, sigue estos pasos.

  1. Usa el comando gcloud iam service-accounts create para crear una cuenta de servicio de Google:

    gcloud iam service-accounts create my-app-sa \
        --project=PROJECT_ID
    

    Reemplaza PROJECT_ID por el ID de tu proyecto.

  2. Usa el comando gcloud projects add-iam-policy-binding para otorgar a la cuenta de servicio de Google los roles necesarios:

    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=serviceAccount:my-app-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/storage.objectViewer
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=serviceAccount:my-app-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/logging.admin
    
  3. Usa el comando gcloud iam service-accounts add-iam-policy-binding para otorgar a la ServiceAccount de Kubernetes la capacidad de usar la identidad de la cuenta de servicio de Google:

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

    Reemplaza los siguientes valores:

    • NAMESPACE: El espacio de nombres de tu clúster
    • KSA_NAME: El nombre de tu ServiceAccount de Kubernetes
  4. Usa el comando kubectl annotate para anotar la ServiceAccount de Kubernetes y vincularla a la cuenta de servicio de Google:

    kubectl annotate serviceaccount \
        --namespace NAMESPACE KSA_NAME \
        iam.gke.io/gcp-service-account=my-app-sa@PROJECT_ID.iam.gserviceaccount.com
    

Configura la carga de trabajo

Actualiza la especificación del Pod para usar la ServiceAccount de Kubernetes y activar el volumen de token proyectado. Debido a que los clústeres de Distributed Cloud connected están fuera de Google Cloud, también debes proporcionar un archivo de configuración de credenciales y configurar la GOOGLE_APPLICATION_CREDENTIALS variable de entorno para que apunte a ese archivo. Google Cloud Las bibliotecas cliente dentro del pod usan estos para intercambiar el token de Kubernetes por un token de acceso a través de la API de Security Token Service. Google Cloud

  1. Genera el archivo credential-configuration.json. Elige el comando según si usas el acceso directo a los recursos de la federación de identidades para cargas de trabajo o la identidad temporal como cuenta de servicio de IAM.

    Acceso directo a los recursos de la federación de identidades para cargas de trabajo

    Usa el comando gcloud iam workload-identity-pools create-cred-config:

    gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/providers/attestor \
        --credential-source-file=/var/run/secrets/tokens/gcp-ksa/token \
        --credential-source-type=text \
        --output-file=credential-configuration.json
    

    Usa la suplantación de la identidad de la cuenta de servicio de IAM para otorgar acceso

    Usa el comando gcloud iam workload-identity-pools create-cred-config:

    gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/providers/attestor \
        --service-account=my-app-sa@PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/secrets/tokens/gcp-ksa/token \
        --credential-source-type=text \
        --output-file=credential-configuration.json
    

    Reemplaza PROJECT_NUMBER por el número de tu proyecto. Google Cloud Para encontrar el número del proyecto, ejecuta gcloud projects describe PROJECT_ID --format="value(projectNumber)".

  2. Usa el kubectl create configmap comando para crear un ConfigMap de Kubernetes para almacenar el archivo de configuración:

    kubectl create configmap CREDENTIAL_CONFIG_MAP \
        --namespace NAMESPACE \
        --from-file=credential-configuration.json
    

    Reemplaza los siguientes valores:

    • CREDENTIAL_CONFIG_MAP: Un nombre para tu ConfigMap, que contiene tu archivo de configuración de credenciales

    • NAMESPACE: El espacio de nombres de tu clúster

  3. Actualiza la especificación de tu Pod con el siguiente contenido de YAML:

    spec:
      serviceAccountName: KSA_NAME
      containers:
      - name: MY_CONTAINER
        image: MY_IMAGE
        env:
        - name: GOOGLE_APPLICATION_CREDENTIALS
          value: /var/run/secrets/tokens/gcp-creds/credential-configuration.json
        volumeMounts:
        - mountPath: /var/run/secrets/tokens/gcp-ksa
          name: gcp-ksa
        - mountPath: /var/run/secrets/tokens/gcp-creds
          name: gcp-creds
          readOnly: true
      volumes:
      - name: gcp-ksa
        projected:
          defaultMode: 0420
          sources:
          - serviceAccountToken:
              path: token
              audience: PROJECT_ID.svc.id.goog
              expirationSeconds: 3600
      - name: gcp-creds
        configMap:
          name: CREDENTIAL_CONFIG_MAP
    

    Reemplaza los siguientes valores:

    • KSA_NAME: Un nombre para tu ServiceAccount de Kubernetes

    • MY_CONTAINER: El nombre de tu contenedor

    • MY_IMAGE: El nombre de tu imagen

Limitaciones

Las siguientes funciones y capacidades no son compatibles cuando usas la federación de identidades para cargas de trabajo para Distributed Cloud connected:

  • Usa un servidor proxy para el proceso de intercambio de tokens.

Para obtener información sobre el uso de la federación de identidades para cargas de trabajo con los Controles del servicio de VPC, consulta Configura la integración de los Controles del servicio de VPC.

¿Qué sigue?