En este documento, se muestra cómo usar la federación de identidades para acceder a los recursos de Google Cloud desde Microsoft Azure.
En general, las aplicaciones que se ejecutan fuera de Google Cloud usan claves de cuentas de servicio para acceder a los recursos de Google Cloud. Mediante la federación de identidades, puedes permitir que una identidad administrada para un recurso de Azure suplante a una cuenta de servicio. Esto permite que la carga de trabajo acceda a los recursos de Google Cloud directamente mediante un token de acceso de corta duración y quita la carga de seguridad y mantenimiento asociada con las claves de la cuenta de servicio.
Antes de comenzar
Asegúrate de tener la función de administrador de grupo de Workload Identity (
roles/iam.workloadIdentityPoolAdmin
).Como alternativa, las funciones básicas de propietario (
roles/owner
) y editor (roles/editor
) de IAM también incluyen los 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.Actualiza la política de la organización para permitir la federación de Azure.
Otorga acceso a la cuenta de servicio para llamar a las API de Google Cloud que requiere la carga de trabajo.
Crea un grupo de Workload Identity
Un grupo de Workload Identity es un contenedor para una colección de identidades externas. Los grupos de Workload Identity se aíslan unos de otros, pero un solo grupo puede actuar en nombre de cualquier cantidad de cuentas de servicio. En general, recomendamos crear un grupo nuevo para cada uno de tus entornos, como desarrollo, etapa de pruebas o producción.
Para crear un grupo nuevo de Workload Identity, debes proporcionar un ID. También puedes proporcionar una descripción y un nombre visible opcionales.
gcloud
Ejecuta el comando gcloud beta iam workload-identity-pools create
para crear un grupo de Workload Identity:
gcloud beta iam workload-identity-pools create pool-id \ --location="global" \ --description="description" \ --display-name="display-name"
La respuesta es similar a la siguiente:
Created WorkloadIdentityPool [pool-id].
REST
El método projects.locations.workloadIdentityPools.create
crea un grupo de Workload Identity.
Método HTTP y URL:
POST https://iam.googleapis.com/v1beta/projects/project-id/locations/global/workloadIdentityPools?workloadIdentityPoolId=pool-id
Cuerpo JSON de la solicitud:
{ "description": "description", "display-name": "display-name" }
Para enviar tu solicitud, expande una de estas opciones:
Mediante este método, se muestra una Operation
de larga duración similar a la siguiente:
{ "name": "projects/project-number/locations/global/workloadIdentityPools/pool-id/operations/operation-id" }
Agrega Azure como proveedor de identidad
A fin de configurar Azure como proveedor de identidad para tu grupo de identidades de cargas de trabajo, proporciona al menos lo siguiente:
Un ID para el proveedor
El ID del grupo de Workload Identity de la sección anterior de este documento
-
Una lista de asignaciones de atributos que mapean las reclamaciones sobre un token para una identidad administrada por Azure a los atributos en un token de Google. Usa
assertion
a fin de hacer referencia al token de Azure,google
para los atributos de Google yattribute
para los atributos personalizados.Hay dos atributos de Google:
google.subject
ygoogle.groups
. Puedes hacer referencia a estos atributos en las vinculaciones de funciones de IAM.google.subject
también aparece en las entradas de registro de Cloud Logging.Debes proporcionar una asignación para
google.subject
. En general, recomendamos mapearla aassertion.sub
, que contiene el ID de objeto de una identidad administrada que crearás en la sección siguiente. Esto proporciona un identificador estable para usar en vinculaciones de función de IAM. La asignación se verá de la siguiente manera:google.subject=assertion.sub
Para aserciones más complejas, puedes usar Common Expression Language. Por ejemplo, si tu grupo de Workload Identity contiene varios proveedores de identidad, puedes agregar un prefijo para quitar la ambigüedad entre ellos:
google.subject="azure::" + assertion.tid + "::" + assertion.sub
El campo
google.subject
no puede superar los 127 caracteres.También puedes especificar atributos personalizados. Por ejemplo, a continuación, se mapea
assertion.tid
aattribute.tid
:attribute.tid=assertion.tid
En el siguiente ejemplo, se asigna un nombre visible según el valor de
assertion.oid
:attribute.managed_identity_name={ "8bb39bdb-1cc5-4447-b7db-a19e920eb111":"workload1", "55d36609-9bcf-48e0-a366-a3cf19027d2a":"workload2" }[assertion.oid]
Si deseas obtener una lista completa de reclamaciones a las que puedes hacer referencia, obtén un token de acceso para una VM de Azure en tu carga de trabajo. En tu solicitud, reemplaza el parámetro
resource
por el nombre completo del recurso de tu grupo de Workload Identity. Por ejemplo:curl
curl -s 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://iam.googleapis.com/projects/project-number/locations/global/workloadIdentityPools/pool-id' \ -H Metadata:true -H "Cache-Control: no-cache"
PowerShell
Invoke-WebRequest \ -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://iam.googleapis.com/projects/project-number/locations/global/workloadIdentityPools/pool-id' \ -Headers @{Metadata="true"}
Esto muestra un token de acceso para la VM de Azure, que puedes decodificar a fin de ver las reclamaciones disponibles.
Para hacer referencia a una parte específica de una reclamación en una expresión, usa la función
extract()
de CEL, que extrae un valor de una reclamación a partir de una plantilla que proporciones. Para obtener más información sobreextract()
, consulta Extrae valores de atributos.Para verificar si una credencial contiene una reclamación, usa la función
has()
.
También puedes proporcionar varios parámetros opcionales:
Un nombre visible y una descripción
Una condición de atributo que especifica los atributos que debe mostrar el principal. La condición puede aplicarse a los reclamos de la credencial de Azure o a los atributos de la credencial de Google. Se rechaza cualquier solicitud que no cumpla con la condición.
Las condiciones de los atributos tienen el formato de una expresión CEL que muestra un valor booleano. Por ejemplo, lo siguiente rechaza las solicitudes de cualquier identidad que no sea miembro de un grupo específico:
"e968c2ef-047c-498d-8d79-16ca1b61e77e" in assertion.groups
A fin de obtener más información sobre los casos de uso comunes para las condiciones de los atributos, consulta la descripción general de la federación de Workload Identity.
En el siguiente ejemplo, se muestra cómo agregar Azure como proveedor de identidad:
gcloud
Ejecuta el comando gcloud beta iam workload-identity-pools providers create-oidc
para agregar Azure como proveedor de identidad:
gcloud beta iam workload-identity-pools providers create-oidc provider-id \ --workload-identity-pool="pool-id" \ --issuer-uri="https://sts.windows.net/azure-tenant-id" \ --location="global" \ --attribute-mapping="google.subject=assertion.sub"
La respuesta es similar a la siguiente:
Created WorkloadIdentityPoolProvider [provider-id].
REST
Con el método projects.locations.workloadIdentityPools.providers.create
, se agrega a Azure como proveedor.
Método HTTP y URL:
POST https://iam.googleapis.com/v1beta/projects/project-id/locations/global/workloadIdentityPools/pool-id/providers?workloadIdentityPoolProviderId=provider-id
Cuerpo JSON de la solicitud:
{ "issuerUrl": "https://sts.windows.net/azure-tenant-id" }
Para enviar tu solicitud, expande una de estas opciones:
Mediante este método, se muestra una Operation
de larga duración similar a la siguiente:
{ "name": "projects/project-number/locations/global/workloadIdentityPools/pool-id/providers/provider-id/operations/operation-id" }
Configura la instancia de Azure para la federación de identidades
Prepara tu usuario de Azure para la federación de identidades:
Crea una aplicación y un principal del servicio de Azure AD, y configura el URI del ID de aplicación como el nombre completo del recurso que creaste en la sección anterior:
https://iam.googleapis.com/projects/project-number/locations/global/workloadIdentityPools/pool-id/providers/provider-id
Crea una identidad administrada y toma nota del ID de objeto.
Asigna la identidad administrada a una máquina virtual a la que deseas otorgarle acceso a los recursos de Google Cloud.
Otorga permiso para actuar en nombre de una cuenta de servicio
Las identidades externas no pueden acceder de forma directa a la mayoría de los recursos de Google Cloud.
En su lugar, les otorgas la función de usuario de Workload Identity (roles/iam.workloadIdentityUser
) para permitir que actúen en nombre de una cuenta de servicio.
A fin de agregar esta vinculación de función a una identidad administrada específica, haz lo siguiente:
gcloud iam service-accounts add-iam-policy-binding service-account-email \ --role roles/iam.workloadIdentityUser \ --member "principal://iam.googleapis.com/projects/project-number/locations/global/workloadIdentityPools/pool-id/subject/managed-identity-object-id"
A fin de agregar esta vinculación a todas las identidades de un grupo, haz lo siguiente:
gcloud iam service-accounts add-iam-policy-binding service-account-email \ --role roles/iam.workloadIdentityUser \ --member "principalSet://iam.googleapis.com/project/project-number/workloadIdentityPools/pool-id/groups/azure-tenant-id"
También puedes otorgar acceso en función de atributos personalizados. Por ejemplo:
gcloud iam service-accounts add-iam-policy-binding service-account-email \ --role="roles/iam.workloadIdentityUser" \ --member="principalSet://iam.googleapis.com/projects/project-number/locations/global/workloadIdentityPools/pool-id/attribute.custom-attribute-name/custom-attribute-value"
Para revocar el acceso, reemplaza add-iam-policy-binding
por remove-iam-policy-binding
.
También puedes agregar o revocar vinculaciones mediante la API de REST o las bibliotecas cliente. Para obtener más información, consulta Otorga, cambiar y revoca el acceso a los recursos.
Intercambia un token de Azure por un token de Google
Una vez que la identidad administrada de Azure tenga la capacidad de suplantar una cuenta de servicio, puedes intercambiar sus credenciales por las credenciales de Google.
Para intercambiar credenciales, haz lo siguiente:
Usa Azure Instance Metadata Service (IMDS) para obtener un token de acceso de Azure.
Pasa el token de acceso de Azure al método
token()
del servicio de token de seguridad para obtener un token de acceso federado:REST
El método
token
intercambia un token de terceros por un token de Google.Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:
-
project-number
: Es el número de tu proyecto de Google Cloud. -
pool-id
: Es el ID del grupo de Workload Identity que creaste con anterioridad en este instructivo. -
provider-id
: Es el ID del proveedor de identidad que configuraste con anterioridad en este instructivo.
Método HTTP y URL:
POST https://sts.googleapis.com/v1beta/token
Cuerpo JSON de la solicitud:
{ "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": "urn:ietf:params:oauth:token-type:jwt", "subjectToken": "azure-id-token" }
Para enviar tu solicitud, expande una de estas opciones:
El método muestra un token federado.
-
Llama a
generateAccessToken()
para intercambiar el token federado por un token de acceso a una cuenta de servicio. Una cantidad limitada de API de Google Cloud admite tokens federados. Todas las API de Google Cloud admiten tokens de acceso a la cuenta de servicio.REST
Mediante el método
serviceAccounts.generateAccessToken
de la API de credenciales de la cuenta de servicio, se genera un token de acceso de OAuth 2.0 para una cuenta de servicio.Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:
project-id
: El ID del proyecto de Google Cloud.sa-id
: El ID de la cuenta de servicio. Puede ser la dirección de correo electrónico de la cuenta de servicio con el formatosa-name@project-id.iam.gserviceaccount.com
o el ID numérico único de la cuenta de servicio.token
: Es el token de acceso federado.
Método HTTP y URL:
POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/sa-name@project-id.iam.gserviceaccount.com:generateAccessToken
Cuerpo JSON de la solicitud:
{ "scope": [ "https://www.googleapis.com/auth/cloud-platform" ] }
Para enviar tu solicitud, expande una de estas opciones:
Si la solicitud
generateAccessToken
tiene éxito, el cuerpo de la respuesta contendrá un token de acceso de OAuth 2.0 y un tiempo de caducidad. ElaccessToken
se puede usar para autenticar una solicitud en nombre de la cuenta de servicio hasta que se haya alcanzado elexpireTime
.{ "accessToken": "eyJ0eXAi...NiJ9", "expireTime": "2020-04-07T15:01:23.045123456Z" }
Una vez que tengas un token de acceso para una cuenta de servicio, puedes usarlo a fin de llamar a las API de Google Cloud. A tal fin, incluye el token en el encabezado Authorization
de las solicitudes:
Authorization: Bearer service-account-access-token
La solicitud está autorizada como la cuenta de servicio.
Próximos pasos
Usa la federación de identidades para acceder a los recursos desde AWS o acceder a los recursos desde un proveedor de OIDC.
Obtén más información sobre la federación de Workload Identity.