Obtén credenciales de corta duración con federación de identidades

En esta guía, se describe cómo puedes usar un grupo y un proveedor de Workload Identity para obtener credenciales de corta duración mediante este proceso:

  1. Obtén una credencial del proveedor de identidad de confianza.
  2. Intercambia la credencial por un token del servicio de tokens de seguridad.
  3. Usa el token del servicio de tokens de seguridad para actuar en nombre de una cuenta de servicio y obtener un token de acceso de Google de corta duración.

Mediante los tokens de acceso de Google de corta duración, puedes acceder a cualquier recurso de Google Cloud al que se le otorgó acceso a la cuenta de servicio.

Antes de comenzar

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

    Habilita las API

  2. Debes federar con un proveedor de identidad externo mediante la creación de un grupo y un proveedor de Workload Identity.

  3. Crea una cuenta de servicio en la que desees que actúen en nombre de identidades externas.

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

Otorga permiso a identidades externas para actuar en nombre de una cuenta de servicio

Para permitir que las identidades externas actúen en nombre de una cuenta de servicio, debes otorgarles la función de usuario de Workload Identity (roles/iam.workloadIdentityUser) en esta cuenta. Puedes otorgar la función 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.
  • Para todas las identidades externas del grupo de Workload Identity, no uses una condición de atributo.

Consola

  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 deseas actualizar y haz clic en él.

  3. Haz clic en Grant access.

  4. En la lista desplegable Cuenta de servicio, selecciona la cuenta de servicio en cuyo nombre actuarán las identidades externas.

  5. Elige qué identidades del grupo pueden actuar en nombre de la cuenta de servicio:

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

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

      En el campo Attribute value, ingresa el valor esperado del atributo.

      Por ejemplo, si usas una asignación de atributos google.subject=assertion.sub, establece el nombre del Atributo como subject y el Valor del atributo al valor del reclamo sub en tokens emitidos por tu proveedor de identidad externo.

    • Para permitir que todas las identidades externas del grupo de Workload Identity actúen en nombre de la cuenta de servicio, selecciona Todas las identidades en el grupo.

  6. Haz clic en Guardar.

  7. Haz clic en Descartar.

gcloud

  1. Crea un identificador para las identidades externas:

    • Una identidad externa específica:

      principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT
      
    • Un grupo de identidades externas:

      principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP
      
    • Todas las identidades externas que tienen un atributo determinado cuentan con las siguientes características:

      principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE
      
    • Todas las identidades externas en un grupo de Workload Identity:

      principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*
      

    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 del grupo de Workload Identity.
    • SUBJECT: Es el valor esperado para el atributo que asignaste a google.subject.
    • GROUP: Es el valor esperado para el atributo que asignaste a google.groups.
    • ATTRIBUTE_NAME: Es el nombre de un atributo personalizado en la asignación de atributos.

    Para obtener el número del proyecto actual, puedes usar el siguiente comando:

    gcloud projects describe $(gcloud config get-value core/project) --format=value\(projectNumber\)
    
  2. Otorga la función de usuario de Workload Identity (roles/iam.workloadIdentityUser) a la cuenta principal en la cuenta de servicio:

    gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \
        --role=roles/iam.workloadIdentityUser \
        --member="MEMBER_ID"
    

    Reemplaza los siguientes valores:

    • SERVICE_ACCOUNT_EMAIL: Es la dirección de correo electrónico de la cuenta de servicio.
    • MEMBER_ID: Es el identificador de miembro que identificaste en el paso anterior.

Autentica mediante bibliotecas cliente, la CLI de gcloud o Terraform

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 Workload Identity usar
  • Qué cuenta de servicio actuará en nombre de ella

La forma en que las bibliotecas cliente usan los archivos de configuración de credenciales depende de tu proveedor de identidad externo:

AWS

Las bibliotecas cliente obtienen de forma automática credenciales temporales de los metadatos de instancia de EC2.

Azure

Las bibliotecas cliente obtienen automáticamente tokens de acceso de Azure Instance Metadata Service (IMDS).

Acciones de GitHub

Debido a que los parámetros necesarios para obtener un token de ID de GitHub varían para cada ejecución del flujo de trabajo, no puedes usar un archivo de configuración de credenciales estática en un flujo de trabajo de acciones de GitHub.

Usa la acción google-github-actions/auth para generar de forma automática un archivo de configuración de credenciales durante la ejecución del flujo de trabajo. Las bibliotecas cliente y las herramientas como terraform pueden usar este archivo de configuración de credenciales para obtener credenciales de Google de forma automática.

OIDC

