Acerca de Workload Identity Federation para GKE


En esta página se explica Workload Identity Federation para GKE, incluido su funcionamiento, cómo afecta a tus clústeres de GKE y cómo asignar roles a entidades de Kubernetes en políticas de gestión de identidades y accesos. En la mayoría de los casos, se recomienda usar Workload Identity Federation para que tus cargas de trabajo que se ejecutan en GKE accedan a los servicios de Google Cloud de forma segura y fácil de gestionar.

Esta página está dirigida a especialistas en seguridad y operadores que gestionan cargas de trabajo en GKE que requieren acceso a otros servicios de Google Cloud . Para obtener más información sobre los roles habituales y las tareas de ejemplo a las que hacemos referencia en el contenido, consulta Roles y tareas habituales de los usuarios de GKE. Google Cloud

Antes de leer esta página, asegúrate de que conoces los siguientes recursos:

Terminología

En esta página se distinguen las cuentas de servicio de Kubernetes y las cuentas de servicio de Gestión de Identidades y Accesos (IAM).

Cuentas de servicio de Kubernetes
Recursos de Kubernetes que proporcionan una identidad a los procesos que se ejecutan en tus pods de GKE.
Cuentas de servicio de gestión de identidades y accesos
Google Cloud recursos que permiten a las aplicaciones hacer llamadas autorizadas a las Google Cloud APIs.

¿Qué es Workload Identity Federation para GKE?

Las aplicaciones que se ejecutan en GKE pueden necesitar acceso a Google Cloud APIs, como la API de Compute Engine, la API Storage de BigQuery o las APIs de aprendizaje automático.

La federación de identidades de carga de trabajo para GKE te permite usar políticas de IAM para conceder acceso a las cargas de trabajo de Kubernetes de tu clúster de GKE a APIs específicas deGoogle Cloud sin necesidad de configuración manual ni de métodos menos seguros, como los archivos de claves de cuentas de servicio. Si usas Workload Identity Federation for GKE, puedes asignar identidades y autorizaciones distintas y detalladas a cada aplicación de tu clúster.

Workload Identity Federation para GKE sustituye a la necesidad de usar el encubrimiento de metadatos. Los metadatos sensibles protegidos por el ocultamiento de metadatos también están protegidos por Workload Identity Federation para GKE.

Workload Identity Federation para GKE está disponible a través de Workload Identity Federation de IAM, que proporciona identidades para cargas de trabajo que se ejecutan en entornos internos y externos Google Cloud. Puedes usar la federación de identidades de carga de trabajo de IAM para autenticarte de forma segura en las APIs compatibles Google Cloud desde cargas de trabajo que se ejecutan en AWS, Azure y Kubernetes autogestionado, entre otros. En GKE,Google Cloud gestiona el grupo y el proveedor de identidades de carga de trabajo por ti y no requiere un proveedor de identidades externo.

Cómo funciona Workload Identity Federation para GKE

Cuando habilitas Workload Identity Federation para GKE en un clúster, GKE hace lo siguiente:

  • Crea un grupo de identidades de carga de trabajo fijo para el proyecto del clúster Google Cloud con el siguiente formato:

    PROJECT_ID.svc.id.goog
    

    El grupo de identidades de carga de trabajo proporciona un formato de nomenclatura que permite a IAM comprender y confiar en las credenciales de Kubernetes. GKE no elimina este grupo de identidades de carga de trabajo aunque elimines todos los clústeres de tu proyecto.

  • Registra el clúster de GKE como proveedor de identidades en el grupo de identidades de carga de trabajo.

  • Implementa el servidor de metadatos de GKE, que intercepta las solicitudes de credenciales de las cargas de trabajo, en todos los nodos.

Crear políticas de gestión de identidades y accesos de permiso en Google Cloud recursos

Para proporcionar acceso con la federación de identidades de carga de trabajo para GKE, crea una política de permisos de IAM que conceda acceso a un Google Cloud recurso específico a una entidad principal que corresponda a la identidad de tu aplicación. Por ejemplo, puedes dar permisos de lectura en un segmento de Cloud Storage a todos los pods que usen la database-reader cuenta de servicio de Kubernetes.

