Autenticar en las APIs de Google Cloud desde cargas de trabajo de flotas de confianza compartida

En esta página se explica cómo configurar las aplicaciones para que se autentiquen enGoogle Cloud APIs como la API Compute Engine o la API AI Platform desde flotas que tengan un modelo de confianza compartido en toda la flota. Si tu flota tiene un modelo de confianza mixto, consulta el artículo Autenticar en APIs desde cargas de trabajo de flotas con confianza mixta Google Cloud (vista previa).

Esta página está dirigida a administradores y operadores de la plataforma, así como a ingenieros de seguridad que quieran autenticarse de forma programática desde cargas de trabajo de la flota en las APIs de Google Cloud. Para obtener más información sobre los roles de usuario y las tareas de ejemplo que mencionamos en la documentación, consulta Roles y tareas comunes de usuario de GKE. Google Cloud

Antes de leer esta página, asegúrate de que conoces los siguientes conceptos:

Acerca de la federación de identidades de cargas de trabajo de flotas para entornos de confianza compartida

La federación de identidades de cargas de trabajo de flotas te permite autenticarte desde cargas de trabajo de flotas en lasGoogle Cloud APIs mediante mecanismos de autenticación Google Cloud integrados y de Kubernetes. La federación de identidades de carga de trabajo de flotas elimina la necesidad de usar métodos menos seguros, como montar tokens de acceso en pods o almacenar credenciales de larga duración.

De forma predeterminada, tu proyecto host de la flota usa un grupo de identidades de cargas de trabajo gestionado por Google para aprovisionar identidades de entidades de toda la flota. IAM considera que cualquier entidad de la flota o del proyecto host de la flota que tenga el mismo identificador de gestión de identidades y accesos es la misma. Esta identidad implícita es útil cuando se concede acceso a gran escala en entornos de confianza compartida, como flotas de un solo inquilino, donde no importa si otras entidades obtienen permisos similares en los recursos por error.

Antes de empezar

  • Asegúrate de que tienes instaladas las siguientes herramientas de línea de comandos:

    • La versión más reciente de 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 ya están instaladas.

  • Asegúrate de haber inicializado gcloud CLI para usarlo con tu proyecto.

Preparar los clústeres

Para que las aplicaciones de tu flota puedan recibir una identidad federada, los clústeres en los que se ejecutan deben registrarse en tu flota y configurarse correctamente para usar la federación de Workload Identity de la flota. En las siguientes secciones se describe cómo configurar la federación de identidades de cargas de trabajo de la flota para diferentes tipos de clústeres.

GKE

En el caso de los clústeres de GKE, haga lo siguiente:

  1. Habilita la federación de Workload Identity para GKE en tu clúster de Google Kubernetes Engine, si aún no lo has hecho.
  2. Registra el clúster en la flota.

También puedes habilitar Workload Identity Federation para GKE durante el proceso de creación de clústeres y registro de flotas.

Clústeres externos Google Cloud

Los siguientes tipos de clústeres habilitan automáticamente la federación de Workload Identity de la flota y se registran en tu flota durante la creación del clúster:

  • Google Distributed Cloud (solo software) en VMware
  • Google Distributed Cloud (solo software) en bare metal
  • GKE en AWS
  • GKE en Azure

Clústeres vinculados

Los clústeres adjuntos de EKS y AKS registrados mediante la API GKE Multi-Cloud se registran con la federación de Workload Identity de la flota habilitada de forma predeterminada. Los otros clústeres adjuntos se pueden registrar con la federación de identidades de cargas de trabajo de la flota habilitada si cumplen los requisitos necesarios. Sigue las instrucciones correspondientes a tu tipo de clúster en Registrar un clúster.

Usar la federación de identidades de cargas de trabajo de flotas en aplicaciones