Las bibliotecas cliente obtienen credenciales de un archivo local, una URL HTTP o un ejecutable local:

  • Credenciales provistas por el archivo: Los tokens se cargan desde un archivo. Otro proceso debe actualizar este archivo con un token de OIDC nuevo antes de que caduque el token anterior. Por ejemplo, si el token tiene un ciclo de vida de 1 hora, debes actualizar el archivo antes de que tenga 1 hora de antigüedad.
  • Credenciales basadas en URL: Los tokens se cargan desde un servidor local con un extremo que responde a las solicitudes GET HTTP. La respuesta debe ser un token de ID de OIDC, ya sea en texto sin formato o en formato JSON.
  • Credenciales basadas en ejecutables: Los tokens se cargan desde un ejecutable local. El ejecutable debe controlar que se proporcione un token válido de ID de OIDC no vencido en formato JSON a stdout:

    {
      "version": 1,
      "success": true,
      "token_type": "urn:ietf:params:oauth:token-type:id_token",
      "id_token": "HEADER.PAYLOAD.SIGNATURE",
      "expiration_time": 1620499962
    }
    
    Estos campos son obligatorios para una respuesta exitosa, con la excepción de expiration_time. El campo expiration_time solo es obligatorio cuando se especifica un archivo de salida en la configuración de la credencial.

    Si se produce un error, el ejecutable debe mostrarlo en el siguiente formato JSON a stdout:

    {
      "version": 1,
      "success": false,
      "code": "401",
      "message": "Caller not authorized."
    }
    
    Todos estos campos son obligatorios para una respuesta de error. Las bibliotecas cliente usarán los campos de código y mensaje cuando se genere el error adecuado.

    Resumen de campos de formato de respuesta:

    • version: Es la versión del resultado de JSON. Por el momento, solo se admite la versión 1.
    • success: Es el estado de la respuesta. Cuando es verdadero, la respuesta debe contener el token, el tipo de token y el vencimiento de terceros. El ejecutable también debe salir con el código de salida 0. Cuando es falso, la respuesta debe contener el código de error y los campos del mensaje, y salir con un valor distinto de cero.
    • token_type: El tipo de token del sujeto de terceros. Los valores admitidos son urn:ietf:params:oauth:token-type:id_token y urn:ietf:params:oauth:token-type:jwt.
    • id_token: El token de OIDC de terceros.
    • expiration_time: El tiempo de vencimiento del token de OIDC en segundos (tiempo de la época Unix).
    • code: La string de código de error.
    • message: El mensaje de error.

    Las bibliotecas cliente propagarán las siguientes variables de entorno cuando se ejecute el ejecutable:

    • GOOGLE_EXTERNAL_ACCOUNT_AUDIENCE: El campo de público de la configuración de las credenciales. Siempre presente.
    • GOOGLE_EXTERNAL_ACCOUNT_TOKEN_TYPE: El tipo de token del asunto esperado. Siempre presente.
    • GOOGLE_EXTERNAL_ACCOUNT_IMPERSONATED_EMAIL: El correo electrónico de la cuenta de servicio. Solo está presente cuando se usa el robo de identidad de cuentas de servicio.
    • GOOGLE_EXTERNAL_ACCOUNT_OUTPUT_FILE: Ubicación del archivo de salida de la configuración de credenciales. Solo está presente cuando se especifica en la configuración de credenciales.

    El ejecutable puede usar estas variables de entorno para evitar la codificación de estos valores.

    Para habilitar este método de obtención de credenciales con las bibliotecas cliente, la variable de entorno GOOGLE_EXTERNAL_ACCOUNT_ALLOW_EXECUTABLES debe configurarse como 1.

OIDC (AD FS)

Las bibliotecas cliente pueden obtener credenciales de un archivo local o una URL HTTP, pero no admiten directamente la autenticación integrada de Windows (IWA). Si deseas obtener un token de acceso para el usuario que accedió y almacenarlo en un archivo local, usa el siguiente comando de PowerShell:

(Invoke-RestMethod `
    -Uri "https://ADFS_DOMAIN/adfs/oauth2/token/" `
    -Method POST `
    -Body @{
        client_id = 'CLIENT_ID'
        grant_type = 'client_credentials'
        scope = 'openid'
        resource = 'RELYING_PARTY_ID'
        use_windows_client_authentication = 'true'
        } `
    -UseDefaultCredentials).access_token | Out-File -Encoding ASCII TOKEN_FILEPATH

Reemplaza los siguientes valores:

  • ADFS_DOMAIN: Nombre de dominio público del servidor AD FS de la granja.
  • CLIENT_ID: ID de cliente del registro de la aplicación en AD FS.
  • RELYING_PARTY_ID: Identificador de parte confiable que usaste cuando creaste una aplicación de API web para el grupo de Workload Identity en AD FS.
  • TOKEN_FILEPATH: Ruta de acceso a un archivo temporal para guardar el token de AD FS. Asegúrate de que el archivo esté almacenado en una ubicación en la que solo los usuarios autorizados puedan leer el contenido del archivo.

Debido a que las credenciales de Google de corta duración solo son válidas durante un tiempo limitado (de forma predeterminada, 1 hora), debes volver a ejecutar este comando de forma periódica.

SAML

