Accede a los recursos desde Microsoft Azure

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

  1. Habilita las API de IAM, Resource Manager, Service Account Credentials, and Security Token Service (STS).

    Habilita las API

  2. Asegúrate de tener las funciones de administrador de grupos de Workload Identity (roles/iam.workloadIdentityPoolAdmin) y administrador de cuenta de servicio (roles/iam.serviceAccountAdmin) en el proyecto.

    De manera alternativa, la función básica 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.

  3. Actualiza la política de la organización para permitir la federación de Azure.

  4. Crea una cuenta de servicio de Google Cloud.

  5. Otorga acceso a la cuenta de servicio para llamar a las API de Google Cloud que requiere la carga de trabajo.

Configuración del proveedor de identidad para Azure

Cuando agregas Azure como proveedor de identidad para tu grupo de Workload Identity, debes proporcionar lo siguiente:

  • Un ID para el proveedor

  • Tu ID de usuario de Azure

  • 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 y attribute para los atributos personalizados.

    Hay dos atributos de Google: google.subject y google.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 a assertion.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 a attribute.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/providers/PROVIDER_ID&object_id=MANAGED_IDENTITY_OBJECT_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/providers/PROVIDER_ID&object_id=MANAGED_IDENTITY_OBJECT_ID' \
        -Headers @{Metadata="true"}
    

    La respuesta es un objeto JSON con un campo access_token, que contiene un token de acceso para la VM de Azure. Para decodificar el token de acceso y ver las reclamaciones disponibles, sigue estos pasos:

    1. Copia el token de acceso completo.
    2. En un navegador web, ve a https://jwt.ms/.
    3. Pega el token de acceso en el cuadro de texto.
    4. Haz clic en Claims.

    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 sobre extract(), consulta Extrae valores de atributos.

    Para verificar si una credencial contiene una reclamación, usa la función has().

De manera opcional, también puedes proporcionar lo siguiente:

  • 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
    

    Para obtener más información sobre los casos de uso comunes, consulta Condiciones de atributos.

Crea un proveedor y un grupo de Workload Identity

Puedes usar un grupo de Workload Identity para organizar y administrar 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 nuevo grupo de Workload Identity, debes proporcionar un ID. También puedes proporcionar una descripción y un nombre visible opcionales. El ID no puede comenzar con gcp-; este prefijo está reservado para que Google lo use.

Después de crear el grupo de Workload Identity, puedes agregar un proveedor de grupos de Workload Identity. Cada proveedor de grupos de Workload Identity representa un proveedor de identidad específico, como Azure. Un solo grupo puede contener varios proveedores. A fin de crear el proveedor, necesitarás la información que se describe en esta página en Configuración del proveedor de identidad para Azure.

Console

  1. En Cloud Console, ve a la página Nuevo proveedor y grupo de cargas de trabajo.

    Ir a Nuevo proveedor y grupo de cargas de trabajo

  2. Ingresa un nombre para el grupo de Workload Identity.

    Cloud Console usa el nombre para crear un ID del grupo. Para cambiar el ID del grupo, haz clic en Editar. No puedes cambiar el ID del grupo más adelante.

  3. Ingresa una descripción para el grupo de Workload Identity (opcional).

  4. Haga clic en Continuar.

  5. En la lista desplegable Seleccionar un proveedor, selecciona OpenID Connect (OIDC) y, luego, haz clic en Continuar.

  6. Ingrese un nombre de proveedor.

    Cloud Console usa el nombre para crear un ID del proveedor. Para cambiar el ID del proveedor, haz clic en Editar. No puedes cambiar el ID del proveedor más adelante.

  7. Ingresa la URL de la entidad emisora y haz clic en Continuar.

    En Azure, la URL de la entidad emisora usa el formato https://sts.windows.net/AZURE_TENANT_ID.

  8. Para configurar la asignación de atributos, haz clic en Editar asignación.

    La asignación de atributos te permite usar información sobre las identidades externas para otorgar acceso a un subconjunto de esas identidades. Para Azure, recomendamos asignar google.subject a assertion.sub. Otras asignaciones son opcionales.

    A fin de obtener más información, consulta Configuración del proveedor de identidad para Azure en esta página.

  9. Para proporcionar una condición de atributo, que especifique las identidades que se pueden autenticar, haz clic en Agregar condición y, luego, ingresa una expresión de Common Expression Language (CEL) válida (opcional). Para obtener más información, consulta Condiciones de los atributos.

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

