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:
- Obtén una credencial del proveedor de identidad de confianza.
- Intercambia la credencial por un token del servicio de tokens de seguridad.
- 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
Habilita las API de IAM, Security Token Service, and Service Account Credentials.
Debes federar con un proveedor de identidad externo mediante la creación de un grupo y un proveedor de Workload Identity.
Crea una cuenta de servicio en la que desees que actúen en nombre de identidades externas.
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 personalizadoattribute.NAME
. - Para todas las identidades externas del grupo de Workload Identity, no uses una condición de atributo.
Consola
En la consola de Google Cloud, ve a la página Grupos de Workload Identity.
Busca el grupo de Workload Identity que deseas actualizar y haz clic en él.
Haz clic en
Grant access.En la lista desplegable Cuenta de servicio, selecciona la cuenta de servicio en cuyo nombre actuarán las identidades externas.
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 comosubject
y el Valor del atributo al valor del reclamosub
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.
Haz clic en Guardar.
Haz clic en Descartar.
gcloud
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 agoogle.subject
.GROUP
: Es el valor esperado para el atributo que asignaste agoogle.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\)
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 deexpiration_time
. El campoexpiration_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 sonurn:ietf:params:oauth:token-type:id_token
yurn: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 como1
.
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 deexpiration_time
. El campoexpiration_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 serurn: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 como1
.
Sigue estos pasos a fin de permitir que las bibliotecas cliente o Terraform usen la federación de Workload Identity para autenticarse:
Crea un archivo de configuración de credenciales:
Console
Descarga un archivo de configuración de credenciales en la consola de Google Cloud:
En la consola de Google Cloud, ve a la página Grupos de Workload Identity.
Busca el grupo de Workload Identity que contiene el proveedor de identidad que deseas usar y haz clic en él.
Selecciona Cuentas de servicio conectadas.
Busca la cuenta de servicio que quieras usar y haz clic en
Descargar.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.
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
).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ónconstraints/iam.allowServiceAccountCredentialLifetimeExtension
.FILEPATH
: Es el archivo para guardar la configuración.
Si usas AWS IMDSv2, se debe agregar una marca adicional
--enable-imdsv2
al comandogcloud 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ónconstraints/iam.allowServiceAccountCredentialLifetimeExtension
.APPLICATION_ID_URI
: Es el URI de ID de aplicación de la aplicación de AzureFILEPATH
: 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ónconstraints/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 OIDCSOURCE_TYPE
: Es el formato del archivo de token de ID de OIDC, configurado comotext
(predeterminado) ojson
.FIELD_NAME
: Es el campo en el archivo de texto que contiene el token (siSOURCE_TYPE
esjson
).
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ónconstraints/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 aTOKEN_URL
.SOURCE_TYPE
: Es el formato del archivo de token de ID de OIDC, configurado comotext
(predeterminado) ojson
.FIELD_NAME
: Es el campo en el archivo de texto que contiene el token (siSOURCE_TYPE
esjson
).
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 IdentityPROVIDER_ID
: El ID del proveedor de grupos de Workload IdentitySERVICE_ACCOUNT_EMAIL
: La dirección de correo electrónico de la cuenta de servicioSERVICE_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ónconstraints/iam.allowServiceAccountCredentialLifetimeExtension
.FILEPATH
: El archivo en el que se guardará la configuraciónEXECUTABLE_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ónconstraints/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ónconstraints/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 SAMLSOURCE_TYPE
: Es el formato del archivo de aserción de SAML, comotext
(predeterminado) ojson
.FIELD_NAME
: Es el campo en el archivo de texto que contiene la aserción (siSOURCE_TYPE
esjson
)
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ónconstraints/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 aTOKEN_URL
.SOURCE_TYPE
: Es el formato del archivo de aserción de SAML, comotext
(predeterminado) ojson
.FIELD_NAME
: Es el campo en el archivo de texto que contiene la aserción (siSOURCE_TYPE
esjson
)
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ónconstraints/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'
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óngoogle-github-actions/auth
inicializaGOOGLE_APPLICATION_CREDENTIALS
de forma automática.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 agrpc::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 queGoogleAuth
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 elREADME
del paquetegoogle-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 paquetegoogle-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:
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 paraGetCallerIdentity()
, con el cuerpo de una solicitudGetCallerIdentity()
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 campourl
; 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 prefijohttps:
. 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: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 tokenGetCallerIdentity
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.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.
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 asts.amazonaws.com
(o subdominio regional) y sin puerto. Están exactos los siguientes parámetros de consulta:action
=getcalleridentity
version
(cualquier valor)
- El
method
esPOST
. - 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.
- El valor de
- El
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
)
- Oracle Cloud (
- 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ónkid
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.
- Para construir el URI del extremo de descubrimiento, agrega
Verificación del encabezado:
- Una reclamación
alg
debe estar presente y ser igual aRS256
oES256
.
- Una reclamación
Verificación de carga útil:
- Una reclamación
iss
debe estar presente y ser igual a la reclamaciónissuer
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
)
- Oracle Cloud (
- Una reclamación
aud
debe estar presente y es igual ahttps://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID
. Si se configuran allowed_Audiences alternativas, la reclamaciónaud
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 deiat
en 24 horas como máximo.
- Una reclamación
SAML
- Decodifica en Base64 y desmarca la credencial de SAML en un objeto
Response
oAssertion
. 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
oAssertion
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, elIssuer
de laResponse
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 queFormat
se omita o sea igual aurn:oasis:names:tc:SAML:2.0:nameid-format:entity
.
- El StatusCode de respuesta es igual a
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.
- El
Sin importar si la credencial de SAML se deserializó en un objeto
Response
oAssertion
, verifica queAssertion
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. ElFormat
deIssuer
se omite o tiene un valor igual aurn: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 unMethod
igual aurn:oasis:names:tc:SAML:2.0:cm:bearer
. Debe estar presente unNotOnOrAfter
en elSubjectConfirmationData
y está en el futuro. - Un
NotBefore
no está presente.
- Debe estar presente un
- 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 lasAudienceRestriction
deben contener unAudience
igual al nombre del recurso del proveedor de grupos de Workload Identity.
- Si hay un
- Debe haber al menos un
AuthnStatement
presente. - Si hay
SessionNotOnOrAfter
, todas deben estar en el futuro.
- Debe haber un
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?
- Obtén más información para configurar la federación de Workload Identity.
- Obtén más información sobre la federación de Workload Identity.
- Consulta cómo puedes administrar grupos y proveedores de Workload Identity.