Las bibliotecas cliente obtienen credenciales de un archivo local, una URL HTTP o un ejecutable local:

  • Credenciales provistas por el archivo: Las aserciones se cargan desde un archivo. Otro proceso debe actualizar este archivo con una nueva aserción de SAML codificada en base64 antes de que caduque la aserción anterior. Por ejemplo, si la aserción tiene un ciclo de vida de 1 hora, debes actualizar el archivo antes de que tenga 1 hora de antigüedad.
  • Credenciales basadas en URL: Las aserciones se cargan desde un servidor local con un extremo que responde a las solicitudes GET HTTP. La respuesta debe ser una aserción de SAML codificada en base64 o JSON que contenga una aserción de SAML codificada en base64.
  • Credenciales basadas en ejecutables: Las aserciones se cargan desde un ejecutable local. El ejecutable debe controlar que se proporcione una aserción SAML válida no vencida en formato JSON a stdout:

    {
      "version": 1,
      "success": true,
      "token_type": "urn:ietf:params:oauth:token-type:saml2",
      "saml_response": "...",
      "expiration_time": 1620499962
    }
    
    Estos campos son obligatorios para una respuesta exitosa, con la excepción de expiration_time. El campo expiration_time solo es obligatorio cuando se especifica un archivo de salida en la configuración de la credencial.

    Si se produce un error, el ejecutable debe mostrarlo en el siguiente formato JSON a stdout:

    {
      "version": 1,
      "success": false,
      "code": "401",
      "message": "Caller not authorized."
    }
    
    Todos estos campos son obligatorios para una respuesta de error. Las bibliotecas cliente usarán los campos de código y mensaje cuando se genere el error adecuado.

    Resumen de campos de formato de respuesta:

    • version: Es la versión del resultado de JSON. Por el momento, solo se admite la versión 1.
    • success: Es el estado de la respuesta. Cuando es verdadero, la respuesta debe contener el token, el tipo de token y el vencimiento de terceros. El ejecutable también debe salir con el código de salida 0. Cuando es falso, la respuesta debe contener el código de error y los campos del mensaje, y salir con un valor distinto de cero.
    • token_type: El tipo de token del sujeto de terceros. Debe ser urn:ietf:params:oauth:token-type:saml2.
    • saml_response: La respuesta SAML de terceros.
    • expiration_time: El tiempo de vencimiento de la respuesta SAML de terceros en segundos (tiempo de la época de Unix).
    • code: La string de código de error.
    • message: El mensaje de error.

    Las bibliotecas cliente propagarán las siguientes variables de entorno cuando se ejecute el ejecutable:* GOOGLE_EXTERNAL_ACCOUNT_AUDIENCE: El campo de público de la configuración de credenciales. Siempre presente. * GOOGLE_EXTERNAL_ACCOUNT_TOKEN_TYPE: El tipo de token del asunto esperado. Siempre presente. * GOOGLE_EXTERNAL_ACCOUNT_IMPERSONATED_EMAIL: El correo electrónico de la cuenta de servicio. Solo está presente cuando se usa el robo de identidad de cuentas de servicio. * GOOGLE_EXTERNAL_ACCOUNT_OUTPUT_FILE: Ubicación del archivo de salida de la configuración de credenciales. Solo está presente cuando se especifica en la configuración de credenciales.

    El ejecutable puede usar estas variables de entorno para evitar la codificación de estos valores.

    Para habilitar este método de obtención de credenciales con las bibliotecas cliente, la variable de entorno GOOGLE_EXTERNAL_ACCOUNT_ALLOW_EXECUTABLES debe configurarse como 1.

