Federación de Workload Identity

En este documento, se proporciona una descripción general de la federación de identidades para las cargas de trabajo externas. Mediante la federación de identidades, puedes otorgar a las cargas de trabajo locales o de múltiples nubes acceso a los recursos de Google Cloud, sin usar una clave de cuenta de servicio.

Puedes usar la federación de identidades con Amazon Web Services (AWS) o con cualquier proveedor de identidad (IdP) que admita OpenID Connect (OIDC), como Microsoft Azure o SAML 2.0.

¿Por qué elegir la federación de identidades?

En general, las aplicaciones que se ejecutan fuera de Google Cloud pueden usar claves de cuentas de servicio para acceder a los recursos de Google Cloud. Sin embargo, las claves de las cuentas de servicio son credenciales potentes y, si no se administran de forma adecuada, pueden representar un riesgo para la seguridad.

Con la federación de identidades, puedes usar Identity and Access Management (IAM) para otorgar identidades de IAM de identidades externas, incluida la capacidad de usar una identidad temporal como cuenta de servicio. Con este enfoque, se elimina la carga de mantenimiento y seguridad asociada con las claves de las cuentas de servicio.

Grupos de Workload Identity

Un proveedor de grupos de Workload Identity es una entidad que te permite administrar identidades externas.

En general, recomendamos crear un grupo nuevo para cada entorno que no sea de Google Cloud y que necesite acceder a los recursos de Google Cloud, como entornos de desarrollo, etapa de pruebas o producción.

Proveedores de grupos de Workload Identity

Un proveedor de grupos de Workload Identity es una entidad que describe una relación entre Google Cloud y tu IdP, incluida la siguiente información:

  • AWS
  • Azure Active Directory
  • Active Directory Federation Services (AD FS) local
  • Okta
  • Clústeres de Kubernetes

La federación de identidades de cargas de trabajo sigue la especificación del intercambio de tokens de OAuth 2.0. Proporciona una credencial desde tu IdP al servicio de tokens de seguridad, que verifica la identidad en la credencial y, luego, muestra un token federado a cambio.

Proveedor de OIDC con JWK locales

Para federar cargas de trabajo que no tienen un extremo público de OIDC, puedes subir conjuntos de claves web JSON (JWKS) de OIDC directamente al grupo. Esto es común si tienes Terraform o GitHub Enterprise alojado en tu propio entorno o tienes requisitos normativos para no exponer las URL públicas. Para obtener más información, consulta Administra JWK de OIDC (opcional).

Asignaciones de atributos

Los tokens emitidos por el proveedor de identidad externo contienen uno o más atributos. Algunos proveedores de identidad se refieren a estos atributos como reclamaciones.

Los tokens del STS de Google también contienen uno o más atributos, como se muestra en la siguiente tabla:

Atributo Descripción
google.subject Obligatorio. Un identificador único para el usuario. Este atributo se usa en las vinculaciones de roles principal:// de IAM y aparece en los registros de Cloud Logging. El valor debe ser único y no puede superar los 127 caracteres.
google.groups Opcional. Un conjunto de grupos a los que pertenece la identidad. Este atributo se usa en las vinculaciones de roles principalSet:// de IAM para otorgar acceso a todos los miembros de un grupo.
attribute.NAME Opcional. Puedes definir hasta 50 atributos personalizados y usar estos atributos en las vinculaciones de roles principalSet:// de IAM para otorgar acceso a todas las identidades con un atributo determinado.

Una asignación de atributos define cómo derivar el valor del atributo del token de Google STS desde un token externo. Para cada atributo de token del STS de Google, puedes definir una asignación de atributos, con el siguiente formato:

TARGET_ATTRIBUTE=SOURCE_EXPRESSION

Reemplaza lo siguiente:

  • TARGET_ATTRIBUTE es un atributo del token de STS de Google.
  • SOURCE_EXPRESSION es una expresión Common Expression Language (CEL) que transforma uno o más atributos de los tokens emitidos por tu proveedor de identidad externo