Para ver una lista de los recursos que admiten políticas de permiso, consulta Tipos de recursos que aceptan políticas de permiso.

Usar condiciones en políticas de gestión de identidades y accesos

También puedes limitar el alcance del acceso definiendo condiciones en tus políticas de permiso. Las condiciones son un método extensible para especificar cuándo se debe aplicar una política de permiso. Por ejemplo, puedes usar condiciones para conceder acceso temporal a una carga de trabajo en un recurso Google Cloud específico, lo que elimina la necesidad de gestionar ese acceso manualmente.

Las condiciones también pueden ser útiles si configuras tus políticas de permiso a nivel de proyecto, carpeta u organización en lugar de en recursos específicos, como secretos de Secret Manager o segmentos de Cloud Storage.

Para añadir una condición a tu política de permisos, consulta los siguientes recursos:

Las siguientes expresiones de ejemplo corresponden a situaciones habituales en las que puede usar condiciones. Para ver una lista de los atributos disponibles en las expresiones, consulta la referencia de atributos de las condiciones de gestión de identidades y accesos.

Ejemplos de expresiones de condición
Permitir el acceso antes de la hora especificada
request.time < timestamp('TIMESTAMP')

Sustituye TIMESTAMP por una marca de tiempo en UTC, como 2024-08-30T00:00:00.000Z.

Permite el acceso si el recurso de la solicitud tiene la etiqueta especificada
resource.matchTag('TAG_KEY', 'TAG_VALUE')

Haz los cambios siguientes:

  • TAG_KEY: la clave de la etiqueta que se va a buscar, como env
  • TAG_VALUE: el valor de la etiqueta, como dev

Hacer referencia a recursos de Kubernetes en políticas de gestión de identidades y accesos

En tu política de gestión de identidades y accesos, haces referencia a un recurso de Kubernetes mediante un identificador de principal de gestión de identidades y accesos para seleccionar el recurso. Este identificador tiene la siguiente sintaxis:

PREFIX://iam.googleapis.com/projects/1234567890/locations/global/workloadIdentityPools/example-project.svc.id.goog/SELECTOR

En este ejemplo, tenemos los siguientes campos:

  • PREFIX: debe ser principal o principalSet en función del recurso que selecciones. principal es para un recurso específico, como una sola ServiceAccount. principalSet se usa para varios recursos que pertenecen al recurso especificado, como todos los pods de un clúster concreto.
  • SELECTOR: cadena que selecciona un tipo de principal. Por ejemplo, kubernetes.serviceaccount.uid/SERVICEACCOUNT_UID selecciona un ServiceAccount por su UID.

En la siguiente tabla se muestran los tipos de principales admitidos en GKE:

Tipo de identificador principal Sintaxis
Todos los pods que usan una cuenta de servicio de Kubernetes específica Selecciona la cuenta de servicio por nombre:
principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/SERVICEACCOUNT

Haz los cambios siguientes:

  • PROJECT_NUMBER: tu número de proyecto. Para obtener el número de proyecto, consulta el artículo sobre cómo identificar proyectos.
  • PROJECT_ID: tu ID de proyecto Google Cloud .
  • NAMESPACE: el espacio de nombres de Kubernetes.
  • SERVICEACCOUNT: el nombre de la cuenta de servicio de Kubernetes.

Selecciona la cuenta de servicio por UID:
principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/kubernetes.serviceaccount.uid/SERVICEACCOUNT_UID

Haz los cambios siguientes:

  • PROJECT_NUMBER: tu número de proyecto. Para obtener el número de proyecto, consulta el artículo sobre cómo identificar proyectos.
  • PROJECT_ID: tu ID de proyecto Google Cloud .
  • SERVICEACCOUNT_UID: el UID del objeto ServiceAccount en el servidor de la API.
Todos los pods de un espacio de nombres, independientemente de la cuenta de servicio o del clúster
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/namespace/NAMESPACE

Haz los cambios siguientes:

  • PROJECT_NUMBER: tu número de proyecto. Para obtener el número de proyecto, consulta el artículo sobre cómo identificar proyectos.
  • PROJECT_ID: tu ID de proyecto Google Cloud .
  • NAMESPACE: el espacio de nombres de Kubernetes.
