À propos de la fédération d'identité de charge de travail pour GKE


La fédération d'identité de charge de travail pour GKE est la méthode recommandée pour que vos charges de travail s'exécutant sur Google Kubernetes Engine (GKE) puissent accéder aux services Google Cloud de manière sécurisée et gérable.

La fédération d'identité de charge de travail pour GKE est disponible via la fédération d'identité de charge de travail IAM, qui fournit des identités pour les charges de travail exécutées dans des environnements internes et externes à Google Cloud. Vous pouvez utiliser la fédération d'identité de charge de travail IAM pour vous authentifier de manière sécurisée auprès des API Google Cloud compatibles à partir de charges de travail exécutées, par exemple, sur AWS, Azure, et Kubernetes autogéré. Dans GKE, Google Cloud gère automatiquement le pool d'identités de charge de travail et le fournisseur, et ne nécessite pas de fournisseur d'identité externe.

Terminologie

Ce document distingue les comptes de service Kubernetes et les comptes de service Identity and Access Management (IAM).

Comptes de service Kubernetes
Ressources Kubernetes fournissant une identité pour les processus exécutés dans vos pods GKE.
Comptes de service IAM
Ressources Google Cloud permettant aux applications d'effectuer des appels autorisés vers les API Google Cloud.

Qu'est-ce que la fédération d'identité de charge de travail pour GKE ?

Les applications exécutées sur GKE peuvent avoir besoin d'accéder aux API Google Cloud telles que Compute Engine, BigQuery Storage ou Machine Learning.

La fédération d'identité de charge de travail pour GKE vous permet d'utiliser des stratégies IAM pour accorder aux charges de travail Kubernetes de votre cluster GKE l'accès à des API Google Cloud spécifiques sans avoir à recourir à une configuration manuelle ou à des méthodes moins sécurisées telles que les fichiers de clé de compte de service. La fédération d'identité de charge de travail pour GKE vous permet d'attribuer des identités et des autorisations distinctes et précises pour chaque application de votre cluster.

La fédération d'identité de charge de travail pour GKE évite d'avoir à utiliser la dissimulation de métadonnées. Les métadonnées sensibles protégées par la dissimulation de métadonnées sont également protégées par la fédération d'identité de charge de travail pour GKE.

Fonctionnement de la fédération d'identité de charge de travail pour GKE

Lorsque vous activez la fédération d'identité de charge de travail pour GKE sur un cluster, GKE effectue les opérations suivantes :

  • Crée un pool d'identités de charge de travail fixe pour le projet Google Cloud du cluster au format suivant :

    PROJECT_ID.svc.id.goog
    

    Le pool d'identités de charge de travail fournit un format de nom qui permet à IAM de comprendre et d'approuver les identifiants Kubernetes.

  • Enregistre le cluster GKE en tant que fournisseur d'identité dans le pool d'identités de charge de travail.

  • Déploie le serveur de métadonnées GKE, qui intercepte les demandes d'identifiants provenant de charges de travail sur chaque nœud.

Créer des stratégies d'autorisation IAM sur des ressources Google Cloud

Pour fournir un accès avec la fédération d'identité de charge de travail pour GKE, vous devez créer une stratégie d'autorisation IAM qui accorde l'accès à une ressource Google Cloud spécifique à un compte principal correspondant à l'identité de votre application. Vous pouvez par exemple accorder des autorisations de lecture sur un bucket Cloud Storage à tous les pods utilisant le compte de service Kubernetes database-reader.

Pour obtenir la liste des ressources compatibles avec les stratégies d'autorisation, consultez la section Types de ressources compatibles avec les stratégies d'autorisation.

Vous pouvez également limiter le niveau d'accès en définissant des conditions dans vos stratégies d'autorisation. Par exemple, si vous souhaitez uniquement accorder un accès en lecture sur un bucket aux pods qui utilisent le compte de service database-reader dans le cluster mysql, vous pouvez définir cette condition dans votre stratégie d'autorisation. Pour en savoir plus sur l'utilisation des conditions dans les stratégies d'autorisation, consultez la section Gérer les liaisons de rôles conditionnelles.

Référencer les ressources Kubernetes dans les stratégies IAM

Dans votre stratégie IAM, vous faites référence à une ressource Kubernetes en utilisant un identifiant de compte principal IAM pour la sélectionner. Cet identifiant utilise la syntaxe suivante :

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

Dans cet exemple, examinez les champs suivants :

  • PREFIX : doit être principal ou principalSet en fonction de la ressource que vous sélectionnez. principal correspond à une ressource spécifique, comme un compte de service unique. principalSet correspond à plusieurs ressources appartenant à la ressource spécifiée, comme tous les pods d'un cluster spécifique.
  • SELECTOR : chaîne qui sélectionne un type de compte principal. Par exemple, kubernetes.serviceaccount.uid/SERVICEACCOUNT_UID sélectionne un compte de service en fonction de son UID.

