Ce document explique comment accéder de manière plus sécurisée aux API Google Cloud à partir de vos charges de travail s'exécutant dans des clusters Google Kubernetes Engine (GKE) à l'aide de la fédération d'identité de charge de travail pour GKE. Pour en savoir plus, consultez la page À propos de la fédération d'identité de charge de travail pour GKE.
Avant de commencer
Avant de commencer, effectuez les tâches suivantes :
- Activez l'API Google Kubernetes Engine. Activer l'API Google Kubernetes Engine
- Si vous souhaitez utiliser Google Cloud CLI pour cette tâche, installez puis initialisez gcloud CLI. Si vous avez déjà installé gcloud CLI, assurez-vous de disposer de la dernière version en exécutant la commande
gcloud components update
.
- Assurez-vous que les API Google Cloud auxquelles vous souhaitez accéder sont compatibles avec la fédération d'identité de charge de travail pour GKE. Pour obtenir la liste des API compatibles, consultez la page Produits compatibles et limites. Si l'API n'est pas compatible ou si votre cas d'utilisation est bloqué par les limites de la fédération d'identité de charge de travail pour ce service, consultez la section Autre solution : associer Kubernetes ServiceAccounts à IAM du présent document.
Assurez-vous d'avoir activé l'API d'identifiants de compte de service IAM.
Assurez-vous de disposer des rôles IAM suivants :
roles/container.admin
roles/iam.serviceAccountAdmin
Assurez-vous de bien comprendre les limites de la fédération d'identité de charge de travail pour GKE.
Activer la fédération d'identité de charge de travail pour GKE sur les clusters et les pools de nœuds
Dans Autopilot, la fédération d'identité de charge de travail pour GKE est toujours activée. Passez à la section Configurer des applications pour utiliser la fédération d'identité de charge de travail pour GKE.
En mode standard, vous activez la fédération d'identité de charge de travail pour GKE sur les clusters et les pools de nœuds à l'aide de Google Cloud CLI ou de la console Google Cloud. La fédération d'identité de charge de travail pour GKE doit être activée au niveau du cluster pour que vous puissiez l'activer sur des pools de nœuds.
Créer un cluster
Vous pouvez activer la fédération d'identité de charge de travail pour GKE sur un nouveau cluster standard à l'aide de gcloud CLI ou de la console Google Cloud.
gcloud
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
Pour activer la fédération d'identité de charge de travail pour GKE sur un nouveau cluster, exécutez la commande suivante :
gcloud container clusters create CLUSTER_NAME \ --location=LOCATION \ --workload-pool=PROJECT_ID.svc.id.goog
Remplacez les éléments suivants :
CLUSTER_NAME
: nom de votre nouveau clusterLOCATION
: emplacement Compute Engine du cluster.PROJECT_ID
: ID de votre projet Google Cloud.
Console
Pour activer la fédération d'identité de charge de travail pour GKE sur un nouveau cluster, procédez comme suit :
Accédez à la page Google Kubernetes Engine dans Google Cloud Console.
Cliquez sur add_box Créer.
Dans la boîte de dialogue Créer un cluster, cliquez sur Configurer pour GKE Standard.
Dans le menu de navigation, dans la section Cluster, cliquez sur Sécurité.
Cochez la case Activer Workload Identity.
Poursuivez la configuration du cluster, puis cliquez sur Créer.
Mettre à jour un cluster existant
Vous pouvez activer la fédération d'identité de charge de travail pour GKE sur un cluster standard existant à l'aide de gcloud CLI ou de la console Google Cloud. Les pools de nœuds existants ne sont pas affectés, mais tous les nouveaux pools de nœuds du cluster utilisent la fédération d'identité de charge de travail pour GKE.
gcloud
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
Pour activer la fédération d'identité de charge de travail pour GKE sur un cluster existant, exécutez la commande suivante :
gcloud container clusters update CLUSTER_NAME \ --location=LOCATION \ --workload-pool=PROJECT_ID.svc.id.goog
Remplacez les éléments suivants :
CLUSTER_NAME
: nom de votre cluster existant.LOCATION
: emplacement Compute Engine du clusterPROJECT_ID
: ID de votre projet Google Cloud.
Console
Pour activer la fédération d'identité de charge de travail pour GKE sur un cluster existant, procédez comme suit :
Accédez à la page Google Kubernetes Engine dans la console Google Cloud.
Dans la liste des clusters, cliquez sur le nom du cluster que vous souhaitez modifier.
Dans la section Sécurité de la page "Détails du cluster", cliquez sur
Modifier Workload Identity.Dans la boîte de dialogue Modifier Workload Identity, cochez la case Activer Workload Identity.
Cliquez sur Enregistrer les modifications.
Migrer des charges de travail existantes vers la fédération d'identité de charge de travail pour GKE
Après avoir activé la fédération d'identité de charge de travail pour GKE sur un cluster existant, vous pouvez migrer vos charges de travail en cours d'exécution pour qu'elles utilisent la fédération d'identité de charge de travail pour GKE. Choisissez la stratégie de migration idéale pour votre environnement. Vous pouvez créer des pools de nœuds avec la fédération d'identité de charge de travail pour GKE activée, ou mettre à jour des pools de nœuds existants pour activer la fédération d'identité de charge de travail pour GKE.
Il est recommandé de créer de nouveaux pools de nœuds si vous devez également modifier vos applications pour qu'elles soient compatibles avec la fédération d'identité de charge de travail pour GKE.
Créer un pool de nœuds
Tous les nouveaux pools de nœuds que vous créez utilisent la fédération d'identité de charge de travail pour GKE par défaut si la fédération d'identité de charge de travail pour GKE est activée sur le cluster. Pour créer un pool de nœuds avec la fédération d'identité de charge de travail pour GKE activée, exécutez la commande suivante :
gcloud container node-pools create NODEPOOL_NAME \
--cluster=CLUSTER_NAME \
--region=COMPUTE_REGION \
--workload-metadata=GKE_METADATA
Remplacez les éléments suivants :
NODEPOOL_NAME
: nom du nouveau pool de nœuds.CLUSTER_NAME
: nom du cluster existant sur lequel la fédération d'identité de charge de travail pour GKE est activée.
L'option --workload-metadata=GKE_METADATA
configure le pool de nœuds de sorte qu'il utilise le serveur de métadonnées GKE. Nous vous recommandons d'inclure cette option pour que la création du pool de nœuds échoue si la fédération d'identité de charge de travail pour GKE n'est pas activée sur le cluster.
Mettre à jour un pool de nœuds existant
Vous pouvez activer manuellement la fédération d'identité de charge de travail pour GKE sur des pools de nœuds existants après l'avoir activée sur le cluster.
gcloud
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
Pour modifier un pool de nœuds existant afin d'utiliser la fédération d'identité de charge de travail pour GKE, exécutez la commande suivante :
gcloud container node-pools update NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --region=COMPUTE_REGION \ --workload-metadata=GKE_METADATA
Si la fédération d'identité de charge de travail pour GKE est activée sur un cluster, vous pouvez la désactiver de manière sélective pour un pool de nœuds spécifique en indiquant
--workload-metadata=GCE_METADATA
. Pour en savoir plus, reportez-vous à la section Protéger les métadonnées d'un cluster.
Console
Pour modifier un pool de nœuds existant afin d'utiliser la fédération d'identité de charge de travail pour GKE, procédez comme suit :
Accédez à la page Google Kubernetes Engine dans la console Google Cloud.
Dans la liste des clusters, cliquez sur le nom du cluster que vous souhaitez modifier.
Cliquez sur l'onglet Nœuds.
Dans la section Pools de nœuds, cliquez sur le nom du pool de nœuds que vous souhaitez modifier.
Sur la page Détails du pool de nœuds, cliquez sur
Modifier.Dans la section Sécurité de la page Modifier le pool de nœuds, cochez la case Activer le serveur de métadonnées GKE.
Cliquez sur Enregistrer.
Configurer des applications pour qu'elles utilisent la fédération d'identité de charge de travail pour GKE
Pour permettre à vos applications GKE de s'authentifier auprès des API Google Cloud à l'aide de la fédération d'identité de charge de travail pour GKE, vous devez créer des stratégies IAM pour les API spécifiques. Le compte principal de ces stratégies est un identifiant de compte principal IAM qui correspond aux charges de travail, aux espaces de noms ou aux comptes de service.
Configurer l'autorisation et les comptes principaux
Obtenez les identifiants de votre cluster :
gcloud container clusters get-credentials CLUSTER_NAME \ --location=LOCATION
Remplacez les éléments suivants :
CLUSTER_NAME
: nom de votre cluster sur lequel la fédération d'identité de charge de travail pour GKE est activée.LOCATION
: emplacement de votre cluster.
Créez un espace de noms à utiliser pour le compte de service Kubernetes. Vous pouvez également utiliser l'espace de noms
default
ou tout espace de noms existant.kubectl create namespace NAMESPACE
Créez un compte de service Kubernetes que votre application pourra utiliser. Vous pouvez également utiliser n'importe quel compte de service Kubernetes existant dans n'importe quel espace de noms. Si vous n'attribuez pas de compte de service à votre charge de travail, Kubernetes attribue le compte de service
default
dans l'espace de noms.kubectl create serviceaccount KSA_NAME \ --namespace NAMESPACE
Remplacez les éléments suivants :
KSA_NAME
: nom de votre nouveau compte de service Kubernetes.NAMESPACE
: nom de l'espace de noms Kubernetes du compte de service.
Créez une stratégie d'autorisation IAM qui fait référence au compte de service Kubernetes. Il est recommandé d'accorder des autorisations pour les ressources Google Cloud spécifiques auxquelles votre application doit accéder. Vous devez disposer des autorisations IAM adaptées pour créer des stratégies d'autorisation dans votre projet.
Par exemple, la commande suivante attribue le rôle Lecteur de cluster Kubernetes Engine (
roles/container.clusterViewer
) au compte de service que vous avez créé :gcloud projects add-iam-policy-binding projects/PROJECT_ID \ --role=roles/container.clusterViewer \ --member=principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME \ --condition=None
Remplacez les éléments suivants :
PROJECT_ID
: ID de votre projet Google Cloud.PROJECT_NUMBER
: identifiant numérique du projet Google Cloud.
Vous pouvez attribuer des rôles sur n'importe quelle ressource Google Cloud compatible avec les stratégies d'autorisation IAM. La syntaxe de l'identifiant de compte principal dépend de la ressource Kubernetes. Pour obtenir la liste des identifiants compatibles, consultez la section Identifiants de compte principal pour la fédération d'identité de charge de travail pour GKE.
Vérifier la configuration de la fédération d'identité de charge de travail pour GKE
Dans cette section, vous allez créer un bucket Cloud Storage et accorder un accès en lecture au compte de service Kubernetes que vous avez créé dans la section précédente. Vous allez ensuite déployer une charge de travail et vérifier que le conteneur peut recenser les clusters du projet.
Créez un bucket Cloud Storage vide :
gcloud storage buckets create gs://BUCKET
Remplacez
BUCKET
par le nom de votre nouveau bucket.Attribuez le rôle Lecteur des objets de l'espace de stockage (
roles/storage.objectViewer
) au compte de service que vous avez créé :gcloud storage buckets add-iam-policy-binding gs://BUCKET \ --role=roles/storage.objectViewer \ --member=principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME \ --condition=None
Remplacez les éléments suivants :
PROJECT_ID
: ID de votre projet Google Cloud.PROJECT_NUMBER
: identifiant numérique du projet Google Cloud.NAMESPACE
: espace de noms Kubernetes contenant le compte de service.KSA_NAME
: nom du compte de service.
Enregistrez le manifeste suivant sous le nom
test-app.yaml
:apiVersion: v1 kind: Pod metadata: name: test-pod namespace: NAMESPACE spec: serviceAccountName: KSA_NAME containers: - name: test-pod image: google/cloud-sdk:slim command: ["sleep","infinity"] resources: requests: cpu: 500m memory: 512Mi ephemeral-storage: 10Mi
Dans les clusters standards uniquement, ajoutez les éléments suivants au champ
template.spec
pour placer les pods sur des pools de nœuds qui utilisent la fédération d'identité de charge de travail pour GKE.Ignorez cette étape dans les clusters Autopilot, qui rejettent ce nodeSelector, car chaque nœud utilise la fédération d'identité de charge de travail pour GKE.
spec: nodeSelector: iam.gke.io/gke-metadata-server-enabled: "true"
Appliquez la configuration à votre cluster comme suit :
kubectl apply -f test-app.yaml
Attendez que le pod soit prêt. Pour vérifier l'état du pod, exécutez la commande suivante :
kubectl get pods --namespace=NAMESPACE
Une fois le pod prêt, le résultat ressemble à ce qui suit :
NAME READY STATUS RESTARTS AGE test-pod 1/1 Running 0 5m27s
Ouvrez une session d'interface système dans le pod :
kubectl exec -it pods/test-pod --namespace=NAMESPACE -- /bin/bash
Obtenez la liste des objets du bucket :
curl -X GET -H "Authorization: Bearer $(gcloud auth print-access-token)" \ "https://storage.googleapis.com/storage/v1/b/BUCKET/o"
Le résultat est le suivant :
{ "kind": "storage#objects" }
Ce résultat montre que votre pod peut accéder aux objets du bucket.
Autre solution : associer des comptes de service Kubernetes à IAM
Nous vous recommandons d'utiliser les identifiants des comptes principaux IAM pour configurer la fédération d'identité de charge de travail pour GKE. Cependant, cette identité fédérée présente des limites spécifiques pour chaque API Google Cloud compatible. Pour obtenir la liste des limites, consultez la page Produits compatibles et limites.
Si ces limites s'appliquent à vous, procédez comme suit pour configurer l'accès à ces API à partir de vos charges de travail GKE :
Créez un espace de noms Kubernetes :
kubectl create namespace NAMESPACE
Créez un compte de service Kubernetes :
kubectl create serviceaccount KSA_NAME \ --namespace=NAMESPACE
Créer un compte de service IAM Vous pouvez également utiliser n'importe quel compte de service IAM existant dans n'importe quel projet de votre organisation.
gcloud iam service-accounts create IAM_SA_NAME \ --project=IAM_SA_PROJECT_ID
Remplacez les éléments suivants :
IAM_SA_NAME
: nom de votre nouveau compte de service IAM.IAM_SA_PROJECT_ID
: ID du projet de votre compte de service IAM.
Pour en savoir plus sur l'autorisation d'accéder aux API Google Cloud via les comptes de service IAM, consultez la page Comprendre les comptes de service.
Attribuez à votre compte de service IAM les rôles dont il a besoin sur des API Google Cloud spécifiques :
gcloud projects add-iam-policy-binding IAM_SA_PROJECT_ID \ --member "serviceAccount:IAM_SA_NAME@IAM_SA_PROJECT_ID.iam.gserviceaccount.com" \ --role "ROLE_NAME"
Remplacez
ROLE_NAME
par le nom du rôle, par exempleroles/spanner.viewer
.Créez une stratégie d'autorisation IAM qui permet au compte de service Kubernetes d'emprunter l'identité du compte de service IAM :
gcloud iam service-accounts add-iam-policy-binding IAM_SA_NAME@IAM_SA_PROJECT_ID.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE/KSA_NAME]"
Le nom du membre doit inclure l'espace de noms et le nom du compte de service Kubernetes. Par exemple,
serviceAccount:example-project.svc.id.goog[example-namespace/example-serviceaccount]
.Annotez le compte de service Kubernetes afin que GKE voie le lien entre les comptes de service :
kubectl annotate serviceaccount KSA_NAME \ --namespace NAMESPACE \ iam.gke.io/gcp-service-account=IAM_SA_NAME@IAM_SA_PROJECT_ID.iam.gserviceaccount.com
Utiliser la fédération d'identité de charge de travail pour GKE à partir de votre code
La procédure d'authentification auprès des services Google Cloud à partir de votre code est identique à l'authentification à l'aide du serveur de métadonnées Compute Engine. Lorsque vous utilisez la fédération d'identité de charge de travail pour GKE, vos requêtes adressées au serveur de métadonnées de l'instance sont acheminées vers le serveur de métadonnées GKE. Le code existant qui s'authentifie à l'aide du serveur de métadonnées de l'instance (comme le code utilisant les bibliothèques clientes Google Cloud) devrait fonctionner sans qu'aucune modification ne soit requise.
Utiliser un quota d'un autre projet avec la fédération d'identité de charge de travail pour GKE
Sur les clusters exécutant GKE version 1.24 ou ultérieure, vous pouvez éventuellement configurer votre compte de service Kubernetes pour qu'il utilise le quota d'un autre projet Google Cloud lors des appels aux méthodes GenerateAccessToken
et GenerateIdToken
dans l'API IAM Service Account Credentials. Cela vous permet d'éviter d'utiliser l'intégralité du quota de votre projet principal, en utilisant plutôt le quota d'autres projets pour ces services de votre cluster.
Pour configurer un projet de quota avec la fédération d'identité de charge de travail pour GKE, procédez comme suit :
Accordez l'autorisation
serviceusage.services.use
sur le projet de quota au compte de service Kubernetes.gcloud projects add-iam-policy-binding QUOTA_PROJECT_ID \ --role=roles/serviceusage.serviceUsageConsumer \ --member='principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME' \
Remplacez
QUOTA_PROJECT_ID
par l'ID du projet de quota.Annotez le compte de service Kubernetes avec le projet de quota :
kubectl annotate serviceaccount KSA_NAME \ --namespace NAMESPACE \ iam.gke.io/credential-quota-project=QUOTA_PROJECT_ID
Pour vérifier que la configuration fonctionne correctement, procédez comme suit :
Créez un pod et démarrez une session d'interface système. Consultez la documentation de Kubernetes pour Obtenir une interface système sur un conteneur en cours d'exécution.
Envoyez une requête au serveur de métadonnées :
curl -H "Metadata-Flavor: Google" http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/token
Accédez à la page API Service Accounts Credentials IAM dans la console Google Cloud pour votre projet de quota:
Vérifier les variations de trafic
Effectuer un nettoyage
Pour arrêter d'utiliser la fédération d'identité de charge de travail pour GKE, révoquez l'accès au compte de service IAM et désactivez la fédération d'identité de charge de travail pour GKE sur le cluster.
Révoquer l'accès
Pour révoquer l'accès au compte principal, supprimez la stratégie d'autorisation IAM que vous avez créée dans la section Configurer des applications pour utiliser la fédération d'identité de charge de travail pour GKE.
Par exemple, pour révoquer l'accès à un dépôt Artifact Registry, exécutez la commande suivante :
gcloud artifacts repositories remove-iam-policy-binding REPOSITORY_NAME \
--location=REPOSITORY_LOCATION \
--member='principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME' \
--role='roles/artifactregistry.reader' \
--all
Désactiver la fédération d'identité de charge de travail pour GKE
Vous ne pouvez désactiver la fédération d'identité de charge de travail pour GKE que sur les clusters standards.
gcloud
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
Désactivez la fédération d'identité de charge de travail pour GKE sur chaque pool de nœuds :
gcloud container node-pools update NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --workload-metadata=GCE_METADATA
Répétez cette commande pour chaque pool de nœuds du cluster.
Désactivez la fédération d'identité de charge de travail pour GKE dans le cluster :
gcloud container clusters update CLUSTER_NAME \ --disable-workload-identity
Console
Accédez à la page Google Kubernetes Engine dans Google Cloud Console.
Dans la liste des clusters, cliquez sur le nom du cluster que vous souhaitez modifier.
Cliquez sur l'onglet Nœuds.
Pour désactiver la fédération d'identité de charge de travail pour GKE sur chaque pool de nœuds, procédez comme suit pour chaque pool de nœuds de la section Pools de nœuds :
- Cliquez sur le nom du pool de nœuds que vous souhaitez modifier.
- Sur la page Détails du pool de nœuds, cliquez sur Modifier.
- Dans la section Sécurité de la page Modifier le pool de nœuds, décochez la case Activer le serveur de métadonnées GKE.
- Cliquez sur Enregistrer.
Pour désactiver la fédération d'identité de charge de travail pour GKE pour le cluster, procédez comme suit :
- Cliquez sur l'onglet Détails.
- Dans la section Sécurité, à côté de Workload Identity, cliquez sur Modifier.
- Dans la boîte de dialogue Modifier Workload Identity, décochez la case Activer Workload Identity.
- Cliquez sur Enregistrer les modifications.
Désactiver la fédération d'identité de charge de travail pour GKE dans votre organisation
Du point de vue de la sécurité, la fédération d'identité de charge de travail pour GKE permet à GKE de valider des identités de compte de service Kubernetes pouvant être authentifiées et autorisées sur les ressources Google Cloud. Si vous êtes un administrateur ayant effectué des actions pour isoler les charges de travail des ressources Google Cloud, par exemple en désactivant la création de comptes de service ou en désactivant la création de clés de compte de service, vous pouvez également souhaiter désactiver la fédération d'identité de charge de travail pour GKE dans votre organisation.
Dépannage
Pour obtenir des informations de dépannage, consultez la page Résoudre les problèmes liés à la fédération d'identité de charge de travail pour GKE.
Étapes suivantes
- Apprenez-en plus sur la fédération d'identité de charge de travail pour GKE.
- Consultez la présentation de la sécurité dans GKE.
- Obtenez plus d'informations sur la protection des métadonnées de cluster.
- Familiarisez-vous avec les comptes de service IAM.