Todos los pods de un clúster específico
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/kubernetes.cluster/https://container.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/clusters/CLUSTER_NAME

Haz los cambios siguientes:

  • PROJECT_NUMBER: tu número de proyecto. Para obtener el número de proyecto, consulta el artículo sobre cómo identificar proyectos.
  • PROJECT_ID: tu ID de proyecto Google Cloud .
  • CLUSTER_NAME: el nombre de tu clúster de GKE.
  • LOCATION: la ubicación de tu clúster.

Flujo de credenciales

Cuando una carga de trabajo envía una solicitud para acceder a una API (por ejemplo, al usar una biblioteca de cliente), se siguen estos pasos de autenticación: Google Cloud Google Cloud

Cómo obtiene una carga de trabajo un token de cuenta de servicio de gestión de identidades y accesos con Workload Identity.
Ilustración 1: Cómo obtiene una carga de trabajo un token de acceso federado con Workload Identity Federation para GKE.
  1. Las credenciales predeterminadas de la aplicación (ADC) solicitan un Google Cloud token de acceso al servidor de metadatos de Compute Engine que se ejecuta en la VM.
  2. El servidor de metadatos de GKE intercepta la solicitud de token y pide al servidor de la API de Kubernetes un token de cuenta de servicio de Kubernetes que identifique la carga de trabajo que realiza la solicitud. Esta credencial es un token web JSON (JWT) firmado por el servidor de la API.
  3. El servidor de metadatos de GKE usa el servicio de tokens de seguridad para intercambiar el JWT por un token de acceso federado de corta duración que hace referencia a la identidad de la carga de trabajo de Kubernetes.

El token de acceso federado que devuelve el servicio de tokens de seguridad puede tener limitaciones al intentar acceder a algunos Google Cloud servicios, tal como se describe en Productos admitidos y limitaciones. Si el servicio que has seleccionado tiene limitaciones, puedes configurar opcionalmente la suplantación de identidad de la cuenta de servicio. Google Cloud Este método genera un token de acceso para una cuenta de servicio de gestión de identidades y accesos que tu carga de trabajo puede usar para acceder al servicio de destino. Para obtener más información, consulta el artículo sobre cómo vincular cuentas de servicio de Kubernetes a IAM.

La carga de trabajo puede acceder a cualquier API a la que pueda acceder el identificador principal de IAM de la carga de trabajo. Google Cloud

Cuota de la API Exchange Token en Security Token Service

La API Exchange Token del servicio de tokens de seguridad tiene un límite de cuota de 6000 solicitudes por minuto. Si se producen errores QUOTA_EXCEEDED, puedes solicitar un aumento de la cuota Token exchange requests per minute a través de la página Cuotas y límites del sistema.

Identidad idéntica

Si los metadatos del identificador principal son los mismos para las cargas de trabajo de varios clústeres que comparten un grupo de identidades de carga de trabajo porque pertenecen al mismo proyecto, IAM identifica esas cargas de trabajo como la misma. Google Cloud Por ejemplo, si tienes el mismo espacio de nombres en dos clústeres y concedes acceso a ese espacio de nombres en IAM, las cargas de trabajo de ese espacio de nombres en ambos clústeres obtendrán ese acceso. Puedes limitar este acceso a clústeres específicos mediante políticas de gestión de identidades y accesos condicionales.

Por ejemplo, consulta el siguiente diagrama. Los clústeres A y B pertenecen al mismo grupo de identidades de carga de trabajo. Google Cloud identifica las aplicaciones que usan la back-ksa ServiceAccount en el espacio de nombres backend de los clústeres A y B como la misma identidad. IAM no distingue entre los clústeres que realizan las llamadas.

Diagrama que ilustra la igualdad de identidades en un grupo de identidades de carga de trabajo
Figura 2: Acceso a APIs con la misma identidad Google Cloud mediante Workload Identity Federation para GKE.