En los siguientes pasos se explica cómo configurar una carga de trabajo en un clúster registrado para usar la federación de identidades de cargas de trabajo de la flota:

  1. Busca el nombre del grupo de identidades de carga de trabajo y del proveedor de identidades de tu clúster:

    gcloud container fleet memberships describe MEMBERSHIP_ID \
        --project=FLEET_PROJECT_ID \
        --format="table(authority.identityProvider,authority.workloadIdentityPool,name)"
    

    Haz los cambios siguientes:

    • MEMBERSHIP_ID: el nombre de pertenencia del clúster. Suele ser el nombre del clúster.
    • FLEET_PROJECT_ID: el ID del proyecto host de la flota.

    El resultado debería ser similar al siguiente:

    IDENTITY_PROVIDER: IDENTITY_PROVIDER
    WORKLOAD_IDENTITY_POOL: WORKLOAD_IDENTITY_POOL
    NAME: projects/FLEET_PROJECT_ID/locations/MEMBERSHIP_LOCATION/memberships/MEMBERSHIP_ID
    

    Este resultado contiene la siguiente información:

    • IDENTITY_PROVIDER: el proveedor de identidades del clúster.
    • MEMBERSHIP_LOCATION: la ubicación de la membresía de la flota. Normalmente, es la misma que la ubicación de tu clúster.
    • WORKLOAD_IDENTITY_POOL: el nombre del grupo de identidades de carga de trabajo asociado a tu flota. Este valor tiene la sintaxis FLEET_PROJECT_ID.svc.id.goog.
  2. Crea un espacio de nombres de Kubernetes. También puede usar cualquier espacio de nombres que ya tenga, incluido el espacio de nombres default.

    kubectl create namespace NAMESPACE
    

    Sustituye NAMESPACE por el nombre del espacio de nombres.

  3. Crea una cuenta de servicio de Kubernetes en el espacio de nombres. También puedes usar cualquier cuenta de servicio que ya tengas, incluida la cuenta de servicio default en el espacio de nombres.

    kubectl create serviceaccount KSA_NAME \
        --namespace=NAMESPACE
    

    Sustituye KSA_NAME por el nombre de la cuenta de servicio.

  4. Guarda el siguiente archivo de manifiesto como adc-config-map.yaml. Este ConfigMap contiene la configuración de ADC para las cargas de trabajo.

    kind: ConfigMap
    apiVersion: v1
    metadata:
      namespace: NAMESPACE
      name: my-cloudsdk-config
    data:
      config: |
        {
          "type": "external_account",
          "audience": "identitynamespace:WORKLOAD_IDENTITY_POOL:IDENTITY_PROVIDER",
          "subject_token_type": "urn:ietf:params:oauth:token-type:jwt",
          "token_url": "https://sts.googleapis.com/v1/token",
          "credential_source": {
            "file": "/var/run/secrets/tokens/gcp-ksa/token"
          }
        }
    
  5. Despliega el ConfigMap:

    kubectl create -f adc-config-map.yaml
    
  6. Guarda el siguiente archivo de manifiesto como workload-config.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
      namespace:  NAMESPACE
    spec:
      serviceAccountName: KSA_NAME
      containers:
      - name: sample-container
        image: google/cloud-sdk:slim
        command: ["sleep","infinity"]
        env:
        - name: GOOGLE_APPLICATION_CREDENTIALS
          value: /var/run/secrets/tokens/gcp-ksa/google-application-credentials.json
        volumeMounts:
        - name: gcp-ksa
          mountPath: /var/run/secrets/tokens/gcp-ksa
          readOnly: true
      volumes:
      - name: gcp-ksa
        projected:
          defaultMode: 420
          sources:
          - serviceAccountToken:
              path: token
              audience: WORKLOAD_IDENTITY_POOL
              expirationSeconds: 172800
          - configMap:
              name: my-cloudsdk-config
              optional: false
              items:
              - key: "config"
                path: "google-application-credentials.json"
    

    Cuando implementes esta carga de trabajo, el volumen gcp-ksa del pod contendrá los siguientes datos:

    El contenedor del pod monta el volumen gcp-ksa en la ruta /var/run/secrets/tokens/gcp-ksa y configura ADC para que busque el archivo JSON de configuración de credenciales en esa ruta.

  7. Despliega la carga de trabajo:

    kubectl apply -f workload-config.yaml
    

Alternativa: Usar la identidad de una cuenta de servicio de IAM

