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:
- Información sobre la federación de identidades de cargas de trabajo de flotas
- ConfigMaps de Kubernetes
- Políticas de gestión de identidades y accesos (IAM)
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.
- La versión más reciente de Google Cloud CLI, que incluye
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:
- Habilita la federación de Workload Identity para GKE en tu clúster de Google Kubernetes Engine, si aún no lo has hecho.
- 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:
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 sintaxisFLEET_PROJECT_ID.svc.id.goog
.
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.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.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" } }
Despliega el ConfigMap:
kubectl create -f adc-config-map.yaml
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:- Los datos del ConfigMap que has implementado como un archivo llamado
google-application-credentials.json
. Este archivo es un archivo de configuración de credenciales de ADC. - Token de ServiceAccount de Kubernetes como
token
. Kubernetes monta un JWT firmado para la cuenta de servicio como un archivo de token de cuenta de servicio proyectado.
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.- Los datos del ConfigMap que has implementado como un archivo llamado
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.
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 sintaxisFLEET_PROJECT_ID.svc.id.goog
.
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.
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 CloudCrea 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.
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.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.
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:- Los datos del ConfigMap que has implementado como un archivo llamado
google-application-credentials.json
. Este archivo es un archivo de configuración de credenciales de ADC. - Token de ServiceAccount de Kubernetes como
token
. Kubernetes monta un JWT firmado para la cuenta de servicio como un archivo de token de cuenta de servicio proyectado.
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.- Los datos del ConfigMap que has implementado como un archivo llamado
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.
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
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.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.
Crea una sesión de shell en tu pod:
kubectl exec -it pods/my-pod --namespace=NAMESPACE -- /bin/bash
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.