En esta página, se muestra cómo configurar tus aplicaciones para que se autentiquen en las APIs deGoogle Cloud , como la API de Compute Engine o la API de AI Platform, desde flotas que tienen un modelo de confianza compartido en toda la flota. Si tu flota tiene un modelo de confianza mixto en toda la flota, consulta Cómo autenticar en las APIs de Google Cloud desde cargas de trabajo de flotas con confianza mixta (versión preliminar).
Esta página está dirigida a los administradores y operadores de plataformas, y a los ingenieros de seguridad que desean autenticarse de forma programática desde cargas de trabajo de flotas en las APIs de Google Cloud. Para obtener más información sobre los roles de usuario y las tareas de ejemplo a los que hacemos referencia en la documentación de Google Cloud, consulta Roles de usuario y tareas comunes de GKE.
Antes de leer este documento, asegúrate de estar familiarizado con los siguientes conceptos:
- Acerca de la federación de Workload Identity de la flota
- ConfigMaps de Kubernetes
- Políticas de permisos de Identity and Access Management (IAM)
Acerca de la federación de identidades para cargas de trabajo de la flota para entornos de confianza compartida
La federación de identidades para cargas de trabajo de la flota te permite autenticarte desde cargas de trabajo de la flota en las APIs deGoogle Cloud con mecanismos de autenticación integrados Google Cloud y de Kubernetes. La federación de identidades para cargas de trabajo de la flota elimina la necesidad de usar métodos menos seguros, como la vinculación de tokens de acceso en Pods o el almacenamiento de credenciales de larga duración.
De forma predeterminada, tu proyecto host de la flota usa un grupo de identidades de cargas de trabajo administrado por Google para aprovisionar identidades para las 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 IAM es la misma. Esta identidad implícita similar es útil cuando se otorga acceso a gran escala en entornos de confianza compartida, como las flotas de un solo arrendatario, en los que no importa si otras entidades obtienen de forma involuntaria permisos similares en los recursos.
Antes de comenzar
Asegúrate de tener 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 están instaladas.
- La versión más reciente de Google Cloud CLI, que incluye
Asegúrate de haber inicializado la CLI de gcloud para usarla en tu proyecto.
Prepara tus clústeres
Antes de 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 estar configurados de forma correcta para usar la federación de identidades para cargas de trabajo de flota. En las siguientes secciones, se describe cómo configurar la federación de identidades para cargas de trabajo de la flota para diferentes tipos de clústeres.
GKE
En el caso de los clústeres de GKE, haz lo siguiente:
- Habilita Workload Identity Federation for GKE en tu clúster de Google Kubernetes Engine, si aún no está habilitada.
- Registra el clúster en la flota.
También puedes habilitar la Workload Identity Federation for GKE durante el proceso de creación del clúster y el registro de la flota.
Clústeres fuera de Google Cloud
Los siguientes tipos de clústeres habilitan automáticamente la federación de identidades para cargas de trabajo 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 equipos físicos
- GKE en AWS
- GKE en Azure
Clústeres adjuntos
Los clústeres adjuntos de EKS y AKS registrados con la API de GKE Multi-cloud se registran con la federación de identidades para cargas de trabajo de la flota habilitada de forma predeterminada. Otros clústeres vinculados se pueden registrar con la federación de identidades para cargas de trabajo de la flota habilitada si cumplen con los requisitos necesarios. Sigue las instrucciones para el tipo de clúster en Registra un clúster.
Usa la federación de identidades para cargas de trabajo de la flota en aplicaciones
En los siguientes pasos, se muestra cómo configurar una carga de trabajo en un clúster registrado para usar la federación de identidades para cargas de trabajo de la flota:
Busca el nombre del grupo de identidades para cargas de trabajo de tu clúster y el proveedor de identidades:
gcloud container fleet memberships describe MEMBERSHIP_ID \ --project=FLEET_PROJECT_ID \ --format="table(authority.identityProvider,authority.workloadIdentityPool,name)"
Reemplaza lo siguiente:
MEMBERSHIP_ID
: Es el nombre de la membresía del clúster. Por lo general, es el nombre de tu clúster.FLEET_PROJECT_ID
: El ID del proyecto host de la flota.
El resultado es similar a este:
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
: Es el proveedor de identidad del clúster.MEMBERSHIP_LOCATION
: Es la ubicación de la membresía de la flota. Por lo general, es el mismo que la ubicación de tu clúster.WORKLOAD_IDENTITY_POOL
: Es el nombre del grupo de identidades para cargas de trabajo asociado con tu flota. Este valor tiene la sintaxisFLEET_PROJECT_ID.svc.id.goog
.
Crea un espacio de nombres de Kubernetes. También puedes usar cualquier espacio de nombres existente, incluido el espacio de nombres
default
.kubectl create namespace NAMESPACE
Reemplaza
NAMESPACE
por el nombre del espacio de nombres.Crea una ServiceAccount de Kubernetes en el espacio de nombres. También puedes usar cualquier ServiceAccount existente, incluida la ServiceAccount
default
en el espacio de nombres.kubectl create serviceaccount KSA_NAME \ --namespace=NAMESPACE
Reemplaza
KSA_NAME
por el nombre de la ServiceAccountGuarda el siguiente 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" } }
Implementa el ConfigMap:
kubectl create -f adc-config-map.yaml
Guarda el siguiente 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 implementas esta carga de trabajo, el volumen
gcp-ksa
en el pod contiene los siguientes datos:- Los datos del ConfigMap que implementaste como un archivo llamado
google-application-credentials.json
Este archivo es un archivo de configuración de credenciales de ADC. - El token de la cuenta de servicio de Kubernetes como
token
Kubernetes activa un JWT firmado para la cuenta de servicio como un archivo de token de cuenta de servicio proyectado.
El contenedor del Pod activa 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.- Los datos del ConfigMap que implementaste como un archivo llamado
Implementa la carga de trabajo:
kubectl apply -f workload-config.yaml
Alternativa: Usa la identidad de una cuenta de servicio de IAM
Como alternativa, puedes configurar cuentas de servicio de Kubernetes en tus clústeres para que imiten cuentas de servicio de IAM y realicen cualquier acción autorizada que puedan realizar estas cuentas. Este enfoque podría aumentar la sobrecarga de mantenimiento, ya que debes administrar las vinculaciones de cuentas de servicio en IAM y Kubernetes.
En la mayoría de los casos, te recomendamos que hagas referencia directamente a los principales de Kubernetes en las políticas de IAM para permitir que se otorgue acceso a los recursos deGoogle Cloud . Para ello, sigue las instrucciones que se indican en Usa la federación de identidades para cargas de trabajo de flotas en aplicaciones.
Busca el nombre del grupo de identidades para cargas de trabajo de tu clúster y el proveedor de identidades:
gcloud container fleet memberships describe MEMBERSHIP_ID \ --project=FLEET_PROJECT_ID \ --format="table(authority.identityProvider,authority.workloadIdentityPool,name)"
Reemplaza lo siguiente:
MEMBERSHIP_ID
: Es el nombre de la membresía del clúster. Por lo general, es el nombre de tu clúster.FLEET_PROJECT_ID
: El ID del proyecto host de la flota.
El resultado es similar a este:
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
: Es el proveedor de identidad del clúster.MEMBERSHIP_LOCATION
: Es la ubicación de la membresía. Por lo general, es el mismo que la ubicación de tu clúster.WORKLOAD_IDENTITY_POOL
: Es el nombre del grupo de identidades para cargas de trabajo asociado con tu flota. Este valor tiene la sintaxisFLEET_PROJECT_ID.svc.id.goog
.
Crea una cuenta de servicio de IAM que tu aplicación pueda usurpar. También puedes usar cualquier cuenta de servicio de IAM existente.
gcloud iam service-accounts create IAM_SA_NAME \ --project=IAM_SA_PROJECT_ID
Reemplaza lo siguiente:
IAM_SA_NAME
: Es el nombre de tu cuenta de servicio de IAM.IAM_SA_PROJECT_ID
: El ID del proyecto que contiene tu cuenta de servicio de IAM. Puede ser diferente del proyecto host de tu flota.
Agrega las políticas de IAM necesarias para otorgar a la cuenta de servicio de IAM los permisos que necesita para acceder a las APIs de Google Cloud . Para ello, usa
gcloud iam service-accounts add-iam-policy-binding
u otro método. Puedes averiguar qué permisos son necesarios para usar las APIs de Google Cloud en la documentación de cada servicio y ver una lista completa de los roles predefinidos con los permisos necesarios enComprende los roles.Crea una ServiceAccount de Kubernetes en el espacio de nombres: También puedes usar una cuenta de servicio de Kubernetes existente y cualquier espacio de nombres, incluidos la cuenta de servicio
default
y el espacio de nombresdefault
.kubectl create serviceaccount KSA_NAME \ --namespace=NAMESPACE
Reemplaza lo siguiente:
KSA_NAME
: el nombre de la ServiceAccountNAMESPACE
: Es el nombre del espacio de nombres.
Crea una política de permisos de IAM que permita que una cuenta de servicio de Kubernetes en un espacio de nombres específico de tu clúster robe la identidad de la cuenta de servicio de IAM:
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]"
Reemplaza
WORKLOAD_IDENTITY_POOL
por el nombre del grupo de identidades para cargas de trabajo.Guarda el siguiente 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" } }
Reemplaza lo siguiente:
IAM_SA_NAME
: Es el nombre de la cuenta de servicio de IAM que se suplantará.IAM_SA_PROJECT_ID
: Es el ID del proyecto de la cuenta de servicio de IAM.
Guarda el siguiente 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 implementas esta carga de trabajo, el volumen
gcp-ksa
en el pod contiene los siguientes datos:- Los datos del ConfigMap que implementaste como un archivo llamado
google-application-credentials.json
Este archivo es un archivo de configuración de credenciales de ADC. - El token de la cuenta de servicio de Kubernetes como
token
Kubernetes activa un JWT firmado para la cuenta de servicio como un archivo de token de cuenta de servicio proyectado.
El contenedor del Pod activa 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.- Los datos del ConfigMap que implementaste como un archivo llamado
Implementa la carga de trabajo:
kubectl apply -f workload-config.yaml
Verifica la configuración de la federación de identidades para cargas de trabajo de la flota
En esta sección, crearás un bucket de Cloud Storage y accederás a él desde un Pod que usa la federación de identidades para cargas de trabajo de la flota. Antes de realizar estos pasos, asegúrate de haber configurado la federación de identidades para cargas de trabajo. Para ello, sigue las instrucciones de la sección Usa la federación de identidades para cargas de trabajo de la flota en las aplicaciones.
En esta sección, no se muestra cómo verificar la federación de identidades para cargas de trabajo con el método de identidad temporal como cuenta de servicio de IAM.
Busca el número de proyecto numérico:
gcloud projects describe FLEET_PROJECT_ID \ --format="value(projectNumber)"
El resultado es similar a este:
1234567890
Crea un bucket de Cloud Storage:
gcloud storage buckets create gs://FLEET_PROJECT_ID-test-bucket \ --location=LOCATION
Reemplaza
LOCATION
por una ubicación de Google Cloud.Crea una política de permisos de IAM que otorgue acceso al bucket a la cuenta de servicio que creaste:
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
Reemplaza lo siguiente:
FLEET_PROJECT_NUMBER
: el número de proyecto numérico.FLEET_PROJECT_ID
: el ID de tu proyectoNAMESPACE
: El nombre del espacio de nombres de Kubernetes que ejecuta tu Pod de la sección anterior.KSA_NAME
: Es el nombre de la ServiceAccount de Kubernetes que usa tu Pod de la sección anterior.
Crea una sesión de shell en el Pod:
kubectl exec -it pods/my-pod --namespace=NAMESPACE -- /bin/bash
Intenta enumerar los objetos del bucket:
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"
Esta es la salida:
{ "kind": "storage#objects" }
Realiza la autenticación desde el código
Cuando usas las bibliotecas cliente de Cloud, las bibliotecas de autenticación usan automáticamente ADC para buscar credenciales que permitan autenticarse en los servicios de Google Cloud . Debes usar las bibliotecas cliente de Cloud que admiten la federación de identidades para cargas de trabajo. A continuación, se muestran las versiones mínimas de bibliotecas cliente de Cloud requeridas, además de las instrucciones para verificar tu versión actual:
C++
La mayoría de las bibliotecas cliente deGoogle Cloud para C++ admiten la federación de identidades a través de un objeto ChannelCredentials
, que se crea a través de una llamada a grpc::GoogleDefaultCredentials()
. Para inicializar esta credencial, debes compilar las bibliotecas cliente con la versión 1.36.0 o posterior de gRPC.
La biblioteca cliente de Cloud Storage para C++ usa la API de REST, no gRPC, por lo que no admite la federación de identidades.
Go
Las bibliotecas cliente para Go admiten la federación de identidades si usan la versión v0.0.0-20210218202405-ba52d332ba99 o una versión posterior del módulo golang.org/x/oauth2
.
Para verificar qué versión de este módulo usa tu biblioteca cliente, ejecuta los siguientes comandos:
cd $GOPATH/src/cloud.google.com/go
go list -m golang.org/x/oauth2
Java
Las bibliotecas cliente para Java admiten la federación de identidades si usan la versión 0.24.0 o posterior del artefacto com.google.auth:google-auth-library-oauth2-http
.
Para verificar qué versión de este artefacto usa tu biblioteca 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 cliente de Node.js admiten la federación de identidades si usan la versión 7.0.2 o una versión posterior del paquete google-auth-library
.
Para verificar qué versión de este paquete usa tu biblioteca 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 del proyecto o puedes
permitir que GoogleAuth
encuentre el ID del proyecto automáticamente. Para encontrar el ID del proyecto
de manera automática, la cuenta de servicio en el 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 el
README
del paquete google-auth-library
.
Python
Las bibliotecas cliente para Python admiten la federación de identidades si usan la versión 1.27.0 o posterior del paquete google-auth
.
Para verificar qué versión de este paquete usa tu biblioteca cliente, ejecuta el siguiente comando en el entorno en el que está instalado el paquete:
pip show google-auth
Si deseas especificar un ID del proyecto para el cliente de autenticación, puedes configurar
la variable de entorno GOOGLE_CLOUD_PROJECT
o permitir que el cliente busque
el ID del proyecto automáticamente. Para encontrar el ID del proyecto de manera automática, la cuenta de
servicio en el 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 del usuario del paquete google-auth
.
Próximos pasos
Obtén información sobre las prácticas recomendadas para organizar tus flotas cuando uses la federación de identidades para cargas de trabajo de la flota.