gcloud

Para crear un grupo de Workload Identity, usa el comando gcloud iam workload-identity-pools create:

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

La respuesta es similar a la siguiente:

Created workload identity pool [POOL_ID].

Para agregar un proveedor de grupos de Workload Identity, usa el comando gcloud iam workload-identity-pools providers create-oidc:

gcloud 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 workload identity pool provider [PROVIDER_ID].

REST

Para crear un grupo de Workload Identity, haz lo siguiente:

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/v1/projects/project-id/locations/global/workloadIdentityPools/pool-id/providers?workloadIdentityPoolProviderId=provider-id

Cuerpo JSON de la solicitud:

{
  "attributeMapping": {
    "google.subject": "assertion.sub"
  },
  "oidc": {
    "issuerUri": "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"
}

Para agregar un proveedor de grupos de Workload Identity, haz lo siguiente:

El método projects.locations.workloadIdentityPools.create crea un grupo de Workload Identity.

Método HTTP y URL:

POST https://iam.googleapis.com/v1/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"
}

Configura la instancia de Azure para la federación de identidades

Prepara tu usuario de Azure para la federación de identidades:

  1. 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
    
  2. Crea una identidad administrada y toma nota del ID de objeto.

  3. Asigna la identidad administrada a una máquina virtual a la que deseas otorgarle acceso a los recursos de Google Cloud.

Permite que las identidades externas actúen 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) en la cuenta de servicio para permitir que actúen en nombre de una cuenta de servicio. Cuando las identidades externas actúan en nombre de una cuenta de servicio, tienen las mismas funciones y los mismos permisos que la cuenta de servicio.

Para otorgar la función de usuario de Workload Identity a las identidades de Azure, haz lo siguiente:

Console

Antes de otorgar la función de usuario de Workload Identity, decide qué identidades permitirás actuar en nombre de la cuenta de servicio. Puedes otorgar la función a todas las identidades en el grupo de identidad de la carga de trabajo o a un subconjunto de estas identidades según la asignación de atributos:

Identidades Nombre del atributo Valor de atributo
Una identidad administrada específica subject MANAGED_IDENTITY_OBJECT_ID
Todas las identidades de Azure en el usuario de Azure determinado group AZURE_TENANT_ID
Todas las identidades con un valor de atributo específico ATTRIBUTE_NAME ATTRIBUTE_VALUE

Luego, otorga acceso a la cuenta de servicio y, de forma opcional, descarga un archivo de configuración para generar credenciales de forma automática:

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

    Ir a Grupos de Workload Identity

  2. Busca el grupo de Workload Identity que contiene las identidades de Azure y, luego, haz clic en el ícono Editar. Cloud Console muestra detalles sobre el grupo de Workload Identity.

  3. Haz clic en Grant access.

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

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

    Para permitir que todas las identidades actúen en nombre de la cuenta de servicio, selecciona All identities in the pool.

    Para permitir que un subconjunto de identidades actúe en nombre de la cuenta de servicio, selecciona Only identities matching the filter y, luego, haz lo siguiente:

    1. En la lista desplegable Attribute name, selecciona el atributo que deseas evaluar.

      Solo los atributos asignados aparecen en la lista. No se muestran los prefijos google. y attribute..

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

  6. Haz clic en Guardar.

    Si las identidades ya tenían acceso a la cuenta de servicio, Cloud Console muestra detalles sobre el grupo de Workload Identity. Puedes omitir los pasos restantes.

    Si las identidades obtuvieron acceso a la cuenta de servicio, Cloud Console muestra el cuadro de diálogo Configurar tu aplicación.

  7. A fin de descargar un archivo de configuración para generar credenciales de forma automática, haz lo siguiente (opcional):

    1. En la lista desplegable Provider, selecciona el proveedor que contiene las identidades de Azure que actuarán en nombre de la cuenta de servicio.

    2. Haz clic en Descargar configuración para descargar un archivo de configuración JSON.

  8. Haz clic en Descartar.