También puedes configurar cuentas de servicio de Kubernetes en tus clústeres para suplantar cuentas de servicio de gestión de identidades y accesos y realizar cualquier acción autorizada que puedan llevar a cabo las cuentas de servicio de gestión de identidades y accesos. Este enfoque puede aumentar los costes de mantenimiento, ya que tienes que gestionar las asociaciones de cuentas de servicio tanto en IAM como en Kubernetes.

En la mayoría de los casos, te recomendamos que hagas referencia directamente a los principales de Kubernetes en las políticas de permiso de gestión de identidades y accesos para conceder acceso a losGoogle Cloud recursos siguiendo las instrucciones de Usar la federación de identidades de cargas de trabajo de la flota en aplicaciones.

  1. Busca el nombre del grupo de identidades de carga de trabajo y del proveedor de identidades de tu clúster:

    gcloud container fleet memberships describe MEMBERSHIP_ID \
        --project=FLEET_PROJECT_ID \
        --format="table(authority.identityProvider,authority.workloadIdentityPool,name)"
    

    Haz los cambios siguientes:

    • MEMBERSHIP_ID: el nombre de pertenencia del clúster. Suele ser el nombre del clúster.
    • FLEET_PROJECT_ID: el ID del proyecto host de la flota.

    El resultado debería ser similar al siguiente:

    IDENTITY_PROVIDER: IDENTITY_PROVIDER
    WORKLOAD_IDENTITY_POOL: WORKLOAD_IDENTITY_POOL
    NAME: projects/FLEET_PROJECT_ID/locations/MEMBERSHIP_LOCATION/memberships/MEMBERSHIP_ID
    

    Este resultado contiene la siguiente información:

    • IDENTITY_PROVIDER: el proveedor de identidades del clúster.
    • MEMBERSHIP_LOCATION: la ubicación de la membresía. Normalmente, es la misma que la ubicación de tu clúster.
    • WORKLOAD_IDENTITY_POOL: el nombre del grupo de identidades de carga de trabajo asociado a tu flota. Este valor tiene la sintaxis FLEET_PROJECT_ID.svc.id.goog.
  2. Crea una cuenta de servicio de IAM que tu aplicación pueda suplantar. También puedes usar cualquier cuenta de servicio de gestión de identidades y accesos que ya tengas.

    gcloud iam service-accounts create IAM_SA_NAME \
        --project=IAM_SA_PROJECT_ID
    

    Haz los cambios siguientes:

    • IAM_SA_NAME: el nombre de tu cuenta de servicio de gestión de identidades y accesos.
    • IAM_SA_PROJECT_ID: el ID del proyecto que contiene tu cuenta de servicio de gestión de identidades y accesos. Puede ser diferente del proyecto host de tu flota.
  3. Concede a la cuenta de servicio de gestión de identidades y accesos los permisos que necesite para acceder a las APIs de Google Cloud añadiendo las políticas de permiso de gestión de identidades y accesos necesarias. Para ello, puedes usar gcloud iam service-accounts add-iam-policy-binding o otro método. Puedes consultar qué permisos se necesitan para usar las APIs de cada servicio en su documentación y ver una lista completa de los roles predefinidos con los permisos necesarios en el artículo Información sobre los roles. Google Cloud

  4. Crea una ServiceAccount de Kubernetes en un espacio de nombres. También puedes usar una cuenta de servicio de Kubernetes y cualquier espacio de nombres, incluidos la cuenta de servicio y el espacio de nombres default.default

    kubectl create serviceaccount KSA_NAME \
        --namespace=NAMESPACE
    

    Haz los cambios siguientes:

    • KSA_NAME: el nombre de ServiceAccount.
    • NAMESPACE: el nombre del espacio de nombres.
  5. Crea una política de gestión de identidades y accesos que permita que una cuenta de servicio de Kubernetes de un espacio de nombres específico de tu clúster suplante la cuenta de servicio de gestión de identidades y accesos:

    gcloud iam service-accounts add-iam-policy-binding IAM_SA_NAME@IAM_SA_PROJECT_ID.iam.gserviceaccount.com \
        --project=IAM_SA_PROJECT_ID \
        --role=roles/iam.workloadIdentityUser \
        --member="serviceAccount:WORKLOAD_IDENTITY_POOL[NAMESPACE/KSA_NAME]"
    

    Sustituye WORKLOAD_IDENTITY_POOL por el nombre del grupo de identidades de carga de trabajo.

  6. Guarda el siguiente archivo de manifiesto como adc-config-map.yaml. Este ConfigMap contiene la configuración de ADC para las cargas de trabajo.

    kind: ConfigMap
    apiVersion: v1
    metadata:
      namespace: K8S_NAMESPACE
      name: my-cloudsdk-config
    data:
      config: |
        {
          "type": "external_account",
          "audience": "identitynamespace:WORKLOAD_IDENTITY_POOL:IDENTITY_PROVIDER",
          "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/IAM_SA_NAME@GSA_PROJECT_ID.iam.gserviceaccount.com:generateAccessToken",
          "subject_token_type": "urn:ietf:params:oauth:token-type:jwt",
          "token_url": "https://sts.googleapis.com/v1/token",
          "credential_source": {
            "file": "/var/run/secrets/tokens/gcp-ksa/token"
          }
        }
    

    Haz los cambios siguientes:

    • IAM_SA_NAME: el nombre de la cuenta de servicio de gestión de identidades y accesos que se va a suplantar.
    • IAM_SA_PROJECT_ID: el ID del proyecto de la cuenta de servicio de gestión de identidades y accesos.
  7. Guarda el siguiente archivo de manifiesto como workload-config.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
      namespace:  K8S_NAMESPACE
    spec:
      serviceAccountName: KSA_NAME
      containers:
      - name: my-container
        image: my-image
        command: ["sleep","infinity"]
        env:
          - name: GOOGLE_APPLICATION_CREDENTIALS
            value: /var/run/secrets/tokens/gcp-ksa/google-application-credentials.json
        volumeMounts:
        - name: gcp-ksa
          mountPath: /var/run/secrets/tokens/gcp-ksa
          readOnly: true
      volumes:
      - name: gcp-ksa
        projected:
          defaultMode: 420
          sources:
          - serviceAccountToken:
              path: token
              audience: WORKLOAD_IDENTITY_POOL
              expirationSeconds: 172800
          - configMap:
              name: my-cloudsdk-config
              optional: false
              items:
                - key: "config"
                  path: "google-application-credentials.json"
    
    

    Cuando implementes esta carga de trabajo, el volumen gcp-ksa del pod contendrá los siguientes datos:

    El contenedor del pod monta el volumen gcp-ksa en la ruta /var/run/secrets/tokens/gcp-ksa y configura ADC para que busque el archivo JSON de configuración de credenciales en esa ruta.

  8. Despliega la carga de trabajo:

    kubectl apply -f workload-config.yaml
    