Esta igualdad de identidad también significa que debes poder confiar en todos los clústeres de un grupo de identidades de carga de trabajo específico. Por ejemplo, si un equipo no fiable fuera el propietario de un nuevo clúster, el clúster C del ejemplo anterior, podría crear un espacio de nombres backend y acceder Google Cloud a las APIs mediante la back-ksa ServiceAccount, al igual que el clúster A y el clúster B.

Para evitar el acceso no fiable, coloque sus clústeres en proyectos independientes para asegurarse de que obtengan grupos de identidades de carga de trabajo diferentes o de que los nombres de los espacios de nombres sean distintos entre sí para evitar un identificador principal común.

Servidor de metadatos de GKE

Cada nodo de un clúster de GKE con Workload Identity Federation for GKE habilitado almacena sus metadatos en el servidor de metadatos de GKE. El servidor de metadatos de GKE es un subconjunto de los endpoints del servidor de metadatos de Compute Engine necesarios para las cargas de trabajo de Kubernetes.

El servidor de metadatos de GKE se ejecuta como un DaemonSet, con un pod en cada nodo de Linux o un servicio nativo de Windows en cada nodo de Windows del clúster. El servidor de metadatos intercepta las solicitudes HTTP a http://metadata.google.internal (169.254.169.254:80). Por ejemplo, la solicitud GET /computeMetadata/v1/instance/service-accounts/default/token obtiene un token para la cuenta de servicio de gestión de identidades y accesos que se ha configurado para que el pod suplante. El tráfico al servidor de metadatos de GKE nunca sale de la instancia de VM que aloja el pod.

Tiempo de vida del token

De forma predeterminada, el token de acceso devuelto tiene una duración de 1 hora (3600 segundos). Para reducir la latencia del cliente, el servidor de metadatos de GKE almacena en caché los tokens de acceso. En algunos casos, el token almacenado en caché que devuelve el servidor de metadatos puede estar cerca de su hora de vencimiento.

Las bibliotecas de cliente de Cloud tienen una lógica integrada que, de forma predeterminada, comprueba si el token de acceso caduca en los próximos 3 minutos y 45 segundos. Si el token está dentro del periodo de validez, GKE lo actualiza. Las llamadas a la API consecutivas pueden usar el token actualizado.

Si usas tu propio código para acceder directamente a las APIs de Google Cloud , implementa una lógica similar para gestionar la caducidad de los tokens. Tu código debe hacer lo siguiente:

  1. Comprueba si el token de acceso caduca al cabo de 3 minutos y 45 segundos. El parámetro exp de la carga útil del token indica la marca de tiempo de caducidad del token.
  2. Si el token va a caducar en los próximos 3 minutos y 45 segundos, haz una solicitud de token.

En las siguientes tablas se describe el subconjunto de endpoints del servidor de metadatos de Compute Engine que están disponibles con el servidor de metadatos de GKE. Para ver una lista completa de los endpoints disponibles en el servidor de metadatos de Compute Engine, consulta Valores de metadatos de VM predeterminados.

Metadatos de instancias

Los metadatos de instancia se almacenan en el siguiente directorio.

http://metadata.google.internal/computeMetadata/v1/instance/

Entrada Descripción
hostname

El nombre de host de tu nodo.

id

El ID único de tu nodo.

service-accounts/

Un directorio de cuentas de servicio asociadas al nodo. Para cada cuenta de servicio, se muestra la siguiente información:

  • aliases
  • email: la dirección de correo de la cuenta de servicio.
  • identity: un JSON Web Token (JWT) único del nodo. Debe incluir el parámetro audience en su solicitud. Por ejemplo, ?audience=http://www.example.com.
  • scopes: los ámbitos de acceso asignados a la cuenta de servicio.
  • token: el token de acceso de OAuth 2.0 para autenticar tus cargas de trabajo.
zone

La zona de Compute Engine de tu nodo de GKE.

Atributos de instancia

Los atributos de instancia se almacenan en el siguiente directorio.

http://metadata.google.internal/computeMetadata/v1/instance/attributes/

Entrada Descripción
cluster-location

La zona o la región de Compute Engine de tu clúster.

cluster-name

El nombre de tu clúster de GKE.

cluster-uid

El UID de tu clúster de GKE.