gcloud

Antes de otorgar la función de usuario de Workload Identity, decide qué identidades permitirás actuar en nombre de la cuenta de servicio. Puedes otorgar la función a todas las identidades en el grupo de identidad de la carga de trabajo o a un subconjunto de estas identidades según la asignación de atributos:

Identidades Formato de miembro
Una identidad administrada específica principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/MANAGED_IDENTITY_OBJECT_ID
Todas las identidades de Azure en el usuario de Azure determinado principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/AZURE_TENANT_ID
Todas las identidades con un valor de atributo específico principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE
Todas las identidades de un grupo principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*

Luego, ejecuta el siguiente comando gcloud iam service-accounts add-iam-policy-binding:

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

Reemplaza los siguientes valores:

  • SERVICE_ACCOUNT_EMAIL: La dirección de correo electrónico de la cuenta de servicio.
  • MEMBER: las identidades externas que actuarán en nombre de la cuenta de servicio.

REST

Antes de otorgar la función de usuario de Workload Identity, decide qué identidades permitirás actuar en nombre de la cuenta de servicio. Puedes otorgar la función a todas las identidades en el grupo de identidad de la carga de trabajo o a un subconjunto de estas identidades según la asignación de atributos:

Identidades Formato de miembro
Una identidad administrada específica principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/MANAGED_IDENTITY_OBJECT_ID
Todas las identidades de Azure en el usuario de Azure determinado principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/AZURE_TENANT_ID
Todas las identidades con un valor de atributo específico principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE
Todas las identidades de un grupo principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*

Luego, usa el patrón de lectura, modificación y escritura para actualizar la política:

  1. Lee la política de IAM de la cuenta de servicio.
  2. Modifica la política para otorgar la función.
  3. Escribe la política actualizada:

Lee la política de IAM de la cuenta de servicio.

El método serviceAccounts.getIamPolicy obtiene la política de IAM de 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 Los ID de proyecto son strings alfanuméricas, como my-project.
  • 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 formato SA_NAME@PROJECT_ID.iam.gserviceaccount.com o el ID numérico único de la cuenta de servicio.

  • POLICY_VERSION: Es la versión de la política que se mostrará. Las solicitudes deben especificar la versión de política más reciente, que es la versión de política 3. Consulta Especifica una versión de política cuando obtienes una política para obtener más detalles.

Método HTTP y URL:

POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_ID:getIamPolicy

Cuerpo JSON de la solicitud:

{
  "options": {
    "requestedPolicyVersion": POLICY_VERSION
  }
}

Para enviar tu solicitud, expande una de estas opciones:

Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

{
  "version": 1,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "role": "roles/serviceAccountAdmin",
      "members": [
        "user:admin@example.com"
      ]
    }
  ]
}

Cuando no hay una política existente, la respuesta solo contiene la etag predeterminada. Si obtienes esta respuesta, agrega un campo version, configurado como 3, y un campo bindings, configurado como un arreglo vacío.

Modifica la política para otorgar las funciones adecuadas a los miembros.

Para otorgar una función, modifica el array bindings desde el cuerpo de la respuesta:

  • Si no hay una vinculación existente para la función, agrega un objeto nuevo al arreglo bindings que defina la función que deseas otorgar y el miembro al que deseas otorgarla.
  • Si ya existe una vinculación para la función, agrega el miembro nuevo a la lista de miembros existentes.

Ejemplo:

Para otorgar la función de usuario de Workload Identity (roles/iam.workloadIdentityUser) a todas las identidades del grupo, cambia el ejemplo que se muestra en el paso anterior de la siguiente manera:

{
  "version": 1,
  "etag": "BwUqLaVeua8=",
  "bindings": [
    {
      "role": "roles/iam.workloadIdentityUser",
      "members": [
        "principalSet://iam.googleapis.com/projects/1234567890123/locations/global/workloadIdentityPools/my-pool/*"
      ]
    },
    {
      "role": "roles/iam.serviceAccountAdmin",
      "members": [
        "user:admin@example.com"
      ]
    }
  ]
}

Escribe la política actualizada.

Mediante el método serviceAccounts.setIamPolicy, se configura una política de IAM actualizada para la 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 Los ID de proyecto son strings alfanuméricas, como my-project.
  • 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 formato SA_NAME@PROJECT_ID.iam.gserviceaccount.com o el ID numérico único de la cuenta de servicio.

  • POLICY: Es una representación JSON de la política que deseas establecer. Para obtener más información sobre el formato de una política, consulta Referencia de políticas.

    Por ejemplo, para establecer la política que se muestra en el paso anterior, reemplaza policy por lo siguiente:

    {
      "version": 1,
      "etag": "BwUqLaVeua8=",
      "bindings": [
        {
          "role": "roles/iam.workloadIdentityUser",
          "members": [
            "principalSet://iam.googleapis.com/projects/1234567890123/locations/global/workloadIdentityPools/my-pool/*"
          ]
        },
        {
          "role": "roles/iam.serviceAccountAdmin",
          "members": [
            "user:admin@example.com"
          ]
        }
      ]
    }
    

Método HTTP y URL:

POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_ID:setIamPolicy

Cuerpo JSON de la solicitud:

{
  "policy": POLICY
}

Para enviar tu solicitud, expande una de estas opciones:

La respuesta contiene la política actualizada.

Genera credenciales de Google

Si usas una biblioteca cliente compatible, puedes configurar la biblioteca cliente para que genere credenciales de Google automáticamente. De forma alternativa, puedes generar credenciales de Azure de forma manual y, luego, cambiarlas por credenciales de Google.

Te recomendamos que, cuando sea posible, generes las credenciales de forma automática para que no tengas que implementar el proceso de intercambio de tokens tú mismo.

Genera credenciales automáticamente

Si accedes a Google Cloud con una biblioteca cliente para uno de los siguientes lenguajes, puedes configurar la biblioteca cliente para que genere credenciales de forma automática mediante la federación de identidades:

C++

La mayoría de las bibliotecas cliente de Google Cloud para C++ admiten la federación de identidades mediante un objeto ChannelCredentials, que se crea mediante una llamada a grpc::GoogleDefaultCredentials(). Para inicializar esta credencial, debes compilar las bibliotecas cliente con la versión 1.36.0 o posterior de gRPC.

La biblioteca cliente de Cloud Storage para C++ usa la API de REST, no gRPC, por lo que no admite la federación de identidades.

Comienza a usarlo

Las bibliotecas cliente para Go admiten la federación de identidades si usan la versión v0.0.0-20210218202405-ba52d332ba99 o una versión posterior del módulo golang.org/x/oauth2.

Para verificar qué versión de este módulo usa tu biblioteca cliente, ejecuta los siguientes comandos:

cd $GOPATH/src/cloud.google.com/go
go list -m golang.org/x/oauth2

Java

Las bibliotecas cliente para Java admiten la federación de identidades si usan la versión 0.24.0 o posterior del artefacto com.google.auth:google-auth-library-oauth2-http.

Para verificar qué versión de este artefacto usa tu biblioteca cliente, ejecuta el siguiente comando de Maven en el directorio de tu aplicación:

mvn dependency:list -DincludeArtifactIds=google-auth-library-oauth2-http

Node.js

Las bibliotecas cliente de Node.js admiten la federación de identidades si usan la versión 7.0.2 o una versión posterior del paquete google-auth-library.

Para verificar qué versión de este paquete usa tu biblioteca cliente, ejecuta el siguiente comando en el directorio de tu aplicación:

npm list google-auth-library

Cuando creas un objeto GoogleAuth, puedes especificar un ID del proyecto o puedes permitir que GoogleAuth encuentre el ID del proyecto de forma automática. Para encontrar el ID del proyecto de manera automática, la cuenta de servicio en el archivo de configuración debe tener la función de Navegador (roles/browser) o una función con permisos equivalentes en tu proyecto. Para obtener más información, consulta el README del paquete google-auth-library.

