Brains4Cloud
ESEN
Practicar

Tema 3 de 3

D4 · Configurar el acceso y la seguridad

Suplantación, credenciales de corta duración y Workload Identity

El apartado 4.2 termina con las formas seguras de autenticarse como una cuenta de servicio: suplantarla, usar credenciales de corta duración y federar identidades externas sin claves.

Un principal autenticado (un usuario u otra cuenta de servicio) obtiene un token de la cuenta de servicio y lo usa para actuar como ella, con todos sus permisos. Siempre hay dos identidades: quien suplanta y la cuenta suplantada. Se parece a AssumeRole de AWS.

  • Permiso necesario: iam.serviceAccounts.getAccessToken, incluido en Service Account Token Creator (roles/iam.serviceAccountTokenCreator).
  • Usos: acceso elevado temporal sin cambiar políticas, probar si un conjunto de permisos basta, desarrollar en local aplicaciones que solo funcionan como cuenta de servicio y autenticar aplicaciones externas.
  • En la consola siempre te autenticas con tus credenciales de usuario: no se puede suplantar una cuenta de servicio.
  • Usar una cuenta asociada a un recurso o una clave no es suplantación: solo interviene la identidad de la cuenta.
gcloud iam service-accounts add-iam-policy-binding \
  deployer@my-project.iam.gserviceaccount.com \
  --member=user:ana@example.com --role=roles/iam.serviceAccountTokenCreator

Suplantar con gcloud y ADC

# Un solo comando
gcloud storage buckets list \
  --impersonate-service-account=deployer@my-project.iam.gserviceaccount.com

# Todos los comandos de gcloud
gcloud config set auth/impersonate_service_account \
  deployer@my-project.iam.gserviceaccount.com

# Bibliotecas cliente en tu equipo (archivo de ADC)
gcloud auth application-default login \
  --impersonate-service-account deployer@my-project.iam.gserviceaccount.com

En los tres casos gcloud pide credenciales de corta duración para la cuenta de servicio y ejecuta las llamadas con ellas.

Credenciales de corta duración

Según Google, son la forma más segura de autenticarse como una cuenta de servicio: un token de acceso OAuth 2.0 que caduca a la 1 hora por defecto y no se renueva solo. Suponen menos riesgo que las claves.

  • Muchas veces se obtienen automáticamente: con --impersonate-service-account, con una cuenta asociada a una VM (las bibliotecas cliente usan ADC) o con Workload Identity Federation.
  • La Service Account Credentials API las crea manualmente: tokens de acceso OAuth 2.0, tokens de ID de OpenID Connect, JWT autofirmados y blobs autofirmados.
  • La vida máxima de un token de acceso se puede ampliar a 12 horas añadiendo la cuenta a la restricción iam.allowServiceAccountCredentialLifetimeExtension. Los tokens de ID duran 1 hora.
  • No se permite la autosuplantación: usar un token de corta duración de una cuenta para generar otro de la misma cuenta (salvo con JWT autofirmados), para que un token robado no se pueda renovar indefinidamente.
  • Credential Access Boundaries reducen los permisos de un token de corta duración, pero solo para Cloud Storage.

Suplantación y registros de auditoría

Con suplantación

La mayoría de los logs de auditoría registran las dos identidades: la cuenta suplantada y quien creó las credenciales. Excepciones: App Engine y GKE no registran quién creó las credenciales.

Con claves o cuentas asociadas

Solo aparece la cuenta de servicio, no la persona que usó la clave o ejecutó código en la VM. Eso crea riesgos de escalada de privilegios y de no repudio.

Application Default Credentials

ADC es la estrategia que usan las bibliotecas para encontrar credenciales automáticamente según el entorno, de modo que el mismo código funciona en desarrollo y en producción. Orden de búsqueda:

  1. La variable de entorno GOOGLE_APPLICATION_CREDENTIALS (archivo de configuración de Workload o Workforce Identity Federation, o una clave, que no se recomienda).
  2. El archivo creado con gcloud auth application-default login.
  3. La cuenta de servicio asociada, que devuelve el servidor de metadatos.

El orden no indica cuál es mejor; solo dónde busca primero.

Da a cargas de trabajo on-premises o de otras nubes acceso a Google Cloud con identidades federadas, sin claves de cuentas de servicio. Funciona con AWS, Azure, Active Directory on-premises, GitHub, GitLab, certificados X.509 y cualquier IdP compatible con OIDC o SAML 2.0.

ConceptoQué es
Workload identity poolAgrupa identidades externas. Google recomienda un pool por entorno (desarrollo, preproducción, producción)
ProveedorRelación de confianza con el IdP (AWS, Entra ID, GitHub, Okta…)
Asignación de atributosExpresiones CEL que pasan los claims del IdP a google.subject (obligatorio), google.groups y hasta 50 attribute.*
Condición de atributosExpresión CEL que acepta o rechaza credenciales; limita qué identidades pueden autenticarse
  • El IdP entrega una credencial al Security Token Service, que la verifica y devuelve un token federado (intercambio de tokens OAuth 2.0).
  • Google recomienda el acceso directo: conceder roles a principal://… o principalSet://… sobre los recursos. La alternativa es suplantar una cuenta de servicio, que necesita roles/iam.workloadIdentityUser.
  • Conceder acceso a todas las identidades del pool es arriesgado: limita con atributos y condiciones.
  • La aplicación externa usa un archivo de configuración de credenciales, no una clave.