Sigue estos pasos a fin de permitir que las bibliotecas cliente o Terraform usen la federación de Workload Identity para autenticarse:

  1. Crea un archivo de configuración de credenciales:

    Console

    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 proveedor de identidad 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

      Ruta de acceso del recurso: Es el URI del ID de aplicación de la aplicación de Azure

      OIDC

      Ruta de acceso del token de OIDC: Es la ruta de acceso del archivo local o la URL desde la que se obtienen las credenciales.

      Tipo de formato: Es el formato del archivo o respuesta de URL desde el que se recupera el token de ID.

      Nombre del campo del token del asunto: Es el campo en la respuesta que contiene el token (si el tipo de formato es json).

      SAML

      Ruta de aserción de SAML: Es la ruta de acceso del archivo local o la URL para obtener credenciales.

      Tipo de formato: Es el formato del archivo o respuesta de URL desde el que se recupera la aserción.

      Nombre del campo de confirmación: Es el campo en la respuesta que contiene la aserción (si el tipo de formato es json).

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

    gcloud

    Crea un archivo de configuración de credenciales mediante gcloud iam workload-identity-pools create-cred-config:

    AWS

    Crea un archivo de configuración de credenciales que permita a la biblioteca obtener un token de acceso de los metadatos de la instancia de EC2:

    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 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.
    • SERVICE_ACCOUNT_EMAIL: Es la dirección de correo electrónico de la cuenta de servicio.
    • SERVICE_ACCOUNT_TOKEN_LIFETIME: Es la duración deseada del ciclo de vida del token de acceso a la cuenta de servicio en segundos. La configuración predeterminada es de una hora cuando no se proporciona. Si se requiere una vida útil de más de una hora, se debe agregar la cuenta de servicio como un valor permitido en una política de la organización que aplique la restricción constraints/iam.allowServiceAccountCredentialLifetimeExtension.
    • FILEPATH: Es el archivo para 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
    

    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 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.
    • SERVICE_ACCOUNT_EMAIL: Es la dirección de correo electrónico de la cuenta de servicio.
    • SERVICE_ACCOUNT_TOKEN_LIFETIME: Es la duración deseada del ciclo de vida del token de acceso a la cuenta de servicio en segundos. La configuración predeterminada es de una hora cuando no se proporciona. Si se requiere una vida útil de más de una hora, se debe agregar la cuenta de servicio como un valor permitido en una política de la organización que aplique la restricción constraints/iam.allowServiceAccountCredentialLifetimeExtension.
    • APPLICATION_ID_URI: Es el URI de ID de aplicación de la aplicación de Azure
    • FILEPATH: Es el archivo para guardar la configuración.

    OIDC

    Para usar credenciales basadas en archivos, usa la marca --credential-source-file:

    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 \
        --output-file=FILEPATH.json \
        --credential-source-file=TOKEN_FILEPATH \
        --credential-source-type=SOURCE_TYPE \
        --credential-source-field-name=FIELD_NAME
    

    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.
    • SERVICE_ACCOUNT_EMAIL: Es la dirección de correo electrónico de la cuenta de servicio.
    • SERVICE_ACCOUNT_TOKEN_LIFETIME: Es la duración deseada del ciclo de vida del token de acceso a la cuenta de servicio en segundos. La configuración predeterminada es de una hora cuando no se proporciona. Si se requiere una vida útil de más de una hora, se debe agregar la cuenta de servicio como un valor permitido en una política de la organización que aplique la restricción constraints/iam.allowServiceAccountCredentialLifetimeExtension.
    • FILEPATH: Es el archivo para guardar la configuración.
    • TOKEN_FILEPATH: Es la ruta en la que se almacenan los tokens de ID de OIDC
    • SOURCE_TYPE: Es el formato del archivo de token de ID de OIDC, configurado como text (predeterminado) o json.
    • FIELD_NAME: Es el campo en el archivo de texto que contiene el token (si SOURCE_TYPE es json).

    Para usar las credenciales basadas en URL, usa la marca --credential-source-url:

    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 \
        --output-file=FILEPATH.json \
        --credential-source-url="TOKEN_URL" \
        --credential-source-headers="KEY_1=VALUE_1,KEY_2=VALUE_2" \
        --credential-source-type=SOURCE_TYPE \
        --credential-source-field-name=FIELD_NAME
    

    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.
    • SERVICE_ACCOUNT_EMAIL: Es la dirección de correo electrónico de la cuenta de servicio.
    • SERVICE_ACCOUNT_TOKEN_LIFETIME: Es la duración deseada del ciclo de vida del token de acceso a la cuenta de servicio en segundos. La configuración predeterminada es de una hora cuando no se proporciona. Si se requiere una vida útil de más de una hora, se debe agregar la cuenta de servicio como un valor permitido en una política de la organización que aplique la restricción constraints/iam.allowServiceAccountCredentialLifetimeExtension.
    • FILEPATH: Es el archivo para guardar la configuración.
    • TOKEN_URL: Es la URL del que se recuperará el token de ID de OIDC.
    • KEY_n, VALUE_n: Son los encabezados personalizados que se deben incluir en la solicitud HTTP a TOKEN_URL.
    • SOURCE_TYPE: Es el formato del archivo de token de ID de OIDC, configurado como text (predeterminado) o json.
    • FIELD_NAME: Es el campo en el archivo de texto que contiene el token (si SOURCE_TYPE es json).

    Para usar credenciales basadas en ejecutables, usa la marca --executable-command:

    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 \
        --output-file=FILEPATH.json \
        --executable-command=EXECUTABLE_COMMAND \
        --executable-timeout-millis=EXECUTABLE_TIMEOUT \
        --executable-output-file=EXECUTABLE_OUTPUT_FILE
    

    Reemplaza los siguientes valores:

    • 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: Es la duración deseada del ciclo de vida del token de acceso a la cuenta de servicio en segundos. La configuración predeterminada es de una hora cuando no se proporciona. Si se requiere una vida útil de más de una hora, se debe agregar la cuenta de servicio como un valor permitido en una política de la organización que aplique la restricción constraints/iam.allowServiceAccountCredentialLifetimeExtension.
    • FILEPATH: El archivo en el que se guardará la configuración
    • EXECUTABLE_COMMAND: el comando completo, incluidos los argumentos, para ejecutar a fin de recuperar el token de ID de OIDC (p. ej., --executable-command="/path/to/command --foo=bar")
    • EXECUTABLE_TIMEOUT: La duración opcional en milisegundos que se esperará para que se ejecute el ejecutable (el valor predeterminado es de 30 segundos)
    • EXECUTABLE_OUTPUT_FILE: Esta ruta de archivo apunta a las credenciales 3PI generadas por el ejecutable. Esto es útil para almacenar en caché las credenciales. Si especificas esta ruta de acceso, las bibliotecas de Auth verificarán su existencia antes de ejecutar el archivo ejecutable.

    OIDC (AD FS)

    Crea un archivo de configuración de credenciales que permita que la biblioteca lea el token de acceso de AD FS desde el archivo temporal:

    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 \
        --output-file=FILEPATH.json \
        --credential-source-file=TOKEN_FILEPATH \
        --credential-source-type=text
    

    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.
    • SERVICE_ACCOUNT_EMAIL: Es la dirección de correo electrónico de la cuenta de servicio.
    • SERVICE_ACCOUNT_TOKEN_LIFETIME: Es la duración deseada del ciclo de vida del token de acceso a la cuenta de servicio en segundos. La configuración predeterminada es de una hora cuando no se proporciona. Si se requiere una vida útil de más de una hora, se debe agregar la cuenta de servicio como un valor permitido en una política de la organización que aplique la restricción constraints/iam.allowServiceAccountCredentialLifetimeExtension.
    • FILEPATH: Es el archivo para guardar la configuración.
    • TOKEN_FILEPATH: Ruta de acceso al archivo temporal que contiene el token de AD FS

    SAML

    Para usar credenciales basadas en archivos, usa la marca --credential-source-file:

    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 \
        --output-file=FILEPATH.json \
        --credential-source-file=TOKEN_FILEPATH \
        --credential-source-type=SOURCE_TYPE \
        --credential-source-field-name=FIELD_NAME \
        --subject-token-type=urn:ietf:params:oauth:token-type:saml2
    

    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.
    • SERVICE_ACCOUNT_EMAIL: Es la dirección de correo electrónico de la cuenta de servicio.
    • SERVICE_ACCOUNT_TOKEN_LIFETIME: Es la duración deseada del ciclo de vida del token de acceso a la cuenta de servicio en segundos. La configuración predeterminada es de una hora cuando no se proporciona. Si se requiere una vida útil de más de una hora, se debe agregar la cuenta de servicio como un valor permitido en una política de la organización que aplique la restricción constraints/iam.allowServiceAccountCredentialLifetimeExtension.
    • FILEPATH: Es el archivo para guardar la configuración.
    • TOKEN_FILEPATH: Es la ruta de acceso en la que se almacenan las aserciones de SAML
    • SOURCE_TYPE: Es el formato del archivo de aserción de SAML, como text (predeterminado) o json.
    • FIELD_NAME: Es el campo en el archivo de texto que contiene la aserción (si SOURCE_TYPE es json)

    Para usar las credenciales basadas en URL, usa la marca --credential-source-url:

    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 \
        --output-file=FILEPATH.json \
        --credential-source-url="TOKEN_URL" \
        --credential-source-headers="KEY_1=VALUE_1,KEY_2=VALUE_2" \
        --credential-source-type=source_type \
        --credential-source-field-name=field_name
        --subject-token-type=urn:ietf:params:oauth:token-type:saml2
    

    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.
    • SERVICE_ACCOUNT_EMAIL: Es la dirección de correo electrónico de la cuenta de servicio.
    • SERVICE_ACCOUNT_TOKEN_LIFETIME: Es la duración deseada del ciclo de vida del token de acceso a la cuenta de servicio en segundos. La configuración predeterminada es de una hora cuando no se proporciona. Si se requiere una vida útil de más de una hora, se debe agregar la cuenta de servicio como un valor permitido en una política de la organización que aplique la restricción constraints/iam.allowServiceAccountCredentialLifetimeExtension.
    • FILEPATH: Es el archivo para guardar la configuración.
    • TOKEN_URL: Es la URL desde la que se recuperará la aserción de SAML.
    • KEY_n, VALUE_n: Son los encabezados personalizados que se deben incluir en la solicitud HTTP a TOKEN_URL.
    • SOURCE_TYPE: Es el formato del archivo de aserción de SAML, como text (predeterminado) o json.
    • FIELD_NAME: Es el campo en el archivo de texto que contiene la aserción (si SOURCE_TYPE es json)

    Para usar credenciales basadas en ejecutables, usa la marca --executable-command:

    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 \
        --output-file=FILEPATH.json \
        --executable-command=EXECUTABLE_COMMAND \
        --executable-timeout-millis=EXECUTABLE_TIMEOUT \
        --executable-output-file=EXECUTABLE_OUTPUT_FILE
    

    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.
    • SERVICE_ACCOUNT_EMAIL: Es la dirección de correo electrónico de la cuenta de servicio.
    • SERVICE_ACCOUNT_TOKEN_LIFETIME: Es la duración deseada del ciclo de vida del token de acceso a la cuenta de servicio en segundos. La configuración predeterminada es de una hora cuando no se proporciona. Si se requiere una vida útil de más de una hora, se debe agregar la cuenta de servicio como un valor permitido en una política de la organización que aplique la restricción constraints/iam.allowServiceAccountCredentialLifetimeExtension.
    • FILEPATH: Es el archivo para guardar la configuración.
    • EXECUTABLE_COMMAND: Es el comando completo para ejecutar a fin de recuperar la aserción de SAML.
    • EXECUTABLE_TIMEOUT: La duración opcional en milisegundos que se esperará para que se ejecute el ejecutable (el valor predeterminado es de 30 segundos)
    • EXECUTABLE_OUTPUT_FILE: El archivo de salida opcional que almacena la respuesta ejecutable

    Acciones de GitHub

    Edita el archivo YAML de GitHub Actions y agrega lo siguiente:

    • Para permitir que el trabajo recupere un token de ID de GitHub, agrega la siguiente configuración:

      permissions:
        id-token: write
        contents: read
      
    • Agrega un paso para crear un archivo de configuración de credenciales:

      - id: 'auth'
        name: 'Authenticate to Google Cloud'
        uses: 'google-github-actions/auth@v0.3.1'
        with:
          create_credentials_file: true
          workload_identity_provider: 'projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID'
          service_account: 'SERVICE_ACCOUNT_EMAIL'
      

    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.
    • SERVICE_ACCOUNT_EMAIL: Es la dirección de correo electrónico de la cuenta de servicio.

    Ejemplo:

    jobs:
      build:
        # Allow the job to fetch a GitHub ID token
        permissions:
          id-token: write
          contents: read
    
        runs-on: ubuntu-latest
    
        steps:
          - uses: actions/checkout@v2
    
          - id: 'auth'
            name: 'Authenticate to Google Cloud'
            uses: 'google-github-actions/auth@v0.3.1'
            with:
              create_credentials_file: true
              workload_identity_provider: 'projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID'
              service_account: 'SERVICE_ACCOUNT_EMAIL'
    
  2. 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.

    YAML de acciones de GitHub

    La acción google-github-actions/auth inicializa GOOGLE_APPLICATION_CREDENTIALS de forma automática.
  3. Usa una biblioteca cliente que admita la federación de Workload Identity y puede encontrar credenciales de forma automática:

    C++

    La mayoría de las bibliotecas cliente de Google Cloud para C++ admiten la federación de identidades mediante un objeto ChannelCredentials, que se crea mediante 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.

    Comienza a usarlo

    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 de forma automática. Para encontrar el ID del proyecto de manera automática, la cuenta de servicio en el archivo de configuración debe tener la función de Navegador (roles/browser) o una función 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 de forma automática. Para encontrar el ID del proyecto de manera automática, la cuenta de servicio en el archivo de configuración debe tener la función de Navegador (roles/browser) o una función 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 Workload Identity, usa el comando gcloud auth login:

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

    En el ejemplo anterior, FILEPATH es la ruta de acceso al archivo de configuración de credenciales.

    La asistencia para la federación de Workload Identity en la CLI de gcloud está disponible en la versión 363.0.0 y posteriores de la CLI de gcloud.

    Terraform

    El proveedor de Google Cloud admite la federación de Workload Identity 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 mediante la federación de Workload Identity, 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
    

    FILEPATH en ambos casos es la ruta de acceso al archivo de configuración de la credencial.

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

    bq

    Para autenticar con la federación de Workload Identity, usa el comando gcloud auth login:

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

    En el ejemplo anterior, FILEPATH es 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.

