En esta guía, se describe cómo usar la federación de Workload Identity para permitir que las cargas de trabajo de AWS y Azure se autentiquen en Google Cloud sin una clave de cuenta de servicio.
Mediante la federación de Workload Identity, las cargas de trabajo que se ejecutan en AWS EC2 y Azure pueden intercambiar sus credenciales específicas del entorno por tokens del servicio de tokens de seguridad de Google Cloud de corta duración.
Las credenciales específicas del entorno incluyen lo siguiente:
- Las instancias de AWS EC2 pueden usar perfiles de instancia para solicitar credenciales temporales.
- Las VMs de Azure pueden usar identidades administradas para obtener tokens de acceso de Azure.
Si configuras la federación de Workload Identity, puedes permitir que estas cargas de trabajo intercambien estas credenciales específicas del entorno por credenciales de corta duración de Google Cloud. Las cargas de trabajo pueden usar estas credenciales de corta duración para acceder a las APIs de Google Cloud.
Antes de comenzar
Configura la autenticación.
Select the tab for how you plan to use the samples on this page:
Console
When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.
gcloud
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
Python
Para usar las muestras de Python de esta página en un entorno de desarrollo local, instala e inicializa gcloud CLI y, luego, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
If you're using a local shell, then create local authentication credentials for your user account:
gcloud auth application-default login
You don't need to do this if you're using Cloud Shell.
Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local en la documentación de autenticación de Google Cloud.
Prepara tu proveedor de identidad externo
Solo debes realizar estos pasos una vez para cada usuario de Azure AD o cuenta de AWS.
AWS
No es necesario que realices ningún cambio de configuración en la cuenta de AWS.
Después de configurar un grupo de Workload Identity para que confíe en tu cuenta de AWS, puedes dejar que los usuarios de AWS y los roles de AWS usen credenciales de seguridad de AWS permanentes o temporales para obtener credenciales de Google Cloud de corta duración.
Azure
Debes crear una aplicación de Azure AD nueva en tu usuario de Azure AD y configurarla para que pueda usarse en la federación de Workload Identity.
Después de configurar un grupo de Workload Identity para que confíe en la aplicación, los usuarios y los principales de servicio de Azure pueden solicitar tokens de acceso para esta aplicación y, luego, intercambiarlos con las credenciales de Google Cloud de corta duración.
Para crear la aplicación, haz lo siguiente:
Crea una aplicación y un principal del servicio de Azure AD.
Configura un URI de ID de aplicación para la aplicación. Puedes usar el URI del ID de aplicación predeterminado (
APPID
) o especificar un URI personalizado.Necesitarás el URI de ID de aplicación más adelante cuando configures el proveedor de grupo de Workload Identity.
A fin de permitir que una aplicación obtenga tokens de acceso para la aplicación de Azure AD, puedes usar las identidades administradas:
Crea una identidad administrada. Toma nota del ID de objeto de la identidad administrada. La necesitarás más adelante cuando configures el robo de identidad.
Asigna la identidad administrada a una máquina virtual o a otro recurso que ejecute tu aplicación.
Configura la federación de Workload Identity
Solo debes realizar estos pasos una vez por cuenta de AWS o usuario de Azure AD. Luego, puedes usar el mismo grupo y proveedor de Workload Identity para varias cargas de trabajo y en varios proyectos de Google Cloud.
Para comenzar a configurar la federación de Workload Identity, haz lo siguiente:
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Es mejor usar un proyecto exclusivo para administrar los grupos y los proveedores de identidades para cargas de trabajo.
-
Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.
Enable the IAM, Resource Manager, Service Account Credentials, and Security Token Service APIs.
Define una condición y la asignación de atributos
Las credenciales específicas del entorno de la carga de trabajo de AWS o Azure contienen varios atributos, y debes decidir qué atributo deseas usar como identificador de asunto (
google.subject
) en Google Cloud.Google Cloud usa el identificador de asunto en los registros de auditoría de Cloud y en los identificadores principales para identificar de forma única a un usuario o rol de AWS o Azure.
De manera opcional, puedes mapear atributos adicionales. Luego, puedes hacer referencia a estos atributos adicionales cuando otorgues acceso a los recursos.
AWS
Las asignaciones de atributos pueden usar los campos de respuesta para
GetCallerIdentity
como atributos de origen. Estos campos incluyen lo siguiente:account
: el número de cuenta de AWS.arn
: el ARN de AWS de la entidad externa.userid
: el identificador único de la entidad que realiza la llamada.
Si tu aplicación se ejecuta en una instancia de Amazon Elastic Compute Cloud (EC2) con una función adjunta, puedes usar la siguiente asignación de atributos:
google.subject=assertion.arn attribute.account=assertion.account attribute.aws_role=assertion.arn.extract('assumed-role/{role}/') attribute.aws_ec2_instance=assertion.arn.extract('assumed-role/{role_and_session}').extract('/{session}')
La asignación realiza lo siguiente:
- Usa el ARN como identificador de asunto, por ejemplo:
"arn:aws:sts::000000000000:assumed-role/ec2-my-role/i-00000000000000000
- Presenta un atributo personalizado
account
y le asigna el ID de cuenta de AWS. - Presenta un atributo personalizado
aws_role
y le asigna el nombre del rol de AWS, por ejemplo:ec2-my-role
. - Presenta un atributo personalizado
aws_ec2_instance
y le asigna el ID de instancia de EC2, por ejemplo:i-00000000000000000
.
Mediante esta asignación, puedes otorgar acceso a lo siguiente:
Una instancia EC2 específica:
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.aws_ec2_instance/EC2_INSTANCE_ID
Todos los usuarios y las instancias de un rol:
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.aws_role/ROLE_NAME
Azure
Las asignaciones de atributos pueden usar las reclamaciones incorporadas en los tokens de acceso de Azure, incluidas las reclamaciones personalizadas, como atributos de origen. En la mayoría de los casos, es mejor usar la reclamación
sub
como identificador de asunto:google.subject=assertion.sub
Para un token de acceso emitido a una identidad administrada, la reclamación
sub
contiene el ID de objeto de la identidad administrada. Si usas otra reclamación, asegúrate de que sea única y no se pueda reasignar.Si no estás seguro de la lista de reclamaciones a las que puedes hacer referencia, haz lo siguiente:
Conéctate a una VM de Azure que tenga una identidad administrada asignada.
Obtén un token de acceso de Azure Instance Metadata Service (IMDS):
Bash
curl \ "http://169.254.169.254/metadata/identity/oauth2/token?resource=APP_ID_URI&api-version=2018-02-01" \ -H "Metadata: true" | jq -r .access_token
Este comando usa la herramienta de
jq
.jq
está disponible de forma predeterminada en Cloud Shell.PowerShell
$SubjectTokenType = "urn:ietf:params:oauth:token-type:jwt" $SubjectToken = (Invoke-RestMethod ` -Uri "http://169.254.169.254/metadata/identity/oauth2/token?resource=APP_ID_URI&api-version=2018-02-01" ` -Headers @{Metadata="true"}).access_token Write-Host $SubjectToken
Reemplaza
APP_ID_URI
por el URI de ID de aplicación de la aplicación que configuraste para la federación de Workload Identity.En un navegador web, ve a
https://jwt.ms/
y pega el token de acceso en el campo.Haz clic en Reclamaciones para ver la lista de reclamaciones incorporadas en el token de acceso.
En el caso de las identidades de servicio, por lo general, no es necesario crear una asignación para
google.groups
o ningún atributo personalizado.De manera opcional, puedes definir una condición de atributo. Las condiciones de los atributos son expresiones CEL que pueden verificar los atributos de aserción y los atributos de destino. Si la condición del atributo se evalúa como
true
para una credencial determinada, se acepta la credencial. De lo contrario, se rechaza la credencial.AWS
Puedes usar una condición de atributo a fin de restringir qué usuarios y roles de IAM pueden usar la federación de Workload Identity para obtener tokens de Google Cloud de corta duración.
Por ejemplo, la siguiente condición restringe el acceso a los roles de AWS y no permite otros identificadores de IAM:
assertion.arn.startsWith('arn:aws:sts::AWS_ACCOUNT_ID:assumed-role/')
Azure
Puedes usar una condición de atributo a fin de restringir qué usuarios y principales de servicio pueden usar la federación de Workload Identity para obtener tokens de Google Cloud de corta duración. Como alternativa, puedes configurar tu aplicación de Azure AD para que use asignaciones de roles de la aplicación.
Crea el proveedor y el grupo de Workload Identity
Roles obligatorios
Para obtener los permisos que necesitas para configurar la federación de Workload Identity, pídele a tu administrador que te otorgue los siguientes roles de IAM en el proyecto:
-
Administrador de grupos de Workload Identity (
roles/iam.workloadIdentityPoolAdmin
) -
Administrador de cuenta de servicio (
roles/iam.serviceAccountAdmin
)
Si quieres obtener más información para otorgar roles, consulta Administra el acceso.
También puedes obtener los permisos necesarios a través de roles personalizados o cualquier otro rol predefinido.
De manera alternativa, el rol básico de propietario de IAM (roles/owner
) también incluye permisos para configurar la federación de identidades. No deberías otorgar funciones básicas en un entorno de producción, pero puedes otorgarlas en un entorno de desarrollo o de prueba.Ya recopilaste toda la información que necesitas para crear un grupo y proveedor de Workload Identity:
Consola
En la consola de Google Cloud, ve a la página Proveedor y grupo de cargas de trabajo nuevos.
En la sección Crear un grupo de identidades, ingresa lo siguiente:
- Nombre: Es el nombre del grupo. El nombre también se usa como el ID del grupo. No puedes cambiar el ID del grupo más adelante.
- Descripción: Es el texto que describe el propósito del grupo.
Haz clic en Continuar.
Establece la configuración del proveedor:
AWS
Establece la siguiente configuración del proveedor:
- Selecciona un proveedor: AWS.
- Nombre del proveedor: nombre para el proveedor. El nombre también se usa como el ID del proveedor. No puedes cambiar el ID del proveedor más adelante.
Azure
Establece la siguiente configuración del proveedor:
- Selecciona un proveedor: OpenID Connect (OIDC).
- Nombre del proveedor: nombre para el proveedor. El nombre también se usa como el ID del proveedor. No puedes cambiar el ID del proveedor más adelante.
- URL del emisor:
https://sts.windows.net/TENANT_ID
. ReemplazaTENANT_ID
por el ID de usuario (GUID) de tu usuario de Azure AD. - Público permitido: URI de ID de aplicación que usaste cuando registraste la aplicación en Azure AD.
Haz clic en Continuar.
En la sección Configurar atributos de proveedores, agrega las asignaciones de atributos que identificaste antes.
En la sección Condiciones de atributos, ingresa la condición de atributo que identificaste antes. Deja el campo en blanco si no tienes una condición de atributo.
Haz clic en Guardar para crear el proveedor y el grupo de Workload Identity.
gcloud
Crea un nuevo grupo de identidades para cargas de trabajo:
gcloud iam workload-identity-pools create POOL_ID \ --location="global" \ --description="DESCRIPTION" \ --display-name="DISPLAY_NAME"
Reemplaza lo siguiente:
POOL_ID
: el ID único para el grupo.DISPLAY_NAME
: el nombre del grupo.DESCRIPTION
: la descripción del grupo. Esta descripción aparece cuando se otorga acceso a identidades de grupo.
Agrega un proveedor de grupos de Workload Identity:
AWS
A fin de crear el proveedor de grupos de Workload Identity para AWS, ejecuta el siguiente comando:
gcloud iam workload-identity-pools providers create-aws PROVIDER_ID \ --location="global" \ --workload-identity-pool="POOL_ID" \ --account-id="ACCOUNT_ID" \ --attribute-mapping="MAPPINGS" \ --attribute-condition="CONDITIONS"
Reemplaza lo siguiente:
PROVIDER_ID
: el ID único para el proveedor.POOL_ID
: el ID del grupo.ACCOUNT_ID
: Es un número de 12 dígitos que identifica tu cuenta de AWS.MAPPINGS
: Es la lista separada por comas de las asignaciones de atributos que identificaste antes.CONDITIONS
: Es la condición de atributo que identificaste antes. Quita el parámetro si no tienes una condición de atributo.
Ejemplo:
gcloud iam workload-identity-pools providers create-aws example-provider \ --location="global" \ --workload-identity-pool="pool-1" \ --account-id="123456789000" \ --attribute-mapping="google.subject=assertion.arn"
Azure
Si deseas crear el proveedor de grupos de Workload Identity para Azure, ejecuta el siguiente comando:
gcloud iam workload-identity-pools providers create-oidc PROVIDER_ID \ --location="global" \ --workload-identity-pool="POOL_ID" \ --issuer-uri="ISSUER_URI" \ --allowed-audiences="APPLICATION_ID_URI" \ --attribute-mapping="MAPPINGS" \ --attribute-condition="CONDITIONS"
Reemplaza lo siguiente:
PROVIDER_ID
: el ID único para el proveedor.POOL_ID
: el ID del grupo.ISSUER_URI
: El ID de usuario (GUID) de tu usuario de Azure AD, a veces con formatohttps://sts.windows.net/TENANT_ID
. El URI del emisor puede variar, y para encontrar el URI de la entidad emisora, puedes depurar tu JWT con JWT.io.APPLICATION_ID_URI
: URI de ID de aplicación que usaste cuando registraste la aplicación en Azure AD.MAPPINGS
: Es la lista separada por comas de las asignaciones de atributos que identificaste antes.CONDITIONS
: (Opcional) Es la condición de atributo que identificaste antes.
Ejemplo:
gcloud iam workload-identity-pools providers create-oidc example-provider \ --location="global" \ --workload-identity-pool="pool-1" \ --issuer-uri="https://sts.windows.net/00000000-1111-2222-3333-444444444444" \ --allowed-audiences="api://my-app" \ --attribute-mapping="google.subject=assertion.sub,google.groups=assertion.groups"
Autentica una carga de trabajo
Debes realizar estos pasos una vez por carga de trabajo.
Permite que tu carga de trabajo externa acceda a los recursos de Google Cloud
Para proporcionar a tu carga de trabajo acceso a los recursos de Google Cloud, te recomendamos que otorgues acceso directo a los recursos al principal. En este caso, la principal es el usuario federado. Algunos productos de Google Cloud tienen limitaciones de las APIs de Google Cloud. Si tu carga de trabajo llama a un extremo de API que tiene una limitación, puedes usar la identidad temporal como cuenta de servicio. En este caso, la principal es la cuenta de servicio de Google Cloud, que actúa como la identidad. Debes otorgar acceso a la cuenta de servicio en el recurso.
Acceso directo a recursos
Puedes otorgar acceso a una identidad federada directamente en los recursos mediante la consola de Google Cloud o la CLI de gcloud.
Console
Para usar la consola de Google Cloud para otorgar roles de IAM directamente en un recurso, debes ir a la página del recurso y, luego, otorgar el rol. En el siguiente ejemplo, se muestra cómo ir a la página de Cloud Storage y otorgar el rol de visualizador de objetos de almacenamiento (
roles/storage.objectViewer
) a una identidad federada directamente en un bucket de Cloud Storage.- En la consola de Google Cloud, ve a la página Buckets de Cloud Storage.
En la lista de buckets, haz clic en el nombre del bucket para el que deseas otorgar el rol.
Elige la pestaña Permisos cerca de la parte superior de la página.
Haz clic en el botón add_box Otorgar acceso.
Aparecerá el cuadro de diálogo Agregar principales.
En el campo Nuevas principales, ingresa una o más identidades que necesiten acceso a tu bucket.
Por tema
principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT
Reemplaza lo siguiente:
PROJECT_NUMBER
: el número del proyectoPOOL_ID
: el ID del grupo de cargas de trabajoSUBJECT
: el asunto individual asignado desde tu IdP, por ejemplo,administrator@example.com
Por grupo
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP
Reemplaza lo siguiente:
PROJECT_NUMBER
: el número del proyectoWORKLOAD_POOL_ID
: el ID del grupo de cargas de trabajoGROUP
: el grupo asignado desde tu IdP, por ejemplo:administrator-group@example.com
Por atributo
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE
Reemplaza lo siguiente:
PROJECT_NUMBER
: el número del proyectoWORKLOAD_POOL_ID
: el ID del grupo de cargas de trabajoATTRIBUTE_NAME
: uno de los atributos que se asignó a partir de tu IdPATTRIBUTE_VALUE
: el valor del atributo.
Elige un rol (o roles) del menú desplegable Selecciona un rol. Los roles que seleccionas aparecen en el panel con una descripción breve del permiso que otorgan.
Haz clic en Guardar.
gcloud
Para usar la CLI de gcloud para otorgar roles de IAM en un recurso en un proyecto, haz lo siguiente:
Obtén el número del proyecto en el que se define el recurso.
gcloud projects describe $(gcloud config get-value core/project) --format=value\(projectNumber\)
Otorga el acceso al recurso.
Para usar la CLI de gcloud a fin de otorgar el rol de usuario de Workload Identity (
roles/iam.workloadIdentityUser
) a identidades externas que cumplan con ciertos criterios, ejecuta el siguiente comando.Por tema
gcloud storage buckets add-iam-policy-binding BUCKET_ID \ --role=roles/storage.objectViewer \ --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT"
Por grupo
gcloud storage buckets add-iam-policy-binding BUCKET_ID \ --role=roles/storage.objectViewer \ --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP"
Por atributo
gcloud storage buckets add-iam-policy-binding BUCKET_ID \ --role=roles/storage.objectViewer \ --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE"
Reemplaza lo siguiente:
BUCKET_ID
: el bucket en el que se otorga accesoPROJECT_NUMBER
: el número del proyecto que contiene el grupo de Workload Identity.POOL_ID
: el ID del grupo de identidades para cargas de trabajoSUBJECT
: el valor esperado para el atributo que asignaste agoogle.subject
GROUP
: el valor esperado para el atributo que asignaste agoogle.groups
ATTRIBUTE_NAME
: el nombre de un atributo personalizado en la asignación de atributosATTRIBUTE_VALUE
: el valor del atributo personalizado en la asignación de atributos
Puedes otorgar roles en cualquier recurso de Google Cloud que admita políticas de permisos de IAM.
Uso de identidad temporal como cuenta de servicio
Para crear una cuenta de servicio para la carga de trabajo externa, haz lo siguiente:
Enable the IAM, Security Token Service, and Service Account Credentials APIs.
Crea una cuenta de servicio que represente la carga de trabajo. Es mejor usar una cuenta de servicio dedicada para cada carga de trabajo.
No es necesario que la cuenta de servicio esté en el mismo proyecto que el grupo de identidades para cargas de trabajo.
Otorga acceso a la cuenta de servicio a los recursos a los que deseas que accedan las identidades externas.
Otorga el rol de usuario de Workload Identity (
roles/iam.workloadIdentityUser
) a la cuenta de servicio:Crea una cuenta de servicio que represente la carga de trabajo. Te recomendamos que uses una cuenta de servicio dedicada para cada carga de trabajo.
No es necesario que la cuenta de servicio esté en el mismo proyecto que el grupo de Workload Identity, pero debes consultar el proyecto que contiene la cuenta de servicio.
Para otorgar acceso a una identidad federada mediante la identidad temporal como cuenta de servicio mediante la consola de Google Cloud o la CLI de gcloud, haz lo siguiente:
Console
Para usar la consola de Google Cloud para otorgar roles de IAM a una identidad federada con una cuenta de servicio, haz lo siguiente:
Para crear una cuenta de servicio que sirva como la identidad que se usará, haz lo siguiente:
Enable the IAM, Security Token Service, and Service Account Credentials APIs.
Crea una cuenta de servicio que represente la identidad de la carga de trabajo. Te recomendamos que uses una cuenta de servicio dedicada para cada carga de trabajo.
No es necesario que la cuenta de servicio esté en el mismo proyecto que el grupo de Workload Identity, pero cuando otorgas acceso a IAM, debes hacer referencia al proyecto que contiene la cuenta de servicio.
Otorga acceso a la cuenta de servicio a los recursos a los que deseas que accedan las identidades externas.
Para otorgar acceso mediante la identidad temporal como cuenta de servicio, haz lo siguiente.
Ve a la página Grupos de Workload Identity.
Selecciona Otorgar acceso.
En el cuadro de diálogo Otorgar acceso a la cuenta de servicio, selecciona Otorgar acceso mediante la identidad temporal como cuenta de servicio.
En la lista Cuentas de servicio, selecciona la cuenta de servicio para las identidades externas que actuarán en nombre de ella y haz lo siguiente:
Para elegir qué identidades en el grupo pueden actuar en nombre de la cuenta de servicio, realiza una de las siguientes acciones:
Para permitir que solo las identidades específicas del grupo de identidades para cargas de trabajo actúen en nombre de la cuenta de servicio, selecciona Solo identidades que coinciden con el filtro.
En la lista Nombre del atributo, selecciona el atributo que deseas filtrar.
En el campo Valor del atributo, ingresa el valor esperado del atributo; por ejemplo, si usas una asignación de atributos
google.subject=assertion.sub
, establece el nombre del atributo ensubject
y el valor del atributo en el valor de la declaraciónsub
en los tokens que emite tu proveedor de identidad externo.
Para guardar la configuración, haz clic en Guardar y, luego, en Descartar.
gcloud
Para usar la CLI de gcloud a fin de otorgar el rol de usuario de Workload Identity (
roles/iam.workloadIdentityUser
) a identidades externas que cumplan con ciertos criterios, ejecuta el siguiente comando.Por tema
gcloud storage buckets add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \ --role=roles/storage.objectViewer \ --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT"
Por grupo
gcloud storage buckets add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \ --role=roles/storage.objectViewer \ --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP"
Por atributo
gcloud storage buckets add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \ --role=roles/storage.objectViewer \ --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE"
Reemplaza lo siguiente:
SERVICE_ACCOUNT_EMAIL
: La dirección de correo electrónico de la cuenta de servicioPROJECT_NUMBER
: el número del proyecto que contiene el grupo de Workload Identity.POOL_ID
: el ID del grupo de identidades para cargas de trabajoSUBJECT
: el valor esperado para el atributo que asignaste agoogle.subject
GROUP
: el valor esperado para el atributo que asignaste agoogle.groups
ATTRIBUTE_NAME
: el nombre de un atributo personalizado en la asignación de atributosATTRIBUTE_VALUE
: el valor del atributo personalizado en la asignación de atributos
Descarga o crea una configuración de credenciales
Las bibliotecas cliente de Cloud, la CLI de gcloud y Terraform pueden obtener credenciales externas de forma automática y usarlas para actuar en nombre de una cuenta de servicio. Para permitir que las bibliotecas y las herramientas completen este proceso, debes proporcionar un archivo de configuración de credenciales. Este archivo define lo siguiente:
- Dónde obtener credenciales externas
- Qué grupo y proveedor de identidades para cargas de trabajo usar
- Qué cuenta de servicio actuará en nombre de ella
Para crear un archivo de configuración de credenciales, haz lo siguiente:
Console
Para descargar un archivo de configuración de credenciales en la consola de Google Cloud, haz lo siguiente:
En la consola de Google Cloud, ve a la página Grupos de Workload Identity.
Busca el grupo de Workload Identity para el IdP que deseas usar y haz clic en él.
Si eliges usar el acceso directo a recursos, haz lo siguiente:
Haz clic en Otorgar acceso.
Selecciona Otorgar acceso con identidades federadas (recomendado).
Haz clic en Descargar.
Continúa con las instrucciones para configurar tu aplicación, que se encuentra más adelante en este procedimiento.
Si eliges usar la identidad temporal como cuenta de servicio, haz lo siguiente:
Selecciona Cuentas de servicio conectadas.
Busca la cuenta de servicio que quieras usar y haz clic en
Descargar.Continúa con las instrucciones para configurar tu aplicación, que se encuentra más adelante en este procedimiento.
En el cuadro de diálogo Configurar tu aplicación, selecciona el proveedor que contiene las identidades externas.
Proporciona la siguiente configuración adicional:
AWS
No se requiere ninguna configuración adicional.
Azure
URL de ID de aplicación: el URI de ID de aplicación de la aplicación de Azure
Selecciona
Descargar configuración para descargar el archivo de configuración de las credenciales y, luego, haz clic en Descartar.
gcloud
Para crear un archivo de configuración de credenciales mediante
gcloud iam workload-identity-pools create-cred-config
, haz lo siguiente:AWS
Para crear un archivo de configuración de credenciales que permita que la biblioteca obtenga un token de acceso de los metadatos de la instancia de EC2, haz lo siguiente:
gcloud iam workload-identity-pools create-cred-config \ projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \ --service-account=SERVICE_ACCOUNT_EMAIL \ --service-account-token-lifetime-seconds=SERVICE_ACCOUNT_TOKEN_LIFETIME \ --aws \ --output-file=FILEPATH.json
Reemplaza lo siguiente:
PROJECT_NUMBER
: 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
: Si usas la identidad temporal como cuenta de servicio, reemplaza por la dirección de correo electrónico de la cuenta de servicio. Omite esta marca si no usas la identidad temporal como cuenta de servicio.SERVICE_ACCOUNT_TOKEN_LIFETIME
: Si usas la identidad temporal como cuenta de servicio, reemplaza por la vida útil del token de acceso de la cuenta de servicio, en segundos; el valor predeterminado es de una hora cuando no se proporciona. Omite esta marca si no usas la identidad temporal como cuenta de servicio. Para especificar un ciclo de vida de más de una hora, debes configurar la restricción de la política de la organizaciónconstraints/iam.allowServiceAccountCredentialLifetimeExtension
.FILEPATH
: El archivo en el que se guardará la configuración
Si usas AWS IMDSv2, se debe agregar una marca adicional
--enable-imdsv2
al 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
Si no puedes usar el servidor de metadatos de AWS, puedes proporcionar credenciales de seguridad de AWS a través de las siguientes variables de entorno:
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
- Ya sea de
AWS_REGION
oAWS_DEFAULT_REGION
- Opcional:
AWS_SESSION_TOKEN
La CLI de gcloud y las bibliotecas usan estas variables de entorno de AWS cuando el servidor de metadatos de AWS no está disponible.
Azure
Crea un archivo de configuración de credenciales que permita a la biblioteca obtener un token de acceso del Azure Instance Metadata Service (IMDS):
gcloud iam workload-identity-pools create-cred-config \ projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \ --service-account=SERVICE_ACCOUNT_EMAIL \ --service-account-token-lifetime-seconds=SERVICE_ACCOUNT_TOKEN_LIFETIME \ --azure \ --app-id-uri APPLICATION_ID_URI \ --output-file=FILEPATH.json
Reemplaza lo siguiente:
PROJECT_NUMBER
: 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
: Si usas la identidad temporal como cuenta de servicio, reemplaza por la dirección de correo electrónico de la cuenta de servicio. Omite esta marca si no usas la identidad temporal como cuenta de servicio.APPLICATION_ID_URI
: El URI de ID de aplicación de la aplicación de AzureSERVICE_ACCOUNT_TOKEN_LIFETIME
: Si usas la identidad temporal como cuenta de servicio, el ciclo de vida del token de acceso de la cuenta de servicio, en segundos; el valor predeterminado es de una hora cuando no se proporciona. Omite esta marca si no usas la identidad de otra cuenta de servicio. Para especificar un ciclo de vida de más de una hora, debes configurar la restricción de la política de la organizaciónconstraints/iam.allowServiceAccountCredentialLifetimeExtension
.FILEPATH
: El archivo en el que se guardará la configuración
Usa la configuración de credenciales para acceder a Google Cloud
Para permitir que las herramientas y las bibliotecas cliente usen tu configuración de credenciales, haz lo siguiente en tu entorno de AWS o Azure:
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.Usa una biblioteca cliente o herramienta que admita la federación de Workload Identity y pueda encontrar credenciales de forma automática:
C++
Las bibliotecas cliente de Google Cloud para C++ admiten la federación de identidades para cargas de trabajo desde la versión v2.6.0. Para usar la federación de identidades para cargas de trabajo, debes compilar las bibliotecas cliente con la versión 1.36.0 o posterior de gRPC.
Go
Las bibliotecas cliente para Go admiten la federación de identidades si usan la versión v0.0.0-20210218202405-ba52d332ba99 o una versión posterior del módulo
golang.org/x/oauth2
.Para verificar qué versión de este módulo usa tu biblioteca cliente, ejecuta los siguientes comandos:
cd $GOPATH/src/cloud.google.com/go go list -m golang.org/x/oauth2
Java
Las bibliotecas cliente para Java admiten la federación de identidades si usan la versión 0.24.0 o posterior del artefacto
com.google.auth:google-auth-library-oauth2-http
.Para verificar qué versión de este artefacto usa tu biblioteca cliente, ejecuta el siguiente comando de Maven en el directorio de tu aplicación:
mvn dependency:list -DincludeArtifactIds=google-auth-library-oauth2-http
Node.js
Las bibliotecas cliente de Node.js admiten la federación de identidades para cargas de trabajo si usan la versión 7.0.2 o una versión posterior del paquete
google-auth-library
.Para verificar qué versión de este paquete usa tu biblioteca cliente, ejecuta el siguiente comando en el directorio de tu aplicación:
npm list google-auth-library
Cuando creas un objeto
GoogleAuth
, puedes especificar un ID del proyecto o puedes permitir queGoogleAuth
encuentre el ID del proyecto automáticamente. Para encontrar el ID del proyecto de manera automática, la cuenta de servicio en el archivo de configuración debe tener el rol de Navegador (roles/browser
) o un rol con permisos equivalentes en tu proyecto. Para obtener más información, consulta 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 automáticamente. Para encontrar el ID del proyecto de manera automática, la cuenta de servicio en el archivo de configuración debe tener el rol de Navegador (roles/browser
) o un rol con permisos equivalentes en tu proyecto. Para obtener más información, consulta la guía del usuario del paquetegoogle-auth
.gcloud
Para autenticar con la federación de identidades para cargas de trabajo, usa el comando
gcloud auth login
:gcloud auth login --cred-file=FILEPATH.json
Reemplaza
FILEPATH
por la ruta de acceso al archivo de configuración de credenciales.La asistencia para la federación de identidades para cargas de trabajo en la CLI de gcloud está disponible en la versión 363.0.0 y posteriores de gcloud CLI.
Terraform
El proveedor de servicios en la nube admite la federación de identidades para cargas de trabajo si usas la versión 3.61.0 o una posterior:
terraform { required_providers { google = { source = "hashicorp/google" version = "~> 3.61.0" } } }
gsutil
Para autenticar a través de la federación de identidades para cargas de trabajo, usa uno de los siguientes métodos:
Cuando uses gsutil junto con gcloud, accede con normalidad:
gcloud auth login --cred-file=FILEPATH.json
Cuando uses gsutil como una aplicación de línea de comandos independiente, edita el archivo .boto para incluir la siguiente sección:
[Credentials] gs_external_account_file = FILEPATH
En ambos casos, reemplaza
FILEPATH
por la ruta de acceso al archivo de configuración de la credencial.La asistencia para la federación de identidades para cargas de trabajo en gsutil está disponible en la versión 379.0.0 y posteriores de gcloud CLI.
bq
Para autenticar a través de la federación de identidades para cargas de trabajo, usa el comando
gcloud auth login
de la siguiente manera:gcloud auth login --cred-file=FILEPATH.json
Reemplaza
FILEPATH
por la ruta de acceso al archivo de configuración de credenciales.La compatibilidad con la federación de Workload Identity en bq está disponible en la versión 390.0.0 y posteriores de la CLI de gcloud.
Si no puedes usar una biblioteca cliente que admita la federación de Workload Identity, puedes autenticarte de manera programática con la API de REST.
Situaciones avanzadas
Autentica una carga de trabajo con la API de REST
Si no puedes usar las bibliotecas cliente, puedes seguir estos pasos para permitir que una carga de trabajo externa obtenga un token de acceso de corta duración mediante la API de REST:
Obtén credenciales de tu IdP externo:
AWS
Crea un documento JSON que contenga la información que incluirías normalmente en una solicitud al extremo
GetCallerIdentity()
de AWS, incluida una firma de solicitud válida.La federación de Workload Identity hace referencia a este documento JSON como un token
GetCallerIdentity
. El token permite que la federación de Workload Identity verifique la identidad sin revelar la clave de acceso secreta de AWS.Un token
GetCallerIdentity
es similar al que se muestra a continuación:{ "url": "https://sts.amazonaws.com?Action=GetCallerIdentity&Version=2011-06-15", "method": "POST", "headers": [ { "key": "Authorization", "value" : "AWS4-HMAC-SHA256 Credential=AKIASOZTBDV4D7ABCDEDF/20200228/us-east-1/sts/aws4_request, SignedHeaders=host;x-amz-date,Signature=abcedefdfedfd" }, { "key": "host", "value": "sts.amazonaws.com" }, { "key": "x-amz-date", "value": "20200228T225005Z" }, { "key": "x-goog-cloud-target-resource", "value": "//iam.googleapis.com/projects/12345678/locations/global/workloadIdentityPools/my-pool/providers/my-aws-provider" }, { "key": "x-amz-security-token", "value": "GizFWJTqYX...xJ55YoJ8E9HNU=" } ] }
El token contiene los siguientes campos:
url
: La URL del extremo de AWS STS 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
Te recomendamos usar extremos de STS regionales y diseñes una infraestructura confiable para tus cargas de trabajo. Para obtener más información, consulta Extremos regionales de AWS STS.method
: Es el método de solicitud HTTP:POST
.headers
: Son los encabezados de la solicitud HTTP, que deben incluir lo siguiente:Authorization
: La firma de la solicitudhost
: 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
: 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.Usa la API de servicio de token de seguridad para intercambiar la credencial por un token de acceso de corta duración:
Bash
STS_TOKEN=$(curl https://sts.googleapis.com/v1/token \ --data-urlencode "audience=//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID" \ --data-urlencode "grant_type=urn:ietf:params:oauth:grant-type:token-exchange" \ --data-urlencode "requested_token_type=urn:ietf:params:oauth:token-type:access_token" \ --data-urlencode "scope=https://www.googleapis.com/auth/cloud-platform" \ --data-urlencode "subject_token_type=$SUBJECT_TOKEN_TYPE" \ --data-urlencode "subject_token=$SUBJECT_TOKEN" | jq -r .access_token) echo $STS_TOKEN
PowerShell
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12 $StsToken = (Invoke-RestMethod ` -Method POST ` -Uri "https://sts.googleapis.com/v1/token" ` -ContentType "application/json" ` -Body (@{ "audience" = "//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID" "grantType" = "urn:ietf:params:oauth:grant-type:token-exchange" "requestedTokenType" = "urn:ietf:params:oauth:token-type:access_token" "scope" = "https://www.googleapis.com/auth/cloud-platform" "subjectTokenType" = $SubjectTokenType "subjectToken" = $SubjectToken } | ConvertTo-Json)).access_token Write-Host $StsToken
Reemplaza los siguientes valores:
PROJECT_NUMBER
: Es el número del proyecto que contiene el grupo de Workload Identity.POOL_ID
: Es el ID del grupo de Workload Identity.PROVIDER_ID
: Es el ID del proveedor de grupos de Workload Identity.
Si usas la identidad temporal como cuenta de servicio, usa el token del servicio de tokens de seguridad para invocar el método
generateAccessToken
de la API de Service Account Credentials de IAM para obtener un token de acceso, haz lo siguiente:
Bash
ACCESS_TOKEN=$(curl -0 -X POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT_EMAIL:generateAccessToken \ -H "Content-Type: text/json; charset=utf-8" \ -H "Authorization: Bearer $STS_TOKEN" \ -d @- <<EOF | jq -r .accessToken { "scope": [ "https://www.googleapis.com/auth/cloud-platform" ] } EOF ) echo $ACCESS_TOKEN
PowerShell
$AccessToken = (Invoke-RestMethod ` -Method POST ` -Uri "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT_EMAIL:generateAccessToken" ` -Headers @{ "Authorization" = "Bearer $StsToken" } ` -ContentType "application/json" ` -Body (@{ "scope" = , "https://www.googleapis.com/auth/cloud-platform" } | ConvertTo-Json)).accessToken Write-Host $AccessToken
Reemplaza
SERVICE_ACCOUNT_EMAIL
por la dirección de correo electrónico de la cuenta de servicio.¿Qué sigue?
- Obtén más información sobre la federación de Workload Identity.
- Obtén más información sobre las prácticas recomendadas para usar la federación de Workload Identity.
- Consulta cómo puedes administrar grupos y proveedores de identidades para cargas de trabajo.
Salvo que se indique lo contrario, el contenido de esta página está sujeto a la licencia Atribución 4.0 de Creative Commons, y los ejemplos de código están sujetos a la licencia Apache 2.0. Para obtener más información, consulta las políticas del sitio de Google Developers. Java es una marca registrada de Oracle o sus afiliados.
Última actualización: 2024-09-12 (UTC)