Python

Las bibliotecas cliente para Python admiten la federación de identidades si usan la versión 1.27.0 o posterior del paquete google-auth.

Para verificar qué versión de este paquete usa tu biblioteca cliente, ejecuta el siguiente comando en el entorno en el que está instalado el paquete:

pip show google-auth

Si deseas especificar un ID del proyecto para el cliente de autenticación, puedes configurar la variable de entorno GOOGLE_CLOUD_PROJECT o permitir que el cliente busque el ID del proyecto de forma automática. Para encontrar el ID del proyecto de manera automática, la cuenta de servicio en el archivo de configuración debe tener la función de Navegador (roles/browser) o una función con permisos equivalentes en tu proyecto. Para obtener más información, consulta la guía del usuario del paquete google-auth.

A fin de configurar la biblioteca cliente para generar credenciales de forma automática, crea un archivo de configuración JSON. Puedes crear este archivo con Cloud Console o la herramienta de gcloud.

Console

Primero, sigue las instrucciones de esta página para permitir que las identidades externas actúen en nombre de una cuenta de servicio. Luego, puedes crear un archivo de configuración JSON para cualquier cuenta de servicio en cuyo nombre pueden actuar las identidades externas.

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

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

    Ir a Grupos de Workload Identity

  2. Busca el grupo de Workload Identity que contiene el proveedor de identidad que deseas usar y, luego, haz clic en su ícono Editar. Cloud Console muestra detalles sobre el grupo de Workload Identity.
  3. Haz clic en Connected service accounts.
  4. Busca la cuenta de servicio que quieras usar y, luego, haz clic en Descargar.
  5. En la lista desplegable Provider, selecciona el proveedor que contiene las identidades de Azure que actuarán en nombre de la cuenta de servicio.
  6. Haz clic en Descargar configuración para descargar el archivo de configuración JSON y, luego, haz clic en Listo.

gcloud

Para crear un archivo de configuración JSON, ejecuta el comando gcloud iam workload-identity-pools create-cred-config:

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

Reemplaza los siguientes valores:

  • PROJECT_NUMBER: El ID numérico del proyecto.
  • POOL_ID: El ID del grupo de identidades de la carga de trabajo.
  • PROVIDER_ID: El ID del proveedor de grupos de identidades de la carga de trabajo.
  • SERVICE_ACCOUNT_EMAIL: La dirección de correo electrónico de la cuenta de servicio que representar.
  • FILEPATH: La ruta de acceso del archivo de configuración.

Después de generar el archivo de configuración, establece la variable de entorno GOOGLE_APPLICATION_CREDENTIALS en la ruta del archivo de configuración. Esta variable de entorno le indica a la biblioteca cliente que use las Credenciales predeterminadas de la aplicación para autenticarse. Para obtener más información, consulta Encuentra credenciales de forma automática.

Intercambia credenciales de forma manual

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 de forma manual.

Para intercambiar credenciales, haz lo siguiente:

  1. Usa Azure Instance Metadata Service (IMDS) para obtener un token de acceso de Azure.

    Configura el parámetro de consulta resource con el siguiente valor:

    https://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID
    

    Configura el parámetro de consulta object_id con el ID de objeto para la identidad administrada que creaste antes.

  2. 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.
    • PROVIDER_ID: es el ID del proveedor de identidad que configuraste.
    • ACCESS_TOKEN: es el token del proveedor de identidad.

    Método HTTP y URL:

    POST https://sts.googleapis.com/v1/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": "ACCESS_TOKEN"
    }
    

    Para enviar tu solicitud, expande una de estas opciones:

     

    El método muestra un token federado.

  3. 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 Los ID de proyecto son strings alfanuméricas, como my-project.
    • 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 formato SA_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. El accessToken se puede usar para autenticar una solicitud en nombre de la cuenta de servicio hasta que se haya alcanzado el expireTime.

    {
      "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