Workload Identity


Workload Identity est la solution 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.

Pour en savoir plus sur l'activation et l'utilisation de Workload Identity dans GKE, consultez la page Utiliser Workload Identity.

Vous pouvez utiliser l'identité de charge de travail de parc pour assurer la compatibilité avec la fédération d'identité de charge de travail pour les clusters enregistrés dans des parcs, y compris les clusters Anthos.

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 Workload Identity ?

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.

Workload Identity permet à un compte de service Kubernetes de votre cluster GKE d'agir en tant que compte de service IAM. Les pods qui utilisent le compte de service Kubernetes configuré s'authentifient automatiquement en tant que compte de service IAM lorsqu'ils accèdent aux API Google Cloud. L'utilisation de Workload Identity vous permet d'attribuer des identités et une autorisation distinctes et précises pour chaque application de votre cluster.

Avec Workload Identity, vous n'avez pas besoin d'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 Workload Identity.

Fonctionnement de Workload Identity

Lorsque vous activez Workload Identity sur un cluster, GKE crée automatiquement 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 du compte de service Kubernetes. L'activation de Workload Identity n'accorde à vos charges de travail aucune autorisation IAM par défaut.

Lorsque vous configurez un compte de service Kubernetes dans un espace de noms afin qu'il utilise Workload Identity, IAM authentifie les identifiants avec le nom de membre suivant :

serviceAccount:PROJECT_ID.svc.id.goog[KUBERNETES_NAMESPACE/KUBERNETES_SERVICE_ACCOUNT]

Dans ce nom de membre :

  • PROJECT_ID : ID de votre projet Google Cloud.
  • KUBERNETES_NAMESPACE : espace de noms du compte de service Kubernetes.
  • KUBERNETES_SERVICE_ACCOUNT : nom du compte de service Kubernetes qui envoie la requête.

Le processus de configuration de Workload Identity comprend l'utilisation d'une liaison de stratégie IAM pour lier le nom du membre du compte de service Kubernetes à un compte de service IAM disposant des autorisations requises pour vos charges de travail. Tous les appels d'API Google Cloud provenant de charges de travail utilisant ce compte de service Kubernetes sont authentifiés en tant que compte de service IAM lié.

Uniformité de l'identité

Le nom de membre utilisé par IAM pour vérifier un compte de service Kubernetes avec Workload Identity utilise les variables suivantes :

  • Nom du compte de service Kubernetes.
  • Espace de noms du compte de service Kubernetes.
  • ID de projet Google Cloud.

Si votre projet comporte plusieurs clusters portant le même nom et le même espace de noms pour un compte de service Kubernetes, tous les comptes sont associés au même nom de membre. Cette identité commune vous permet d'accorder l'accès aux ressources Google Cloud au pool d'identités de charge de travail plutôt qu'à des clusters individuels.

Par exemple, considérons le diagramme suivant. Les clusters A, B et C appartiennent au même projet Google Cloud et, par conséquent, au même pool d'identités de charge de travail. Les applications de l'espace de noms backend du cluster A et du cluster B peuvent s'authentifier en tant que compte de service IAM back lors de l'accès aux ressources Google Cloud. 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
Uniformité des identités qui accèdent aux API Google Cloud avec Workload Identity

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 IAM back, 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 nom de membre commun.

Comprendre le serveur de métadonnées GKE

Chaque nœud d'un cluster GKE sur lequel Workload Identity est activé 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 propres à Workload Identity

  • 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.

  • Workload Identity ne peut pas être utilisé par des pods en cours d'exécution sur le réseau hôte. Les requêtes envoyées par ces pods aux points de terminaison des métadonnées sont acheminées vers le serveur de métadonnées Compute Engine.

  • 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 Workload Identity 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.

  • Workload Identity doit être configuré manuellement pour que Cloud Run for Anthos continue à générer des métriques de requêtes.

  • Workload Identity définit une limite de 200 connexions au serveur de métadonnées GKE pour chaque nœud, ce 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.

  • Workload Identity 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 à Workload Identity

Vous pouvez utiliser l'une des alternatives suivantes à Workload Identity pour accéder aux API Google Cloud à partir de GKE.

  • Exportez les clés de compte de service et stockez-les en tant que secrets Kubernetes. Les clés de compte de service Google n'expirent pas et nécessitent une rotation manuelle. L'exportation de clés de compte de service permet d'élargir le champ d'application d'une brèche de sécurité si celle-ci n'a pas été détectée. En cas de vol d'une clé exportée, un pirate informatique peut l'utiliser pour s'authentifier en tant que compte de service jusqu'à ce que vous constatiez et révoquiez manuellement la clé.

  • Utilisez le compte de service par défaut Compute Engine de vos nœuds. Vous pouvez exécuter des pools de nœuds en tant que compte de service IAM dans votre projet. Si vous ne spécifiez pas de compte de service lors de la création du pool de nœuds, GKE utilise le compte de service Compute Engine par défaut du projet. Le compte de service Compute Engine est partagé par toutes les charges de travail déployées sur ce nœud. Cela peut entraîner un surprovisionnement des autorisations, ce qui est contraire au principe du moindre privilège et est inapproprié pour les clusters mutualisés.

Étape suivante