Workload Identity Federation for GKE

Es la forma recomendada de que los pods accedan a APIs de Google Cloud: cada aplicación tiene su identidad y se le conceden roles con IAM, sin archivos de claves. Google gestiona el pool y el proveedor.

  • Al activarlo, GKE crea el pool fijo PROJECT_ID.svc.id.goog, registra el clúster como proveedor y despliega el servidor de metadatos de GKE en cada nodo.
  • Activarlo no concede ningún permiso: hay que dar roles al ServiceAccount de Kubernetes.
  • En Autopilot todos los nodos lo usan siempre. En Standard se activa en el clúster y en cada grupo de nodos.
gcloud container clusters update my-cluster --location=europe-west1 \
  --workload-pool=my-project.svc.id.goog
gcloud container node-pools update default-pool --cluster=my-cluster \
  --location=europe-west1 --workload-metadata=GKE_METADATA

# Dar acceso al ServiceAccount de Kubernetes "reader" del namespace "app"
gcloud storage buckets add-iam-policy-binding gs://app-data --role=roles/storage.objectViewer \
  --member=principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/my-project.svc.id.goog/subject/ns/app/sa/reader

Workforce Identity Federation

Federa usuarios (empleados, socios, contratistas) desde un IdP externo compatible con OIDC o SAML 2.0 (Entra ID, AD FS, Okta…) para que entren en Google Cloud con SSO. No guarda cuentas en Google Cloud, así que no hace falta sincronizar con Google Cloud Directory Sync. Los workforce identity pools se configuran a nivel de organización y el acceso se concede con allow policies.

Workload Identity Federation

Federa cargas de trabajo: aplicaciones, pipelines, pods.

Workforce Identity Federation

Federa personas con SSO desde su IdP.

Escenarios de examen

SituaciónRespuestaPor qué
Probar si una cuenta de servicio tiene permisos suficientes antes de desplegarSuplantarla con --impersonate-service-accountSin claves; credenciales de corta duración.
Dar a un usuario acceso elevado temporal sin cambiar las políticas de los recursosToken Creator sobre una cuenta de servicio con esos permisosSuplantación para elevar temporalmente.
Que gcloud use siempre una cuenta de servicio en tu equipogcloud config set auth/impersonate_service_accountPropiedad de configuración.
Desarrollar en local una aplicación que solo funciona como cuenta de serviciogcloud auth application-default login --impersonate-service-accountLas bibliotecas cliente suplantan la cuenta.
Un pipeline de GitHub Actions debe desplegar en Google CloudWorkload Identity Federation con un proveedor OIDC de GitHubSin claves de cuentas de servicio.
Una aplicación en AWS debe leer de BigQueryWorkload Identity Federation con proveedor AWSIntercambio de tokens con el Security Token Service.
Un pod de GKE debe escribir en un bucketWorkload Identity Federation for GKE y un rol para el ServiceAccount de KubernetesActivado siempre en Autopilot.
Los empleados deben entrar con Okta sin sincronizar cuentas a GoogleWorkforce Identity FederationSSO sin GCDS.

Trampas frecuentes del examen

❓ ¿Qué rol necesitas para suplantar una cuenta de servicio?

Service Account Token Creator (iam.serviceAccounts.getAccessToken). Service Account User sirve para asociarla a recursos.

❓ ¿Se puede suplantar una cuenta de servicio desde la consola?

No. En la consola siempre usas tus credenciales de usuario; la suplantación se hace con gcloud, ADC o la API.

❓ ¿Cuánto dura por defecto un token de acceso de corta duración?

1 hora. Se puede ampliar a 12 horas con la restricción iam.allowServiceAccountCredentialLifetimeExtension.

❓ Una aplicación en Azure necesita acceder a Google Cloud. ¿Creas una clave?

No. Workload Identity Federation evita las claves; es la opción recomendada.

❓ ¿Activar Workload Identity Federation for GKE da permisos a los pods?

No. Hay que conceder roles al principal del ServiceAccount de Kubernetes.

❓ ¿Workforce o Workload Identity Federation para que los empleados entren con su IdP?

Workforce: federa personas. Workload federa aplicaciones.

¿Entendiste este tema?

Pon a prueba lo que acabas de aprender

Un pipeline de GitHub Actions despliega en Cloud Run usando una clave JSON de una cuenta de servicio guardada como secreto del repositorio. El equipo de seguridad quiere eliminar esa clave. ¿Qué haces?

¿Listo para poner a prueba "Suplantación, credenciales de corta duración y Workload Identity"?

Preguntas originales, cada una con su explicación.

Empezar un simulacro

Inicia sesión para guardar tu progreso.

Terminaste el último tema de este deep dive.

Volver al índice →
Anterior: Cuentas de servicio