Configura la federación de Workload Identity con AWS o Azure

En esta guía, se describe cómo usar la federación de Workload Identity para permitir que las cargas de trabajo de AWS y Azure se autentiquen en Google Cloud sin una clave de cuenta de servicio.

Mediante la federación de Workload Identity, las cargas de trabajo que se ejecutan en AWS EC2 y Azure pueden intercambiar sus credenciales específicas del entorno por tokens del servicio de tokens de seguridad de Google Cloud de corta duración.

Las credenciales específicas del entorno incluyen lo siguiente:

Si configuras la federación de Workload Identity, puedes permitir que estas cargas de trabajo intercambien estas credenciales específicas del entorno por credenciales de corta duración de Google Cloud. Las cargas de trabajo pueden usar estas credenciales de corta duración para acceder a las API de Google Cloud.

Antes de comenzar

  • Configura la autenticación.

    Selecciona la pestaña sobre cómo planeas usar las muestras en esta página:

    Consola

    Cuando usas la consola de Google Cloud para acceder a los servicios y las APIs de Google Cloud, no necesitas configurar la autenticación.

    gcloud

    Puedes usar las muestras de gcloud CLI en esta página desde cualquiera de los siguientes entornos de desarrollo:

    • Cloud Shell: Para usar una terminal en línea con la CLI de gcloud ya configurada, activa Cloud Shell.

      En la parte inferior de esta página, se inicia una sesión de Cloud Shell y se muestra una ventana de línea de comandos. La sesión puede tardar unos segundos en inicializarse.

    • Shell local: Para usar la CLI de gcloud en un entorno de desarrollo local, instala e inicializa la CLI de gcloud.

    Python

    Para usar las muestras de Python de esta página desde un entorno de desarrollo local, instala e inicializa la CLI de gcloud y, luego, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.

    1. Instala Google Cloud CLI.
    2. Para inicializar la CLI de gcloud, ejecuta el siguiente comando:

      gcloud init
    3. Crea credenciales de autenticación locales para tu Cuenta de Google:

      gcloud auth application-default login

    Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local en la documentación de autenticación de Google Cloud.

Prepara tu proveedor de identidad externo

Solo debes realizar estos pasos una vez para cada usuario de Azure AD o cuenta de AWS.

AWS

No es necesario que realices ningún cambio de configuración en la cuenta de AWS.

Después de configurar un grupo de Workload Identity para que confíe en tu cuenta de AWS, puedes dejar que los usuarios de AWS y los roles de AWS usen credenciales de seguridad de AWS permanentes o temporales para obtener credenciales de Google Cloud de corta duración.

Azure

Debes crear una aplicación de Azure AD nueva en tu usuario de Azure AD y configurarla para que pueda usarse en la federación de Workload Identity.

Después de configurar un grupo de Workload Identity para que confíe en la aplicación, los usuarios y los principales de servicio de Azure pueden solicitar tokens de acceso para esta aplicación y, luego, intercambiarlos con las credenciales de Google Cloud de corta duración.