Los atributos que se indican en la tabla son los únicos que se admiten. Si intentas acceder a algún atributo no admitido, el gke-metadata-server pod del espacio de nombres kube-system genera y registra un error 404. El error es similar al siguiente:

HTTP/404: generic::not_found: no child "", Reason: "NOT_FOUND", UserMessage: "Not Found"

Si usas istio-proxy, verás un mensaje de error como el siguiente:

Error fetching GCP Metadata property gcp_gce_instance_template: metadata: GCE metadata "instance/attributes/UNSUPPORTED_ATTRIBUTE" not defined

Metadatos del proyecto

Los metadatos del proyecto de clúster se almacenan en el siguiente directorio.

http://metadata.google.internal/computeMetadata/v1/project/

Entrada Descripción
project-id

El ID de tu proyecto Google Cloud .

numeric-project-id

Tu número de proyecto de Google Cloud .

Restricciones de Workload Identity Federation para GKE

  • No puedes cambiar el nombre del grupo de identidades de carga de trabajo que crea GKE para tu Google Cloud proyecto.

  • Cuando GKE habilita el servidor de metadatos de GKE en un grupo de nodos, los pods ya no pueden acceder al servidor de metadatos de Compute Engine. En su lugar, el servidor de metadatos de GKE intercepta las solicitudes que se hacen desde estos pods a los endpoints de metadatos, excepto los pods que se ejecutan en la red del host.

  • Cuando se usa el controlador CSI de Cloud Storage FUSE con clústeres de GKE estándar con la versión 1.33.3-gke.1226000 o posterior, los pods que se ejecutan en la red del host (hostNetwork: true) pueden autenticarse con su propia cuenta de servicio de Kubernetes. Para obtener más información, consulta Configurar el acceso para pods con la red del host.

  • El servidor de metadatos de GKE tarda unos segundos en empezar a aceptar solicitudes en un pod recién creado. Por lo tanto, los intentos de autenticación mediante Workload Identity Federation for GKE durante los primeros segundos de la vida de un pod pueden fallar. Si vuelves a intentarlo, se solucionará el problema. Consulta Solución de problemas para obtener más información.

  • Los agentes de registro y monitorización integrados de GKE siguen usando la cuenta de servicio del nodo.

  • Workload Identity Federation para GKE requiere una configuración manual para que Knative Serving siga publicando métricas de solicitudes.

  • Workload Identity Federation para GKE establece un límite de 500 conexiones simultáneas al servidor de metadatos de GKE por cada nodo. Las llamadas simultáneas adicionales que superen este límite se colocan en una cola de espera para procesarse más adelante. Este mecanismo de colas puede provocar errores de HTTP/499 si se alcanza el tiempo de espera del cliente antes de que el servidor de metadatos de GKE pueda procesar la solicitud.

  • Workload Identity Federation para GKE para nodos de Windows Server está disponible en las versiones 1.18.16-gke.1200, 1.19.8-gke.1300 y 1.20.4-gke.1500 de GKE, así como en versiones posteriores.

  • El servidor de metadatos de GKE usa recursos de memoria proporcionales al número total de cuentas de servicio de Kubernetes de tu clúster. Si tu clúster tiene más de 3000 cuentas de servicio de Kubernetes, es posible que kubelet finalice los pods del servidor de metadatos. Para obtener información sobre las medidas de mitigación, consulta la sección Solución de problemas.

  • Workload Identity Federation para GKE funciona dentro de un perímetro de Controles de Servicio de VPC, lo que permite acceder a los recursos que contiene. Sin embargo, Controles de Servicio de VPC no aplica el control de acceso a las solicitudes entre perímetros en función de estas identidades federadas. Puedes usar la suplantación de identidad de cuenta de servicio para acceder a recursos de otro perímetro.

Alternativas a Workload Identity Federation para GKE

Puedes usar una de las siguientes alternativas a Workload Identity Federation para GKE para acceder a las APIs desde GKE.Google Cloud Te recomendamos que uses la federación de Workload Identity para GKE, ya que las alternativas requieren que hagas ciertos sacrificios en materia de seguridad.

Siguientes pasos