Verificar la configuración de la federación de identidades de cargas de trabajo de la flota

En esta sección, crearás un segmento de Cloud Storage y accederás a él desde un pod que use la federación de identidades de cargas de trabajo de la flota. Antes de seguir estos pasos, asegúrate de haber configurado la federación de identidades de cargas de trabajo siguiendo las instrucciones de la sección Usar la federación de identidades de cargas de trabajo de la flota en aplicaciones.

En esta sección no se explica cómo verificar la federación de identidades de carga de trabajo mediante el método de suplantación de identidad de la cuenta de servicio de IAM.

  1. Para encontrar el número de proyecto:

    gcloud projects describe FLEET_PROJECT_ID \
        --format="value(projectNumber)"
    

    El resultado debería ser similar al siguiente:

    1234567890
    
  2. Crea un segmento de Cloud Storage:

    gcloud storage buckets create gs://FLEET_PROJECT_ID-test-bucket \
        --location=LOCATION
    

    Sustituye LOCATION por una Google Cloud ubicación.

  3. Crea una política de gestión de identidades y accesos que conceda acceso al bucket a la cuenta de servicio que has creado:

    gcloud storage buckets add-iam-policy-binding gs://FLEET_PROJECT_ID-test-bucket \
        --condition=None \
        --role=roles/storage.objectViewer \
        --member=principal://iam.googleapis.com/projects/FLEET_PROJECT_NUMBER/locations/global/workloadIdentityPools/FLEET_PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME
    

    Haz los cambios siguientes:

    • FLEET_PROJECT_NUMBER: tu número de proyecto.
    • FLEET_PROJECT_ID: tu ID de proyecto.
    • NAMESPACE: el nombre del espacio de nombres de Kubernetes que ejecuta tu pod de la sección anterior.
    • KSA_NAME: el nombre de la KubernetesServiceAccount que usa tu pod de la sección anterior.
  4. Crea una sesión de shell en tu pod:

    kubectl exec -it pods/my-pod --namespace=NAMESPACE -- /bin/bash
    
  5. Prueba a enumerar los objetos del segmento:

    curl -X GET -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    "https://storage.googleapis.com/storage/v1/b/FLEET_PROJECT_ID-test-bucket/o"
    

    El resultado es el siguiente:

    {
      "kind": "storage#objects"
    }
    