Autentica mediante la API de REST

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

  1. Obtén credenciales de tu proveedor de identidad 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 También se admiten extremos regionales.
    • 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():
        # 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.

    Acciones de GitHub

    Usa google-github-actions/auth para obtener un token de ID de GitHub y, luego, intercambiarlo con un token de acceso de corta duración:

    • Para permitir que el trabajo recupere un token de ID de GitHub, agrega la siguiente configuración:

      permissions:
        id-token: write
        contents: read
      
    • Agrega un paso para generar un token de acceso y hacer que esté disponible en una variable ${{ steps.auth.outputs.access_token }}:

      - id: 'auth'
        name: 'Authenticate to Google Cloud'
        uses: 'google-github-actions/auth@v0.3.1'
        with:
          token_format: 'access_token'
          workload_identity_provider: 'projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID'
          service_account: 'SERVICE_ACCOUNT_EMAIL'
      

    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.
    • SERVICE_ACCOUNT_EMAIL: Es la dirección de correo electrónico de la cuenta de servicio.

    Ejemplo:

    jobs:
      build:
        # Allow the job to fetch a GitHub ID token
        permissions:
          id-token: write
          contents: read
    
        runs-on: ubuntu-latest
    
        steps:
          - uses: actions/checkout@v2
    
          - id: 'auth'
            name: 'Authenticate to Google Cloud'
            uses: 'google-github-actions/auth@v0.3.1'
            with:
              token_format: 'access_token'
              workload_identity_provider: 'projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID'
              service_account: 'SERVICE_ACCOUNT_EMAIL'
    

    Omite los siguientes pasos.

    OIDC

    Obtén un token de tu proveedor de identidad externo y, luego, inicializa las siguientes variables:

    Bash

    SUBJECT_TOKEN_TYPE="urn:ietf:params:oauth:token-type:jwt"
    SUBJECT_TOKEN=TOKEN
    

    PowerShell

    $SubjectTokenType = "urn:ietf:params:oauth:token-type:jwt"
    $SubjectToken = "TOKEN"
    

    En el ejemplo anterior, TOKEN es el token emitido por tu proveedor de identidad externo.

    OIDC (AD FS)

    Usa los siguientes comandos de PowerShell para autenticarte en AD FS mediante IWA y obtén un token de acceso:

    $SubjectTokenType = "urn:ietf:params:oauth:token-type:jwt"
    $SubjectToken = (Invoke-RestMethod `
        -Uri "https://ADFS_DOMAIN/adfs/oauth2/token/" `
        -Method POST `
        -Body @{
            client_id = 'CLIENT_ID'
            grant_type = 'client_credentials'
            scope = 'openid'
            resource = 'RELYING_PARTY_ID'
            use_windows_client_authentication = 'true'
            } `
        -Credential USER).access_token
    

    Reemplaza los siguientes valores:

    • ADFS_DOMAIN: Nombre de dominio público del servidor o la granja de AD FS.
    • CLIENT_ID: ID de cliente del registro de la aplicación en AD FS.
    • RELYING_PARTY_ID: Identificador de parte confiable que usaste cuando creaste una aplicación de API web para el grupo de Workload Identity en AD FS. Solo necesitas este parámetro si usas un identificador de relación de confianza personalizado.
    • USER: Es el usuario de Active Directory que se usará para IWA. Como alternativa, reemplaza -Credential por -UseDefaultCredentials para usar tus credenciales actuales.

    SAML

    Obtén una aserción de tu proveedor de identidad externo e inicializa una variable:

    Bash

    SUBJECT_TOKEN_TYPE="urn:ietf:params:oauth:token-type:saml2"
    SUBJECT_TOKEN=ASSERTION
    

    PowerShell

    $SubjectTokenType = "urn:ietf:params:oauth:token-type:saml2"
    $SubjectToken = "ASSERTION"
    

    En el ejemplo anterior, ASSERTION es la aserción codificada en base64 que emite tu proveedor de identidad externo.

  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 -0 -X POST https://sts.googleapis.com/v1/token \
        -H 'Content-Type: text/json; charset=utf-8' \
        -d @- <<EOF | jq -r .access_token
        {
            "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"   : "$SUBJECT_TOKEN_TYPE",
            "subjectToken"       : "$SUBJECT_TOKEN"
        }
    EOF
    )
    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.

