S'authentifier auprès des API Google Cloud à partir de charges de travail GKE


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.

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 activée par défaut. 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

  1. Dans la console Google Cloud, activez Cloud Shell.

    Activer Cloud Shell

    En bas de la fenêtre de la console Google Cloud, une session Cloud Shell démarre et affiche une invite de ligne de commande. Cloud Shell est un environnement shell dans lequel Google Cloud CLI est déjà installé, et dans lequel des valeurs sont déjà définies pour votre projet actuel. L'initialisation de la session peut prendre quelques secondes.

  2. 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 cluster
    • LOCATION : 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 :

  1. Accédez à la page Google Kubernetes Engine dans Google Cloud Console.

    Accéder à Google Kubernetes Engine

  2. Cliquez sur Créer.

  3. Dans la boîte de dialogue Créer un cluster, cliquez sur Configurer pour GKE Standard.

  4. Dans le menu de navigation, dans la section Cluster, cliquez sur Sécurité.

  5. Cochez la case Activer Workload Identity.

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

  1. Dans la console Google Cloud, activez Cloud Shell.

    Activer Cloud Shell

    En bas de la fenêtre de la console Google Cloud, une session Cloud Shell démarre et affiche une invite de ligne de commande. Cloud Shell est un environnement shell dans lequel Google Cloud CLI est déjà installé, et dans lequel des valeurs sont déjà définies pour votre projet actuel. L'initialisation de la session peut prendre quelques secondes.

  2. 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 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 cluster existant, procédez comme suit :

  1. Accédez à la page Google Kubernetes Engine dans la console Google Cloud.

    Accéder à Google Kubernetes Engine

  2. Dans la liste des clusters, cliquez sur le nom du cluster que vous souhaitez modifier.

  3. Dans la section Sécurité de la page "Détails du cluster", cliquez sur  Modifier Workload Identity.

  4. Dans la boîte de dialogue Modifier Workload Identity, cochez la case Activer Workload Identity.

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

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

  1. Dans la console Google Cloud, activez Cloud Shell.

    Activer Cloud Shell

    En bas de la fenêtre de la console Google Cloud, une session Cloud Shell démarre et affiche une invite de ligne de commande. Cloud Shell est un environnement shell dans lequel Google Cloud CLI est déjà installé, et dans lequel des valeurs sont déjà définies pour votre projet actuel. L'initialisation de la session peut prendre quelques secondes.

  2. 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 :

  1. Accédez à la page Google Kubernetes Engine dans la console Google Cloud.

    Accéder à Google Kubernetes Engine

  2. Dans la liste des clusters, cliquez sur le nom du cluster que vous souhaitez modifier.

  3. Cliquez sur l'onglet Nœuds.

  4. Dans la section Pools de nœuds, cliquez sur le nom du pool de nœuds que vous souhaitez modifier.

  5. Sur la page Détails du pool de nœuds, cliquez sur Modifier.

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

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

  1. 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.
  2. 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
    
  3. 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.
  4. 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.

  1. Créez un bucket Cloud Storage vide :

    gcloud storage buckets create gs://BUCKET
    

    Remplacez BUCKET par le nom de votre nouveau bucket.

  2. 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.
  3. 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
    
  4. 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"
    
  5. Appliquez la configuration à votre cluster comme suit :

    kubectl apply -f test-app.yaml
    
  6. 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
    
  7. Ouvrez une session d'interface système dans le pod :

    kubectl exec -it pods/test-pod --namespace=NAMESPACE -- /bin/bash
    
  8. 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 :

  1. Créez un espace de noms Kubernetes :

    kubectl create namespace NAMESPACE
    
  2. Créez un compte de service Kubernetes :

    kubectl create serviceaccount KSA_NAME \
        --namespace=NAMESPACE
    
  3. 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.

  4. 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 exemple roles/spanner.viewer.

  5. Créez une stratégie 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]"
    
  6. 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 :

  1. 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='principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/serviceaccount/NAMESPACE/KSA_NAME' \
    

    Remplacez QUOTA_PROJECT_ID par l'ID du projet de quota.

  2. 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 :

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

  2. 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
    
  3. Accédez à la page API Service Accounts Credentials IAM dans la console Google Cloud pour votre projet de quota:

    Accéder aux API

  4. 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='principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/serviceaccount/NAMESPACE/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

  1. Dans la console Google Cloud, activez Cloud Shell.

    Activer Cloud Shell

    En bas de la fenêtre de la console Google Cloud, une session Cloud Shell démarre et affiche une invite de ligne de commande. Cloud Shell est un environnement shell dans lequel Google Cloud CLI est déjà installé, et dans lequel des valeurs sont déjà définies pour votre projet actuel. L'initialisation de la session peut prendre quelques secondes.

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

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

  1. Accédez à la page Google Kubernetes Engine dans Google Cloud Console.

    Accéder à Google Kubernetes Engine

  2. Dans la liste des clusters, cliquez sur le nom du cluster que vous souhaitez modifier.

  3. Cliquez sur l'onglet Nœuds.

  4. 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 :

    1. Cliquez sur le nom du pool de nœuds que vous souhaitez modifier.
    2. Sur la page Détails du pool de nœuds, cliquez sur Modifier.
    3. 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.
    4. Cliquez sur Enregistrer.
  5. Pour désactiver la fédération d'identité de charge de travail pour GKE pour le cluster, procédez comme suit :

    1. Cliquez sur l'onglet Détails.
    2. Dans la section Sécurité, à côté de Workload Identity, cliquez sur  Modifier.
    3. Dans la boîte de dialogue Modifier Workload Identity, décochez la case Activer Workload Identity.
    4. 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.

Consultez ces instructions pour désactiver la fédération d'identité de charge de travail pour GKE pour 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