Le tableau suivant présente les types de comptes principaux compatibles avec GKE :

Type d'identifiant de compte principal Syntaxe
Tous les pods qui utilisent un compte de service Kubernetes spécifique Sélectionner le compte de service par nom :
principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/SERVICEACCOUNT

Remplacez les éléments suivants :

  • PROJECT_NUMBER : identifiant numérique de votre projet. Pour obtenir le numéro de projet, consultez la section Identifier des projets.
  • PROJECT_ID : ID de votre projet Google Cloud.
  • NAMESPACE : espace de noms Kubernetes.
  • SERVICEACCOUNT : nom du compte de service Kubernetes.

Sélectionner le compte de service par UID :
principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/kubernetes.serviceaccount.uid/SERVICEACCOUNT_UID

Remplacez les éléments suivants :

  • PROJECT_NUMBER : identifiant numérique de votre projet. Pour obtenir le numéro de projet, consultez la section Identifier des projets.
  • PROJECT_ID : ID de votre projet Google Cloud.
  • SERVICEACCOUNT_UID : UID de l'objet ServiceAccount sur le serveur d'API.
Tous les pods d'un cluster spécifique
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

Remplacez les éléments suivants :

  • PROJECT_NUMBER : identifiant numérique de votre projet. Pour obtenir le numéro de projet, consultez la section Identifier des projets.
  • PROJECT_ID : ID de votre projet Google Cloud.
  • CLUSTER_NAME : nom de votre cluster GKE.
  • LOCATION : emplacement de votre cluster.

Flux des identifiants

Lorsqu'une charge de travail envoie une requête d'accès à une API Google Cloud, par exemple lors de l'utilisation d'une bibliothèque cliente Google Cloud, les étapes d'authentification suivantes se produisent :

Comment une charge de travail obtient-elle un jeton de compte de service IAM avec Workload Identity ?
Figure 1 : Comment une charge de travail obtient un jeton d'identité fédérée avec la fédération d'identité de charge de travail pour GKE ?
  1. Les identifiants par défaut de l'application demandent un jeton d'accès Google Cloud au serveur de métadonnées Compute Engine qui s'exécute sur la VM.
  2. Le serveur de métadonnées GKE intercepte la requête de jeton et demande au serveur d'API Kubernetes un jeton Kubernetes ServiceAccount qui identifie la charge de travail à l'origine de la requête. Cet identifiant est un jeton Web JSON (JWT) signé par le serveur d'API.
  3. Le serveur de métadonnées GKE utilise Security Token Service pour échanger le jeton JWT contre un jeton d'accès Google Cloud fédéré de courte durée qui fait référence à l'identité de la charge de travail Kubernetes.
  4. Le serveur de métadonnées GKE fournit le jeton d'accès fédéré à la charge de travail.

La charge de travail peut ensuite accéder à toutes les API Google Cloud auxquelles l'identifiant principal IAM de la charge de travail peut accéder.

Uniformité de l'identité

Si les métadonnées de votre identifiant principal sont les mêmes pour les charges de travail de plusieurs clusters qui partagent un pool d'identités de charge de travail car elles appartiennent au même projet Google Cloud, IAM identifie ces charges de travail comme étant les mêmes. Par exemple, si vous avez le même espace de noms dans deux clusters et que vous accordez l'accès à cet espace de noms dans IAM, les charges de travail dans cet espace de noms dans les deux clusters obtiennent cet accès. Vous pouvez limiter cet accès à des clusters spécifiques à l'aide de stratégies IAM conditionnelles.

Par exemple, considérons le diagramme suivant. Les clusters A, B et C appartiennent au même pool d'identités de charge de travail. Google Cloud identifie les applications qui utilisent le compte de service back-ksa dans l'espace de noms backend du cluster A et du cluster B comme étant la même identité. IAM ne fait pas la distinction entre les clusters qui effectuent les appels.

Schéma illustrant l'uniformité des identités dans un pool d'identités de charge de travail
Figure 2 : Uniformité des identités accédant aux API Google Cloud avec la fédération d'identité de charge de travail pour GKE

Cette uniformisation de l'identité signifie également que vous devez pouvoir approuver chaque cluster dans un pool d'identités de charge de travail spécifique. Par exemple, si le cluster C de l'exemple précédent appartient à une équipe non approuvée, il est possible de créer un espace de noms backend et d'accéder aux API Google Cloud à l'aide du compte de service back-ksa, comme pour le cluster A et le cluster B.

Pour éviter tout accès non approuvé, placez vos clusters dans des projets distincts afin de vous assurer qu'ils obtiennent des pools d'identités de charge de travail différents, ou assurez-vous que les noms d'espace de noms sont distincts les uns des autres pour éviter un identifiant principal commun.

Comprendre le serveur de métadonnées GKE