Verificación de credenciales externas

La API del servicio de tokens de seguridad usa los siguientes pasos para validar las credenciales emitidas por un proveedor de identidad externo.

AWS

  • Verifica los siguientes campos en el token GetCallerIdentity:

    • El url debe ser un URI de HTTPS con un nombre de host igual a sts.amazonaws.com (o subdominio regional) y sin puerto. Están exactos los siguientes parámetros de consulta:
      • action = getcalleridentity
      • version (cualquier valor)
    • El method es POST.
    • Estas son exactamente las siguientes headers: x-amz-date, authorization, host, x-goog-cloud-target-resource, x-amz-security-token (opcional)
      • El valor de x-goog-cloud-target-resource es el nombre del recurso para el proveedor del grupo de Workload Identity.
      • El valor de x-amz-date es de 15 minutos como máximo y no en el futuro.
  • Ejecuta la solicitud en sts.amazonaws.com o en el subdominio regional relevante y verifica que el resultado sea correcto y que el ID de la cuenta de AWS coincida con el ID de la cuenta configurado para el proveedor del grupo de Workload Identity.

Azure

Los tokens de Azure son tokens de OIDC y se verifican de la misma manera que los tokens de OIDC.

Acciones de GitHub

Los tokens de OIDC son tokens de OIDC y se verifican de la misma manera que los tokens de OIDC.