Autenticar desde tu código

Cuando usas bibliotecas de cliente de Cloud, las bibliotecas de autenticación usan automáticamente ADC para buscar credenciales con las que autenticarse en los servicios de Google Cloud . Debes usar bibliotecas de cliente de Cloud que admitan la federación de identidades de cargas de trabajo. A continuación, se muestran las versiones mínimas requeridas de las bibliotecas de cliente de Cloud, así como instrucciones para comprobar la versión que tienes:

C++

La mayoría de las Google Cloud bibliotecas de cliente de C++ admiten la federación de identidades mediante un objeto ChannelCredentials, que se crea llamando a grpc::GoogleDefaultCredentials(). Para inicializar esta credencial, debes compilar las bibliotecas de cliente con la versión 1.36.0 o posterior de gRPC.

La biblioteca de cliente de Cloud Storage para C++ usa la API REST, no gRPC, por lo que no admite la federación de identidades.

Go

Las bibliotecas de cliente de Go admiten la federación de identidades si usan la versión v0.0.0-20210218202405-ba52d332ba99 o una posterior del módulo golang.org/x/oauth2.

Para comprobar qué versión de este módulo usa tu biblioteca de cliente, ejecuta los siguientes comandos:

cd $GOPATH/src/cloud.google.com/go
go list -m golang.org/x/oauth2

Java

Las bibliotecas de cliente de Java admiten la federación de identidades si usan la versión 0.24.0 o una posterior del artefacto com.google.auth:google-auth-library-oauth2-http.

Para comprobar qué versión de este artefacto usa tu biblioteca de cliente, ejecuta el siguiente comando de Maven en el directorio de tu aplicación:

mvn dependency:list -DincludeArtifactIds=google-auth-library-oauth2-http

Node.js

Las bibliotecas de cliente de Node.js admiten la federación de identidades si usan la versión 7.0.2 o posterior del paquete google-auth-library.

Para comprobar qué versión de este paquete usa tu biblioteca de cliente, ejecuta el siguiente comando en el directorio de tu aplicación:

npm list google-auth-library

Cuando creas un objeto GoogleAuth, puedes especificar un ID de proyecto o permitir que GoogleAuth lo encuentre automáticamente. Para encontrar el ID del proyecto automáticamente, la cuenta de servicio del archivo de configuración debe tener el rol de navegador (roles/browser) o un rol con permisos equivalentes en tu proyecto. Para obtener más información, consulta la README del paquete google-auth-library.

Python

Las bibliotecas de cliente de Python admiten la federación de identidades si usan la versión 1.27.0 o posterior del paquete google-auth.

Para comprobar qué versión de este paquete usa tu biblioteca de cliente, ejecuta el siguiente comando en el entorno en el que está instalado el paquete:

pip show google-auth

Para especificar un ID de proyecto para el cliente de autenticación, puedes definir la variable de entorno GOOGLE_CLOUD_PROJECT o permitir que el cliente encuentre el ID de proyecto automáticamente. Para encontrar el ID de proyecto automáticamente, la cuenta de servicio del archivo de configuración debe tener el rol de navegador (roles/browser) o un rol con permisos equivalentes en tu proyecto. Para obtener más información, consulta la guía de usuario del paquete google-auth.

Siguientes pasos

Consulta las prácticas recomendadas para organizar tus flotas al usar la federación de identidades de cargas de trabajo de la flota.