En la siguiente lista, se proporcionan ejemplos de asignación de atributos:

  • Asigna el atributo de aserción sub a google.subject:

    google.subject=assertion.sub
    
  • Concatena varios atributos de aserción:

    google.subject="myprovider::" + assertion.aud + "::" + assertion.sub
    
  • Asigna un atributo de aserción con valor GUID workload_id a un nombre y asigna el resultado a un atributo personalizado llamado attribute.my_display_name:

    attribute.my_display_name={
      "8bb39bdb-1cc5-4447-b7db-a19e920eb111": "Workload1",
      "55d36609-9bcf-48e0-a366-a3cf19027d2a": "Workload2"
    }[assertion.workload_id]
    
  • Usa operadores y funciones lógicas CEL para establecer un atributo personalizado llamado attribute.environment en prod o test, según Amazon Resource Name (ARN):

    attribute.environment=assertion.arn.contains(":instance-profile/Production") ? "prod" : "test"
    
  • Usa la función extract para propagar un atributo personalizado aws_role con el nombre del rol supuesto o, si no se supone ningún rol, con el ARN de la identidad.

    attribute.aws_role=assertion.arn.contains('assumed-role') ? assertion.arn.extract('{account_arn}assumed-role/') + 'assumed-role/' + assertion.arn.extract('assumed-role/{role_name}/') : assertion.arn
    
  • La función split divide una string en el valor del separador proporcionado. Por ejemplo, para extraer el atributo username de un atributo de dirección de correo electrónico mediante la división de su valor en @ y el uso de la primera string, usa la siguiente asignación de atributos:

    attribute.username=assertion.email.split("@")[0]
    

  • La función join une una lista de strings en el valor del separador proporcionado. Por ejemplo, para propagar el atributo personalizado department mediante la concatenación de una lista de strings con . como separador, usa la siguiente asignación de atributos:

    attribute.department=assertion.department.join(".")
    

Para AWS, Google proporciona asignaciones predeterminadas, que abarcan las situaciones más comunes. También puedes proporcionar asignaciones personalizadas.

Para los proveedores de OIDC, debes proporcionar las asignaciones. Para construir la asignación, consulta la documentación del proveedor a fin de obtener una lista de atributos en sus credenciales.

Para obtener más detalles, consulta la documentación de la API del campo attributeMapping.

Condiciones de atributos

Una condición de atributo es una expresión CEL que puede 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.

Puedes usar una condición de atributo para restringir qué identidades pueden autenticarse mediante tu grupo de Workload Identity.

Las condiciones de los atributos son útiles en situaciones como las siguientes:

  • Si tu carga de trabajo usa un proveedor de identidad que está disponible para el público en general, puedes restringir el acceso a fin de que solo las identidades que elijas tengan acceso a tu grupo de Workload Identity.

  • Si usas un proveedor de identidad con varias plataformas en la nube, puedes evitar que las credenciales destinadas a usarse con otra plataforma se usen con Google Cloud, y viceversa. Esto ayuda a evitar el problema de engaño de aplicación delegada.

La condición de atributo de un proveedor de grupos de Workload Identity puede usar la palabra clave assertion, que hace referencia a un mapa que representa la credencial de autenticación emitida por el proveedor de identidad. Puedes usar la notación de puntos para acceder a los valores del mapa. Por ejemplo, las credenciales de AWS incluyen un valor arn, al que puedes acceder como assertion.arn. Además, la condición de atributo puede usar cualquier atributo que se defina en la asignación de atributos del proveedor.

En el siguiente ejemplo, solo se permiten solicitudes de identidades que tienen una función específica de AWS:

attribute.aws_role == "ROLE_MAPPING"

Para obtener más detalles, consulta la documentación de la API del campo attributeCondition.

Uso de identidad temporal como cuenta de servicio

El flujo de intercambio de tokens muestra un token de acceso federado. Puedes usar este token para actuar como una cuenta de servicio y obtener un token de acceso de OAuth 2.0 de corta duración. El token de acceso de corta duración te permite llamar a cualquier API de Google Cloud a la que tenga acceso la cuenta de servicio.

Para actuar como una cuenta de servicio, otorga a tu identidad externa la función de usuario de Workload Identity (roles/iam.workloadIdentityUser) en una cuenta de servicio con las funciones que requiere la carga de trabajo. Puedes otorgar una función a todas las identidades en un grupo de Workload Identity o a identidades externas específicas en función de sus atributos.

En la siguiente tabla, se describen situaciones comunes para otorgar funciones:

Identidades Formato del identificador
Identidad única principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT_ATTRIBUTE_VALUE
Todas las identidades de un grupo principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP_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

¿Qué sigue?