Chaque nœud d'un cluster GKE sur lequel la fédération d'identité de charge de travail pour GKE est activée stocke ses métadonnées sur le serveur de métadonnées GKE. Le serveur de métadonnées GKE est un sous-ensemble des points de terminaison du serveur de métadonnées Compute Engine requis pour les charges de travail Kubernetes.

Le serveur de métadonnées GKE s'exécute en tant que DaemonSet, avec un pod sur chaque nœud Linux ou un service Windows natif sur chaque nœud Windows du cluster. Le serveur de métadonnées intercepte les requêtes HTTP envoyées à http://metadata.google.internal (169.254.169.254:80). Par exemple, la requête GET /computeMetadata/v1/instance/service-accounts/default/token récupère un jeton pour le compte de service IAM dont le pod doit emprunter l'identité d'après sa configuration. Le trafic vers le serveur de métadonnées GKE ne quitte jamais l'instance de VM qui héberge le pod.

Les tableaux suivants décrivent le sous-ensemble de points de terminaison du serveur de métadonnées Compute Engine disponibles avec le serveur de métadonnées GKE. Pour obtenir la liste complète des points de terminaison disponibles sur le serveur de métadonnées Compute Engine, consultez la page Valeurs de métadonnées de VM par défaut.

Métadonnées de l'instance

Les métadonnées d'instance sont stockées dans le répertoire suivant.

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

Entrée Description
hostname

Nom d'hôte de votre nœud.

id

ID unique du nœud.

service-accounts/

Répertoire des comptes de service associés au nœud. Pour chaque compte de service, les informations suivantes sont disponibles :

  • aliases
  • email : adresse e-mail associée au compte de service.
  • identity : jeton Web JSON (JWT) unique au nœud. Vous devez inclure le paramètre audience dans votre requête. Exemple : ?audience=http://www.example.com.
  • scopes : niveaux d'accès attribués au compte de service.
  • token : jeton d'accès OAuth 2.0 pour authentifier vos charges de travail.
zone

Zone Compute Engine de votre nœud GKE.

Attributs des instances

Les attributs d'instance sont stockés dans le répertoire suivant.

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

Entrée Description
cluster-location

Zone ou région Compute Engine de votre cluster.

cluster-name

Nom de votre cluster GKE.

cluster-uid

UID de votre cluster GKE.

Métadonnées du projet

Les métadonnées du projet de cluster sont stockées dans le répertoire suivant.

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

Entrée Description
project-id

L'ID de votre projet Google Cloud.

numeric-project-id

Numéro de votre projet Google Cloud.

Restrictions liées à la fédération d'identité de charge de travail pour GKE

  • Vous ne pouvez pas modifier le nom du pool d'identités de charge de travail créé par GKE pour votre projet Google Cloud.

  • Lorsque GKE active le serveur de métadonnées GKE sur un pool de nœuds, les pods ne peuvent plus accéder au serveur de métadonnées Compute Engine. Au lieu de cela, le serveur de métadonnées GKE intercepte les requêtes émises depuis ces pods vers les points de terminaison des métadonnées, à l'exception des pods s'exécutant sur le réseau hôte.

  • Le serveur de métadonnées GKE met quelques secondes pour commencer à accepter des requêtes sur un pod créé récemment. Par conséquent, les tentatives d'authentification à l'aide de la fédération d'identité de charge de travail pour GKE ayant lieu dans les premières secondes de la vie d'un pod peuvent échouer. Une nouvelle tentative d'appel permet de résoudre le problème. Consultez la section Dépannage pour plus d'informations.

  • Les agents de journalisation et de surveillance intégrés à GKE continuent à utiliser le compte de service du nœud.

  • La fédération d'identité de charge de travail pour GKE nécessite une configuration manuelle pour que la diffusion Knative continue à générer des métriques de requêtes.

  • La fédération d'identité de charge de travail pour GKE définit une limite de 200 connexions au serveur de métadonnées GKE pour chaque nœud, afin d'éviter les problèmes de mémoire. Vous risquez de subir des expirations de délais si vos nœuds dépassent cette limite.

  • La fédération d'identité de charge de travail pour GKE pour les nœuds Windows Server est disponible dans les versions GKE 1.18.16-gke.1200, 1.19.8-gke.1300, 1.20.4-gke.1500 et ultérieures.

  • Le serveur de métadonnées GKE utilise une quantité de ressources mémoire proportionnelle au nombre total de comptes de service Kubernetes dans votre cluster. Si votre cluster contient plus de 3 000 comptes de service Kubernetes, le kubelet peut mettre fin aux pods du serveur de métadonnées. Pour découvrir les mesures d'atténuation des erreurs, consultez la section Dépannage.

Alternatives à la fédération d'identité de charge de travail pour GKE

Afin d'accéder aux API Google Cloud à partir de GKE, vous pouvez utiliser l'une des alternatives suivantes à la fédération d'identité de charge de travail pour GKE. Nous vous recommandons d'utiliser la fédération d'identité de charge de travail pour GKE, car ces alternatives nécessitent certains compromis de sécurité.

Étapes suivantes