OIDC

Los tokens de OIDC se verifican según la especificación de OIDC. En específico, el servicio de tokens de seguridad ejecuta los siguientes pasos:

  • Verificación de documentos y firmas de descubrimiento:

    • Para construir el URI del extremo de descubrimiento, agrega /.well-known/openid-configuration al emisor configurado en el proveedor de grupos de Workload Identity y recupera el documento de descubrimiento de OIDC.
    • Verifica que la reclamación issuer en el documento de descubrimiento sea igual al emisor configurado en el proveedor de grupo de Workload Identity. STS tiene una lógica de verificación personalizada para los siguientes emisores que no cumplen con la especificación de OIDC:
      • Oracle Cloud (https://*.identity.oraclecloud.com)
      • Microsoft (https://login.microsoftonline.com/common/v2.0, https://login.microsoftonline.com/consumers/v2.0, https://login.microsoftonline.com/organizations/v2.0)
    • Recupera el conjunto de claves web JSON (JWKS) de jwks_uri que se enumera en el documento de descubrimiento.
    • Si hay una reclamación kid en el encabezado JWT, verifica la firma de JWT con la clave del JWKS con el ID de clave coincidente o rechaza el token si no se encuentra una clave coincidente. Si no hay ninguna reclamación kid presente en el encabezado JWT, intenta verificar la firma JWT con cada clave enumerada en el JWKS. La firma se acepta si se puede usar alguna clave para verificar la firma.
  • Verificación del encabezado:

    • Una reclamación alg debe estar presente y ser igual a RS256 o ES256.
  • Verificación de carga útil:

    • Una reclamación iss debe estar presente y ser igual a la reclamación issuer en el documento de descubrimiento. STS tiene una lógica de verificación personalizada para los siguientes emisores que no cumplen con la especificación de OIDC:
      • Oracle Cloud (https://*.identity.oraclecloud.com)
      • Microsoft (https://login.microsoftonline.com/common/v2.0, https://login.microsoftonline.com/consumers/v2.0, https://login.microsoftonline.com/organizations/v2.0)
    • Una reclamación aud debe estar presente y es igual a https://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID. Si se configuran allowed_Audiences alternativas, la reclamación aud debe ser igual a uno de esos valores.
    • Debe haber una reclamación exp presente y futura
    • Una reclamación iat debe estar presente y es anterior al actual
    • El valor de exp debe ser mayor que el de iat en 24 horas como máximo.

SAML

  • Decodifica en Base64 y desmarca la credencial de SAML en un objeto Response o Assertion.
  • Si la credencial SAML se deserializa en un objeto Response, verifica lo siguiente:

    • El StatusCode de respuesta es igual a urn:oasis:names:tc:SAML:2.0:status:Success.
    • Exactamente una Assertion presente.
    • Al menos uno de los elementos Response o Assertion está firmado. Para cada firma, intenta verificar la firma con cada certificado X.509 configurado en el proveedor del grupo de Workload Identity. La firma se acepta si alguno de los certificados verifica correctamente la firma.
    • Si la Response está firmada, el Issuer de la Response debe estar presente y ser igual al ID de la entidad del proveedor de identidad SAML configurado en el proveedor de grupos de Workload Identity. Verifica también que Format se omita o sea igual a urn:oasis:names:tc:SAML:2.0:nameid-format:entity.
  • Si la credencial SAML se deserializa en un objeto Assertion, verifica lo siguiente:

    • El Assertion está firmado. Para cada firma, intenta verificar la firma con cada certificado X.509 configurado en el proveedor de grupo de Workload Identity. La firma se acepta si alguno de los certificados verifica correctamente la firma.
  • Sin importar si la credencial de SAML se deserializó en un objeto Response o Assertion, verifica que Assertion contenga los siguientes atributos:

    • Debe haber un Issuer que sea igual al ID de entidad del proveedor de identidad SAML configurado en el proveedor de grupos de Workload Identity. El Format de Issuer se omite o tiene un valor igual a urn:oasis:names:tc:SAML:2.0:nameid-format:entity.
    • Un valor IssueInstant debe estar presente y hace menos de 1 hora en el pasado.
    • Un Subject debe estar presente y contener los siguientes atributos:
      • Debe estar presente un NameID.
      • Exactamente una SubjectConfirmation debe estar presente y tener un Method igual a urn:oasis:names:tc:SAML:2.0:cm:bearer. Debe estar presente un NotOnOrAfter en el SubjectConfirmationData y está en el futuro.
      • Un NotBefore no está presente.
    • Un Conditions debe estar presente y contener los siguientes atributos:
      • Si hay un NotBefore, debe ser anterior.
      • Si hay un NotOnOrAfter, debe ser en el futuro.
      • Debe haber al menos un AudienceRestriction presente. Todas las AudienceRestriction deben contener un Audience igual al nombre del recurso del proveedor de grupos de Workload Identity.
    • Debe haber al menos un AuthnStatement presente.
    • Si hay SessionNotOnOrAfter, todas deben estar en el futuro.

Además de los pasos de verificación específicos del protocolo anteriores, la API del servicio de token de seguridad también verifica que se cumpla la condición del atributo.

¿Qué sigue?