Para crear la aplicación, haz lo siguiente:

  1. Crea una aplicación y un principal del servicio de Azure AD.

  2. Configura un URI de ID de aplicación para la aplicación. Puedes usar el URI del ID de aplicación predeterminado (api://APPID) o especificar un URI personalizado.

    Necesitarás el URI de ID de aplicación más adelante cuando configures el proveedor de grupo de Workload Identity.

A fin de permitir que una aplicación obtenga tokens de acceso para la aplicación de Azure AD, puedes usar las identidades administradas:

  1. Crea una identidad administrada. Toma nota del ID de objeto de la identidad administrada. La necesitarás más adelante cuando configures el robo de identidad.

  2. Asigna la identidad administrada a una máquina virtual o a otro recurso que ejecute tu aplicación.

Configura la federación de Workload Identity

Solo debes realizar estos pasos una vez por cuenta de AWS o usuario de Azure AD. Luego, puedes usar el mismo grupo y proveedor de Workload Identity para varias cargas de trabajo y en varios proyectos de Google Cloud.

Para comenzar a configurar la federación de Workload Identity, haz lo siguiente:

  1. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  2. Es mejor usar un proyecto exclusivo para administrar los grupos y los proveedores de identidades para cargas de trabajo.
  3. Comprueba que la facturación esté habilitada en tu proyecto.

    Descubre cómo puedes habilitar la facturación

  4. Habilita las API de IAM, Resource Manager, Service Account Credentials, and Security Token Service.

    Habilita las API

Define una condición y la asignación de atributos

Las credenciales específicas del entorno de la carga de trabajo de AWS o Azure contienen varios atributos, y debes decidir qué atributo deseas usar como identificador de asunto (google.subject) en Google Cloud.

Google Cloud usa el identificador de asunto en los registros de auditoría de Cloud y en los identificadores principales para identificar de forma única a un usuario o rol de AWS o Azure.

De manera opcional, puedes mapear atributos adicionales. Luego, puedes hacer referencia a estos atributos adicionales cuando otorgues acceso a los recursos.

AWS

Las asignaciones de atributos pueden usar los campos de respuesta para GetCallerIdentity como atributos de origen. Estos campos incluyen lo siguiente:

  • account: el número de cuenta de AWS.
  • arn: el ARN de AWS de la entidad externa.
  • userid: el identificador único de la entidad que realiza la llamada.

Si tu aplicación se ejecuta en una instancia de Amazon Elastic Compute Cloud (EC2) con una función adjunta, puedes usar la siguiente asignación de atributos:

google.subject=assertion.arn
attribute.account=assertion.account
attribute.aws_role=assertion.arn.extract('assumed-role/{role}/')
attribute.aws_ec2_instance=assertion.arn.extract('assumed-role/{role_and_session}').extract('/{session}')

La asignación realiza lo siguiente:

  • Usa el ARN como identificador de asunto (ejemplo: "arn:aws:sts::000000000000:assumed-role/ec2-my-role/i-00000000000000000).
  • Ingresa un atributo personalizado account y asígnale el ID de la cuenta de AWS.
  • Ingresa un atributo personalizado aws_role y asígnale el nombre de rol de AWS (ejemplo: ec2-my-role).
  • Ingresa un atributo personalizado aws_ec2_instance y asígnale el ID de instancia de EC2 (ejemplo: i-00000000000000000).

Mediante esta asignación, puedes otorgar acceso a lo siguiente:

  • Una instancia EC2 específica:

    principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.aws_ec2_instance/EC2_INSTANCE_ID
    

  • Todos los usuarios y las instancias de un rol:

    principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.aws_role/ROLE_NAME
    

Azure

Las asignaciones de atributos pueden usar las reclamaciones incorporadas en los tokens de acceso de Azure, incluidas las reclamaciones personalizadas, como atributos de origen. En la mayoría de los casos, es mejor usar la reclamación sub como identificador de asunto:

google.subject=assertion.sub

Para un token de acceso emitido a una identidad administrada, la reclamación sub contiene el ID de objeto de la identidad administrada. Si usas otra reclamación, asegúrate de que sea única y no se pueda reasignar.

Si no estás seguro de la lista de reclamaciones a las que puedes hacer referencia, haz lo siguiente:

  1. Conéctate a una VM de Azure que tenga una identidad administrada asignada.

  2. Obtén un token de acceso de Azure Instance Metadata Service (IMDS):

    Bash

    curl \
      "http://169.254.169.254/metadata/identity/oauth2/token?resource=APP_ID_URI&api-version=2018-02-01" \
      -H "Metadata: true" | jq -r .access_token
    

    Este comando usa la herramienta de jq. jq está disponible de forma predeterminada en Cloud Shell.

    PowerShell

    $SubjectTokenType = "urn:ietf:params:oauth:token-type:jwt"
    $SubjectToken = (Invoke-RestMethod `
      -Uri "http://169.254.169.254/metadata/identity/oauth2/token?resource=APP_ID_URI&api-version=2018-02-01" `
      -Headers @{Metadata="true"}).access_token
    Write-Host $SubjectToken
    

    Reemplaza APP_ID_URI por el URI de ID de aplicación de la aplicación que configuraste para la federación de Workload Identity.

  3. En un navegador web, ve a https://jwt.ms/ y pega el token de acceso en el cuadro de texto.

  4. Haz clic en Reclamaciones para ver la lista de reclamaciones incorporadas en el token de acceso.

En el caso de las identidades de servicio, por lo general, no es necesario crear una asignación para google.groups o ningún atributo personalizado.

De manera opcional, puedes definir una condición de atributo. Las condiciones de los atributos son expresiones CEL que pueden verificar los atributos de aserción y los atributos de destino. Si la condición del atributo se evalúa como true para una credencial determinada, se acepta la credencial. De lo contrario, se rechaza la credencial.

AWS

Puedes usar una condición de atributo a fin de restringir qué usuarios y roles de IAM pueden usar la federación de Workload Identity para obtener tokens de Google Cloud de corta duración.

Por ejemplo, la siguiente condición restringe el acceso a los roles de AWS y no permite otros identificadores de IAM:

assertion.arn.startsWith('arn:aws:sts::AWS_ACCOUNT_ID:assumed-role/')

Azure

Puedes usar una condición de atributo a fin de restringir qué usuarios y principales de servicio pueden usar la federación de Workload Identity para obtener tokens de Google Cloud de corta duración. Como alternativa, puedes configurar tu aplicación de Azure AD para que use asignaciones de roles de la aplicación.

Crea el proveedor y el grupo de Workload Identity

Roles obligatorios

Para obtener los permisos que necesitas para configurar la federación de identidades para cargas de trabajo, pídele a tu administrador que te otorgue los siguientes roles de IAM en el proyecto:

Si quieres obtener más información para otorgar roles, consulta Administra el acceso.

También puedes obtener los permisos necesarios a través de roles personalizados o cualquier otro rol predefinido.

De manera alternativa, el rol básico de propietario de IAM (roles/owner) también incluye permisos para configurar la federación de identidades. No deberías otorgar funciones básicas en un entorno de producción, pero puedes otorgarlas en un entorno de desarrollo o de prueba.

Ya recopilaste toda la información que necesitas para crear un grupo y proveedor de Workload Identity:

Consola

  1. En la consola de Google Cloud, ve a la página Proveedor y grupo de cargas de trabajo nuevos.

    Ir a Nuevo proveedor y grupo de cargas de trabajo

  2. En la sección Crear un grupo de identidades, ingresa lo siguiente:

    • Nombre: Es el nombre del grupo. El nombre también se usa como el ID del grupo. No puedes cambiar el ID del grupo más adelante.
    • Descripción: Es el texto que describe el propósito del grupo.
  3. Haz clic en Continuar.

  4. Establece la configuración del proveedor:

    AWS

    Establece la siguiente configuración del proveedor:

    • Selecciona un proveedor: AWS.
    • Nombre del proveedor: nombre para el proveedor. El nombre también se usa como el ID del proveedor. No puedes cambiar el ID del proveedor más adelante.

    Azure

    Establece la siguiente configuración del proveedor:

    • Selecciona un proveedor: OpenID Connect (OIDC).
    • Nombre del proveedor: nombre para el proveedor. El nombre también se usa como el ID del proveedor. No puedes cambiar el ID del proveedor más adelante.
    • URL del emisor: https://sts.windows.net/TENANT_ID. Reemplaza TENANT_ID por el ID de usuario (GUID) de tu usuario de Azure AD.
    • Público permitido: URI de ID de aplicación que usaste cuando registraste la aplicación en Azure AD.
  5. Haz clic en Continuar.

  6. En la sección Configurar atributos de proveedores, agrega las asignaciones de atributos que identificaste antes.

  7. En la sección Condiciones de atributos, ingresa la condición de atributo que identificaste antes. Deja el campo en blanco si no tienes una condición de atributo.

  8. Haz clic en Guardar para crear el proveedor y el grupo de Workload Identity.

gcloud

  1. Crea un nuevo grupo de identidades para cargas de trabajo:

    gcloud iam workload-identity-pools create POOL_ID \
        --location="global" \
        --description="DESCRIPTION" \
        --display-name="DISPLAY_NAME"
    

    Reemplaza lo siguiente:

    • POOL_ID: el ID único para el grupo.
    • DISPLAY_NAME: el nombre del grupo.
    • DESCRIPTION: la descripción del grupo. Esta descripción aparece cuando se otorga acceso a identidades de grupo.
  2. Agrega un proveedor de grupos de Workload Identity:

    AWS

    A fin de crear el proveedor de grupos de Workload Identity para AWS, ejecuta el siguiente comando:

    gcloud iam workload-identity-pools providers create-aws PROVIDER_ID \
      --location="global"  \
      --workload-identity-pool="POOL_ID" \
      --account-id="ACCOUNT_ID" \
      --attribute-mapping="MAPPINGS" \
      --attribute-condition="CONDITIONS"
    

    Reemplaza lo siguiente:

    Ejemplo:

    gcloud iam workload-identity-pools providers create-aws example-provider \
      --location="global"  \
      --workload-identity-pool="pool-1" \
      --account-id="123456789000" \
      --attribute-mapping="google.subject=assertion.arn"
    

    Azure

    Si deseas crear el proveedor de grupos de Workload Identity para Azure, ejecuta el siguiente comando:

    gcloud iam workload-identity-pools providers create-oidc PROVIDER_ID \
        --location="global" \
        --workload-identity-pool="POOL_ID" \
        --issuer-uri="ISSUER_URI" \
        --allowed-audiences="APPLICATION_ID_URI" \
        --attribute-mapping="MAPPINGS" \
        --attribute-condition="CONDITIONS"
    

    Reemplaza lo siguiente:

    • PROVIDER_ID: el ID único para el proveedor.
    • POOL_ID: el ID del grupo.
    • ISSUER_URI: El ID de usuario (GUID) de tu usuario de Azure AD, a veces con formato https://sts.windows.net/TENANT_ID. El URI del emisor puede variar, y para encontrar el URI de la entidad emisora, puedes depurar tu JWT con JWT.io.
    • APPLICATION_ID_URI: URI de ID de aplicación que usaste cuando registraste la aplicación en Azure AD.
    • MAPPINGS: Es la lista separada por comas de las asignaciones de atributos que identificaste antes.
    • CONDITIONS: (Opcional) Es la condición de atributo que identificaste antes.

    Ejemplo:

    gcloud iam workload-identity-pools providers create-oidc example-provider \
        --location="global" \
        --workload-identity-pool="pool-1" \
        --issuer-uri="https://sts.windows.net/00000000-1111-2222-3333-444444444444" \
        --allowed-audiences="api://my-app" \
        --attribute-mapping="google.subject=assertion.sub,google.groups=assertion.groups"
    

Autentica una carga de trabajo

Debes realizar estos pasos una vez por carga de trabajo.

Crea una cuenta de servicio para la carga de trabajo externa

  1. Habilita las API de IAM, Security Token Service, and Service Account Credentials.

    Habilita las API

  2. Crea una cuenta de servicio que represente la carga de trabajo. Es mejor usar una cuenta de servicio dedicada para cada carga de trabajo.

    No es necesario que la cuenta de servicio esté en el mismo proyecto que el grupo de identidades para cargas de trabajo.

  3. Otorga acceso a la cuenta de servicio a los recursos a los que deseas que accedan las identidades externas.

Permite que la carga de trabajo externa actúe en nombre de la cuenta de servicio

Para permitir que las identidades externas actúen en nombre de una cuenta de servicio, otórgales el rol del usuario de identidades para cargas de trabajo (roles/iam.workloadIdentityUser) en esta cuenta. Puedes otorgar el rol a una identidad externa específica o a varias identidades externas:

  • Para una identidad externa específica, escribe una condición de atributo que verifique el atributo google.subject.
  • Para un grupo de identidades externas, escribe una condición de atributo que verifique el atributo google.groups o un atributo personalizado attribute.NAME.

Consola

Para permitir que las identidades externas actúen en nombre de una cuenta de servicio con la consola de Google Cloud, haz lo siguiente:

  1. En la consola de Google Cloud, ve a la página Grupos de identidades para cargas de trabajo.

    Ir a Grupos de identidades para cargas de trabajo

  2. Busca el grupo de identidades para cargas de trabajo que deseas actualizar y selecciónalo.

  3. Para otorgar acceso al grupo de identidades para cargas de trabajo seleccionado, haz clic en Otorgar acceso.

  4. En la lista Cuenta de servicio, selecciona la cuenta de servicio para las identidades externas que actuarán en nombre de ella.

  5. Para elegir qué identidades en el grupo pueden actuar en nombre de la cuenta de servicio, realiza una de las siguientes acciones:

    • A fin de permitir que solo las identidades específicas del grupo de identidades para cargas de trabajo actúen en nombre de la cuenta de servicio, selecciona Solo identidades que coinciden con el filtro.

      En la lista Nombre del atributo, selecciona el atributo que deseas filtrar.

      En el campo Valor del atributo, ingresa el valor esperado del atributo; por ejemplo, si usas una asignación de atributos google.subject=assertion.sub, establece el nombre del atributo en subject y el valor del atributo en el valor de la declaración sub en los tokens que emite tu proveedor de identidad externo.

  6. Para guardar la configuración, haz clic en Guardar y, luego, en Descartar.

gcloud

Para permitir que las identidades externas actúen en nombre de una cuenta de servicio mediante la CLI de gcloud, haz lo siguiente:

  1. Para obtener el número del proyecto actual, ejecuta el siguiente comando:

    gcloud projects describe $(gcloud config get-value core/project) --format=value\(projectNumber\)
    
  2. Para otorgar el rol de usuario de identidades para cargas de trabajo (roles/iam.workloadIdentityUser) a identidades externas que cumplan con ciertos criterios, haz lo siguiente:

    Por tema

    gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \
        --role=roles/iam.workloadIdentityUser \
        --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT"
    

    Por grupo

    gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \
        --role=roles/iam.workloadIdentityUser \
        --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP"
    

    Por atributo

    gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \
        --role=roles/iam.workloadIdentityUser \
        --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE"
    

    Reemplaza lo siguiente:

    • SERVICE_ACCOUNT_EMAIL: La dirección de correo electrónico de la cuenta de servicio
    • PROJECT_NUMBER: el número del proyecto que contiene el grupo de identidades para cargas de trabajo
    • POOL_ID: el ID del grupo de identidades para cargas de trabajo
    • SUBJECT: el valor esperado para el atributo que asignaste a google.subject
    • GROUP: el valor esperado para el atributo que asignaste a google.groups
    • ATTRIBUTE_NAME: el nombre de un atributo personalizado en la asignación de atributos

Crea una configuración de credenciales

Las bibliotecas cliente de Cloud, la CLI de gcloud y Terraform pueden obtener credenciales externas de forma automática y usarlas para actuar en nombre de una cuenta de servicio. Para permitir que las bibliotecas y las herramientas completen este proceso, debes proporcionar un archivo de configuración de credenciales. Este archivo define lo siguiente:

  • Dónde obtener credenciales externas
  • Qué grupo y proveedor de identidades para cargas de trabajo usar
  • Qué cuenta de servicio actuará en nombre de ella

Para crear un archivo de configuración de credenciales, haz lo siguiente:

Consola

Descarga un archivo de configuración de credenciales en la consola de Google Cloud:

  1. En la consola de Google Cloud, ve a la página Grupos de Workload Identity.

    Ir a Grupos de Workload Identity

  2. Busca el grupo de Workload Identity que contiene el IdP que deseas usar y haz clic en él.

  3. Selecciona Cuentas de servicio conectadas.

  4. Busca la cuenta de servicio que quieras usar y haz clic en Descargar.

  5. En el cuadro de diálogo Configurar tu aplicación, selecciona el proveedor que contiene las identidades externas que actuarán en nombre de la cuenta de servicio.

  6. Proporciona la siguiente configuración adicional:

    AWS

    No se requiere ninguna configuración adicional.

    Azure

    URL de ID de aplicación: el URI de ID de aplicación de la aplicación de Azure

  7. Selecciona Descargar configuración para descargar el archivo de configuración de las credenciales y, luego, haz clic en Descartar.

gcloud

Para crear un archivo de configuración de credenciales mediante gcloud iam workload-identity-pools create-cred-config, haz lo siguiente:

AWS

Para crear un archivo de configuración de credenciales que permita que la biblioteca obtenga un token de acceso de los metadatos de la instancia de EC2, haz lo siguiente:

gcloud iam workload-identity-pools create-cred-config \
    projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \
    --service-account=SERVICE_ACCOUNT_EMAIL \
    --service-account-token-lifetime-seconds=SERVICE_ACCOUNT_TOKEN_LIFETIME \
    --aws \
    --output-file=FILEPATH.json

Reemplaza lo siguiente:

  • PROJECT_NUMBER: Es el número del proyecto que contiene el grupo de Workload Identity.
  • POOL_ID: El ID del grupo de Workload Identity
  • PROVIDER_ID: El ID del proveedor de grupos de Workload Identity
  • SERVICE_ACCOUNT_EMAIL: La dirección de correo electrónico de la cuenta de servicio
  • SERVICE_ACCOUNT_TOKEN_LIFETIME: la vida útil del token de acceso a la cuenta de servicio, en segundos. El valor predeterminado es de una hora cuando no se proporciona. Para especificar un ciclo de vida de más de una hora, debes configurar la restricción de la política de la organización constraints/iam.allowServiceAccountCredentialLifetimeExtension.
  • FILEPATH: El archivo en el que se guardará la configuración

Si usas AWS IMDSv2, se debe agregar una marca adicional --enable-imdsv2 al comando gcloud iam workload-identity-pools create-cred-config:

gcloud iam workload-identity-pools create-cred-config \
    projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \
    --service-account=SERVICE_ACCOUNT_EMAIL \
    --aws \
    --enable-imdsv2 \
    --output-file=FILEPATH.json

Si no puedes usar el servidor de metadatos de AWS, puedes proporcionar credenciales de seguridad de AWS a través de las siguientes variables de entorno:

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY
  • Ya sea de AWS_REGION o AWS_DEFAULT_REGION
  • Opcional: AWS_SESSION_TOKEN

La CLI de gcloud y las bibliotecas usan estas variables de entorno de AWS cuando el servidor de metadatos de AWS no está disponible.

Azure

Crea un archivo de configuración de credenciales que permita a la biblioteca obtener un token de acceso del Azure Instance Metadata Service (IMDS):

gcloud iam workload-identity-pools create-cred-config \
    projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \
    --service-account=SERVICE_ACCOUNT_EMAIL \
    --service-account-token-lifetime-seconds=SERVICE_ACCOUNT_TOKEN_LIFETIME \
    --azure \
    --app-id-uri APPLICATION_ID_URI \
    --output-file=FILEPATH.json

Reemplaza lo siguiente:

  • PROJECT_NUMBER: Es el número del proyecto que contiene el grupo de Workload Identity.
  • POOL_ID: El ID del grupo de Workload Identity
  • PROVIDER_ID: El ID del proveedor de grupos de Workload Identity
  • SERVICE_ACCOUNT_EMAIL: La dirección de correo electrónico de la cuenta de servicio
  • APPLICATION_ID_URI: Es el URI de ID de aplicación de la aplicación de Azure
  • SERVICE_ACCOUNT_TOKEN_LIFETIME: la vida útil del token de acceso a la cuenta de servicio, en segundos. El valor predeterminado es de una hora cuando no se proporciona. Para especificar un ciclo de vida de más de una hora, debes configurar la restricción de la política de la organización constraints/iam.allowServiceAccountCredentialLifetimeExtension.
  • FILEPATH: El archivo en el que se guardará la configuración

Usa la configuración de credenciales para acceder a Google Cloud

Para permitir que las herramientas y las bibliotecas cliente usen tu configuración de credenciales, haz lo siguiente en tu entorno de AWS o Azure:

  1. Inicializa una variable de entorno GOOGLE_APPLICATION_CREDENTIALS y apúntala al archivo de configuración de credenciales:

    Bash

      export GOOGLE_APPLICATION_CREDENTIALS=`pwd`/FILEPATH.json
      
    En el ejemplo anterior, FILEPATH es la ruta de acceso relativa al archivo de configuración de credenciales.

    PowerShell

      $env:GOOGLE_APPLICATION_CREDENTIALS = Resolve-Path 'FILEPATH.json'
      
    En el ejemplo anterior, FILEPATH es la ruta de acceso relativa al archivo de configuración de credenciales.
  2. Usa una biblioteca cliente o herramienta que admita la federación de Workload Identity y pueda encontrar credenciales de forma automática:

    C++

    Las bibliotecas cliente de Google Cloud para C++ admiten la federación de identidades para cargas de trabajo desde la versión v2.6.0. Para usar la federación de identidades para cargas de trabajo, debes compilar las bibliotecas cliente con la versión 1.36.0 o posterior de gRPC.

    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 para cargas de trabajo 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.

    gcloud

    Para autenticar con la federación de identidades para cargas de trabajo, usa el comando gcloud auth login:

    gcloud auth login --cred-file=FILEPATH.json
    

    Reemplaza FILEPATH por la ruta de acceso al archivo de configuración de credenciales.

    La asistencia para la federación de identidades para cargas de trabajo en la CLI de gcloud está disponible en la versión 363.0.0 y posteriores de gcloud CLI.

    Terraform

    El proveedor de servicios en la nube admite la federación de identidades para cargas de trabajo si usas la versión 3.61.0 o una posterior:

    terraform {
      required_providers {
        google = {
          source  = "hashicorp/google"
          version = "~> 3.61.0"
        }
      }
    }
    

    gsutil

    Para autenticar a través de la federación de identidades para cargas de trabajo, usa uno de los siguientes métodos:

    Cuando uses gsutil junto con gcloud, accede con normalidad:

    gcloud auth login --cred-file=FILEPATH.json
    

    Cuando uses gsutil como una aplicación de línea de comandos independiente, edita el archivo .boto para incluir la siguiente sección:

    [Credentials]
    gs_external_account_file = FILEPATH
    

    En ambos casos, reemplaza FILEPATH por la ruta de acceso al archivo de configuración de la credencial.

    La asistencia para la federación de identidades para cargas de trabajo en gsutil está disponible en la versión 379.0.0 y posteriores de gcloud CLI.

    bq

    Para autenticar a través de la federación de identidades para cargas de trabajo, usa el comando gcloud auth login de la siguiente manera:

    gcloud auth login --cred-file=FILEPATH.json
    

    Reemplaza FILEPATH por la ruta de acceso al archivo de configuración de credenciales.

    La compatibilidad con la federación de Workload Identity en bq está disponible en la versión 390.0.0 y posteriores de la CLI de gcloud.

    Si no puedes usar una biblioteca cliente que admita la federación de Workload Identity, puedes autenticarte de manera programática con la API de REST.

Situaciones avanzadas

Autentica una carga de trabajo con la API de REST

Si no puedes usar las bibliotecas cliente, puedes seguir estos pasos para permitir que una carga de trabajo externa obtenga un token de acceso de corta duración mediante la API de REST:

  1. Obtén credenciales de tu IdP externo:

    AWS

    Crea un documento JSON que contenga la información que incluirías normalmente en una solicitud al extremo GetCallerIdentity() de AWS, incluida una firma de solicitud válida.

    La federación de Workload Identity hace referencia a este documento JSON como un token GetCallerIdentity. El token permite que la federación de Workload Identity verifique la identidad sin revelar la clave de acceso secreta de AWS.

    Un token GetCallerIdentity es similar al que se muestra a continuación:

    {
      "url": "https://sts.amazonaws.com?Action=GetCallerIdentity&Version=2011-06-15",
      "method": "POST",
      "headers": [
        {
          "key": "Authorization",
          "value" : "AWS4-HMAC-SHA256 Credential=AKIASOZTBDV4D7ABCDEDF/20200228/us-east-1/sts/aws4_request, SignedHeaders=host;x-amz-date,Signature=abcedefdfedfd"
        },
        {
          "key": "host",
          "value": "sts.amazonaws.com"
        },
        {
          "key": "x-amz-date",
          "value": "20200228T225005Z"
        },
        {
          "key": "x-goog-cloud-target-resource",
          "value": "//iam.googleapis.com/projects/12345678/locations/global/workloadIdentityPools/my-pool/providers/my-aws-provider"
        },
        {
          "key": "x-amz-security-token",
          "value": "GizFWJTqYX...xJ55YoJ8E9HNU="
        }
      ]
    }
    

    El token contiene los siguientes campos:

    • url: La URL del extremo de AWS STS para GetCallerIdentity(), con el cuerpo de una solicitud GetCallerIdentity() estándar anexada como parámetros de consulta. Por ejemplo, https://sts.amazonaws.com?Action=GetCallerIdentity&Version=2011-06-15 Te recomendamos usar extremos de STS regionales y diseñes una infraestructura confiable para tus cargas de trabajo. Para obtener más información, consulta Extremos regionales de AWS STS.
    • method: Es el método de solicitud HTTP: POST.
    • headers: Son los encabezados de la solicitud HTTP, que deben incluir lo siguiente:
      • Authorization: La firma de la solicitud
      • host: El nombre de host del campo url; por ejemplo, sts.amazonaws.com
      • x-amz-date: La hora a la que enviarás la solicitud, con el formato de una string simple ISO 8601. Por lo general, este valor se establece en la hora actual y se usa para evitar ataques de repetición.
      • x-goog-cloud-target-resource: Es el nombre completo del recurso del proveedor de identidad sin un prefijo https:. Por ejemplo:
        //iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID
        
      • x-amz-security-token: Es el token de sesión. Solo es necesario si usas credenciales de seguridad temporales.

    En el siguiente ejemplo, se crea un token GetCallerIdentity codificado en URL. Extrae el token codificado en URL para usarlo más adelante. También crea un token legible solo para tu referencia:

    import json
    import urllib
    
    import boto3
    from botocore.auth import SigV4Auth
    from botocore.awsrequest import AWSRequest
    
    def create_token_aws(project_number: str, pool_id: str, provider_id: str) -> None:
        # Prepare a GetCallerIdentity request.
        request = AWSRequest(
            method="POST",
            url="https://sts.amazonaws.com/?Action=GetCallerIdentity&Version=2011-06-15",
            headers={
                "Host": "sts.amazonaws.com",
                "x-goog-cloud-target-resource": f"//iam.googleapis.com/projects/{project_number}/locations/global/workloadIdentityPools/{pool_id}/providers/{provider_id}",
            },
        )
    
        # Set the session credentials and Sign the request.
        # get_credentials loads the required credentials as environment variables.
        # Refer:
        # https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html
        SigV4Auth(boto3.Session().get_credentials(), "sts", "us-east-1").add_auth(request)
    
        # Create token from signed request.
        token = {"url": request.url, "method": request.method, "headers": []}
        for key, value in request.headers.items():
            token["headers"].append({"key": key, "value": value})
    
        # The token lets workload identity federation verify the identity without revealing the AWS secret access key.
        print("Token:\n%s" % json.dumps(token, indent=2, sort_keys=True))
        print("URL encoded token:\n%s" % urllib.parse.quote(json.dumps(token)))
    
    def main() -> None:
        # TODO(Developer): Replace the below credentials.
        # project_number: Google Project number (not the project id)
        project_number = "my-project-number"
        pool_id = "my-pool-id"
        provider_id = "my-provider-id"
    
        create_token_aws(project_number, pool_id, provider_id)
    
    if __name__ == "__main__":
        main()

    Inicializa las siguientes variables:

    Bash

    SUBJECT_TOKEN_TYPE="urn:ietf:params:aws:token-type:aws4_request"
    SUBJECT_TOKEN=TOKEN
    

    PowerShell

    $SubjectTokenType = "urn:ietf:params:aws:token-type:aws4_request"
    $SubjectToken = "TOKEN"
    

    En el ejemplo anterior, TOKEN es el token GetCallerIdentity codificado como URL que generó la secuencia de comandos anterior.

    Azure

    Conéctate a una VM de Azure que tenga una identidad administrada y obtén un token de acceso de Azure Instance Metadata Service (IMDS):

    Bash

    SUBJECT_TOKEN_TYPE="urn:ietf:params:oauth:token-type:jwt"
    SUBJECT_TOKEN=$(curl \
      "http://169.254.169.254/metadata/identity/oauth2/token?resource=APP_ID_URI&api-version=2018-02-01" \
      -H "Metadata: true" | jq -r .access_token)
    echo $SUBJECT_TOKEN
    

    Este comando usa la herramienta de jq. jq está disponible de forma predeterminada en Cloud Shell.

    PowerShell

    $SubjectTokenType = "urn:ietf:params:oauth:token-type:jwt"
    $SubjectToken = (Invoke-RestMethod `
      -Uri "http://169.254.169.254/metadata/identity/oauth2/token?resource=APP_ID_URI&api-version=2018-02-01" `
      -Headers @{Metadata="true"}).access_token
    Write-Host $SubjectToken
    

    En el ejemplo anterior, APP_ID_URI es el URI de ID de aplicación de la aplicación que configuraste para la federación de Workload Identity.

  2. Usa la API de servicio de token de seguridad para intercambiar la credencial por un token de acceso de corta duración:

    Bash

    STS_TOKEN=$(curl https://sts.googleapis.com/v1/token \
        --data-urlencode "audience=//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID" \
        --data-urlencode "grant_type=urn:ietf:params:oauth:grant-type:token-exchange" \
        --data-urlencode "requested_token_type=urn:ietf:params:oauth:token-type:access_token" \
        --data-urlencode "scope=https://www.googleapis.com/auth/cloud-platform" \
        --data-urlencode "subject_token_type=$SUBJECT_TOKEN_TYPE" \
        --data-urlencode "subject_token=$SUBJECT_TOKEN" | jq -r .access_token)
    echo $STS_TOKEN
    

    PowerShell

    [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12
    $StsToken = (Invoke-RestMethod `
        -Method POST `
        -Uri "https://sts.googleapis.com/v1/token" `
        -ContentType "application/json" `
        -Body (@{
            "audience"           = "//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID"
            "grantType"          = "urn:ietf:params:oauth:grant-type:token-exchange"
            "requestedTokenType" = "urn:ietf:params:oauth:token-type:access_token"
            "scope"              = "https://www.googleapis.com/auth/cloud-platform"
            "subjectTokenType"   = $SubjectTokenType
            "subjectToken"       = $SubjectToken
        } | ConvertTo-Json)).access_token
    Write-Host $StsToken
    

    Reemplaza los siguientes valores:

    • PROJECT_NUMBER: Es el número del proyecto que contiene el grupo de Workload Identity.
    • POOL_ID: Es el ID del grupo de Workload Identity.
    • PROVIDER_ID: Es el ID del proveedor de grupos de Workload Identity.
  3. Usa el token del servicio de tokens de seguridad a fin de invocar el método generateAccessToken de la API de Service Account Credentials de IAM para obtener un token de acceso:

Bash

ACCESS_TOKEN=$(curl -0 -X POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT_EMAIL:generateAccessToken \
    -H "Content-Type: text/json; charset=utf-8" \
    -H "Authorization: Bearer $STS_TOKEN" \
    -d @- <<EOF | jq -r .accessToken
    {
        "scope": [ "https://www.googleapis.com/auth/cloud-platform" ]
    }
EOF
)
echo $ACCESS_TOKEN

PowerShell

$AccessToken = (Invoke-RestMethod `
    -Method POST `
    -Uri "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT_EMAIL:generateAccessToken" `
    -Headers @{ "Authorization" = "Bearer $StsToken" } `
    -ContentType "application/json" `
    -Body (@{
        "scope" = , "https://www.googleapis.com/auth/cloud-platform"
    } | ConvertTo-Json)).accessToken
Write-Host $AccessToken

Reemplaza SERVICE_ACCOUNT_EMAIL por la dirección de correo electrónico de la cuenta de servicio.

¿Qué sigue?