S'authentifier auprès des API Google Cloud à partir de charges de travail de parc avec confiance partagée

Cette page explique comment configurer vos applications pour qu'elles s'authentifient auprès des APIGoogle Cloud telles que l'API Compute Engine ou l'API AI Platform à partir de flottes qui disposent d'un modèle de confiance partagé dans l'ensemble de la flotte. Si votre parc utilise un modèle de confiance mixte, consultez S'authentifier auprès des API Google Cloud à partir de charges de travail de parc à confiance mixte (Preview).

Cette page s'adresse aux administrateurs et opérateurs de plate-forme, ainsi qu'aux ingénieurs en sécurité qui souhaitent s'authentifier de manière programmatique à partir de charges de travail de parc vers des API Google Cloud. Pour en savoir plus sur les rôles utilisateur et les exemples de tâches que nous citons dans la documentation Google Cloud, consultez la section Rôles utilisateur et tâches courantes de GKE Enterprise.

Avant de lire cette page, assurez-vous de maîtriser les concepts suivants :

À propos de la fédération d'identité de charge de travail de parc pour les environnements de confiance partagée

La fédération d'identité de charge de travail pour parc vous permet de vous authentifier à partir des charges de travail du parc auprès des APIGoogle Cloud à l'aide de mécanismes d'authentification Google Cloud et Kubernetes intégrés. La fédération d'identité de charge de travail Fleet élimine le besoin d'utiliser des méthodes moins sécurisées, telles que le montage de jetons d'accès dans des pods ou le stockage d'identifiants de longue durée.

Par défaut, votre projet hôte de parc utilise un pool d'identités de charge de travail géré par Google pour provisionner des identités pour les entités de l'ensemble du parc. Toute entité du parc ou du projet hôte de parc ayant le même identifiant IAM est considérée comme identique par IAM. Cette identité implicite est utile pour accorder un accès à grande échelle dans des environnements de confiance partagée, tels que les flottes mono-locataire, où il n'a pas d'importance si d'autres entités obtiennent involontairement des autorisations similaires sur les ressources.

Avant de commencer

  • Assurez-vous que les outils de ligne de commande suivants sont installés :

    • Dernière version de la Google Cloud CLI, qui inclut gcloud, l'outil de ligne de commande permettant d'interagir avec Google Cloud.
    • kubectl

    Si vous utilisez Cloud Shell comme environnement shell pour interagir avec Google Cloud, ces outils sont installés pour vous.

  • Assurez-vous d'avoir initialisé gcloud CLI à utiliser avec votre projet.

Préparer vos clusters

Pour que les applications de votre parc puissent recevoir une identité fédérée, les clusters sur lesquels elles s'exécutent doivent être enregistrés dans votre parc et correctement configurés pour utiliser la fédération d'identité de charge de travail de parc. Les sections suivantes décrivent comment configurer la fédération d'identité de charge de travail de la flotte pour différents types de clusters.

GKE

Pour les clusters GKE, procédez comme suit:

  1. Activez la fédération d'identité de charge de travail pour GKE sur votre cluster Google Kubernetes Engine si ce n'est pas déjà fait.
  2. Enregistrez le cluster dans le parc.

Vous pouvez également activer la fédération d'identité de charge de travail pour GKE lors du processus de création de cluster et d'enregistrement de la flotte.

Clusters en dehors de Google Cloud

Les types de clusters suivants activent automatiquement la fédération d'identité de charge de travail de parc et sont enregistrés dans votre parc lors de la création du cluster:

  • Google Distributed Cloud (logiciel uniquement) sur VMware
  • Google Distributed Cloud (logiciel uniquement) sur solution Bare Metal
  • GKE sur AWS
  • GKE sur Azure

Clusters associés

Les clusters associés EKS et AKS enregistrés à l'aide de l'API GKE Multi-Cloud sont enregistrés avec la fonctionnalité Workload Identity Federation du parc activée par défaut. Les autres clusters associés peuvent être enregistrés lorsque la fédération d'identité de charge de travail de parc est activée, s'ils répondent aux conditions préalables. Suivez les instructions correspondant à votre type de cluster de la page Enregistrer un cluster.

Utiliser la fédération d'identité de charge de travail de parc dans les applications

La procédure suivante vous montre comment configurer une charge de travail dans un cluster enregistré pour qu'elle utilise la fédération d'identité de charge de travail du parc:

  1. Recherchez le nom du pool d'identités de charge de travail et du fournisseur d'identités de votre cluster:

    gcloud container fleet memberships describe MEMBERSHIP_ID \
        --project=FLEET_PROJECT_ID \
        --format="table(authority.identityProvider,authority.workloadIdentityPool,name)"
    

    Remplacez les éléments suivants :

    • MEMBERSHIP_ID: nom d'appartenance du cluster. Il s'agit souvent du nom de votre cluster.
    • FLEET_PROJECT_ID: ID du projet hôte du parc.

    Le résultat ressemble à ce qui suit :

    IDENTITY_PROVIDER: IDENTITY_PROVIDER
    WORKLOAD_IDENTITY_POOL: WORKLOAD_IDENTITY_POOL
    NAME: projects/FLEET_PROJECT_ID/locations/MEMBERSHIP_LOCATION/memberships/MEMBERSHIP_ID
    

    Ce résultat contient les informations suivantes:

    • IDENTITY_PROVIDER: fournisseur d'identité du cluster.
    • MEMBERSHIP_LOCATION: emplacement de l'appartenance au parc. Il s'agit généralement de l'emplacement de votre cluster.
    • WORKLOAD_IDENTITY_POOL: nom du pool d'identités de charge de travail associé à votre flotte. Cette valeur a la syntaxe FLEET_PROJECT_ID.svc.id.goog.
  2. Créez un espace de noms Kubernetes. Vous pouvez également utiliser n'importe quel espace de noms existant, y compris l'espace de noms default.

    kubectl create namespace NAMESPACE
    

    Remplacez NAMESPACE par le nom de l'espace de noms.

  3. Créez un ServiceAccount Kubernetes dans l'espace de noms. Vous pouvez également utiliser n'importe quel compte de service existant, y compris le compte de service default dans l'espace de noms.

    kubectl create serviceaccount KSA_NAME \
        --namespace=NAMESPACE
    

    Remplacez KSA_NAME par le nom du compte de service.

  4. Enregistrez le fichier manifeste suivant sous le nom adc-config-map.yaml. Ce ConfigMap contient la configuration de l'ADC pour les charges de travail.

    kind: ConfigMap
    apiVersion: v1
    metadata:
      namespace: NAMESPACE
      name: my-cloudsdk-config
    data:
      config: |
        {
          "type": "external_account",
          "audience": "identitynamespace:WORKLOAD_IDENTITY_POOL:IDENTITY_PROVIDER",
          "subject_token_type": "urn:ietf:params:oauth:token-type:jwt",
          "token_url": "https://sts.googleapis.com/v1/token",
          "credential_source": {
            "file": "/var/run/secrets/tokens/gcp-ksa/token"
          }
        }
    
  5. Déployez le ConfigMap :

    kubectl create -f adc-config-map.yaml
    
  6. Enregistrez le manifeste suivant sous le nom workload-config.yaml :

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
      namespace:  NAMESPACE
    spec:
      serviceAccountName: KSA_NAME
      containers:
      - name: sample-container
        image: google/cloud-sdk:slim
        command: ["sleep","infinity"]
        env:
        - name: GOOGLE_APPLICATION_CREDENTIALS
          value: /var/run/secrets/tokens/gcp-ksa/google-application-credentials.json
        volumeMounts:
        - name: gcp-ksa
          mountPath: /var/run/secrets/tokens/gcp-ksa
          readOnly: true
      volumes:
      - name: gcp-ksa
        projected:
          defaultMode: 420
          sources:
          - serviceAccountToken:
              path: token
              audience: WORKLOAD_IDENTITY_POOL
              expirationSeconds: 172800
          - configMap:
              name: my-cloudsdk-config
              optional: false
              items:
              - key: "config"
                path: "google-application-credentials.json"
    

    Lorsque vous déployez cette charge de travail, le volume gcp-ksa du pod contient les données suivantes:

    Le conteneur du pod installe le volume gcp-ksa sur le chemin /var/run/secrets/tokens/gcp-ksa et configure ADC pour rechercher le fichier JSON de configuration des identifiants dans ce chemin.

  7. Déployer la charge de travail :

    kubectl apply -f workload-config.yaml
    

Autre solution: emprunter l'identité d'un compte de service IAM

Vous pouvez également configurer des comptes de service Kubernetes dans vos clusters pour usurper l'identité de comptes de service IAM et effectuer toutes les actions autorisées que les comptes de service IAM peuvent effectuer. Cette approche peut augmenter les coûts de maintenance, car vous devez gérer les associations de comptes de service à la fois dans IAM et dans Kubernetes.

Dans la plupart des cas, nous vous recommandons de faire référence directement aux comptes principaux Kubernetes dans les stratégies d'autorisation IAM pour accorder l'accès aux ressourcesGoogle Cloud en suivant les instructions de la section Utiliser la fédération d'identité de charge de travail de la flotte dans les applications.

  1. Recherchez le nom du pool d'identités de charge de travail et du fournisseur d'identités de votre cluster:

    gcloud container fleet memberships describe MEMBERSHIP_ID \
        --project=FLEET_PROJECT_ID \
        --format="table(authority.identityProvider,authority.workloadIdentityPool,name)"
    

    Remplacez les éléments suivants :

    • MEMBERSHIP_ID: nom d'appartenance du cluster. Il s'agit souvent du nom de votre cluster.
    • FLEET_PROJECT_ID: ID du projet hôte du parc.

    Le résultat ressemble à ce qui suit :

    IDENTITY_PROVIDER: IDENTITY_PROVIDER
    WORKLOAD_IDENTITY_POOL: WORKLOAD_IDENTITY_POOL
    NAME: projects/FLEET_PROJECT_ID/locations/MEMBERSHIP_LOCATION/memberships/MEMBERSHIP_ID
    

    Ce résultat contient les informations suivantes:

    • IDENTITY_PROVIDER: fournisseur d'identité du cluster.
    • MEMBERSHIP_LOCATION: emplacement de l'abonnement. Il s'agit généralement de l'emplacement de votre cluster.
    • WORKLOAD_IDENTITY_POOL: nom du pool d'identités de charge de travail associé à votre flotte. Cette valeur a la syntaxe FLEET_PROJECT_ID.svc.id.goog.
  2. Créez un compte de service IAM que votre application peut usurper. Vous pouvez également utiliser n'importe quel compte de service IAM existant.

    gcloud iam service-accounts create IAM_SA_NAME \
        --project=IAM_SA_PROJECT_ID
    

    Remplacez les éléments suivants :

    • IAM_SA_NAME: nom de votre compte de service IAM.
    • IAM_SA_PROJECT_ID: ID du projet contenant votre compte de service IAM. Il peut être différent de votre projet hôte de parc.
  3. Accordez au compte de service IAM toutes les autorisations dont il a besoin pour accéder aux API Google Cloud en ajoutant les stratégies d'autorisation IAM nécessaires. Pour ce faire, vous pouvez utiliser gcloud iam service-accounts add-iam-policy-binding ou une autre méthode. Pour connaître les autorisations requises pour utiliser les API Google Cloud dans la documentation de chaque service, consultez la liste complète des rôles prédéfinis avec les autorisations nécessaires dans la section Comprendre les rôles.

  4. Créez un ServiceAccount Kubernetes dans un espace de noms. Vous pouvez également utiliser un compte de service Kubernetes existant et n'importe quel espace de noms, y compris le compte de service default et l'espace de noms default.

    kubectl create serviceaccount KSA_NAME \
        --namespace=NAMESPACE
    

    Remplacez les éléments suivants :

    • KSA_NAME : nom du compte de service.
    • NAMESPACE: nom de l'espace de noms.
  5. Créez une stratégie d'autorisation IAM qui permet à un compte de service Kubernetes dans un espace de noms spécifique de votre cluster 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 \
        --project=IAM_SA_PROJECT_ID \
        --role=roles/iam.workloadIdentityUser \
        --member="serviceAccount:WORKLOAD_IDENTITY_POOL[NAMESPACE/KSA_NAME]"
    

    Remplacez WORKLOAD_IDENTITY_POOL par le nom du pool d'identités de la charge de travail.

  6. Enregistrez le fichier manifeste suivant sous le nom adc-config-map.yaml. Ce ConfigMap contient la configuration de l'ADC pour les charges de travail.

    kind: ConfigMap
    apiVersion: v1
    metadata:
      namespace: K8S_NAMESPACE
      name: my-cloudsdk-config
    data:
      config: |
        {
          "type": "external_account",
          "audience": "identitynamespace:WORKLOAD_IDENTITY_POOL:IDENTITY_PROVIDER",
          "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/IAM_SA_NAME@GSA_PROJECT_ID.iam.gserviceaccount.com:generateAccessToken",
          "subject_token_type": "urn:ietf:params:oauth:token-type:jwt",
          "token_url": "https://sts.googleapis.com/v1/token",
          "credential_source": {
            "file": "/var/run/secrets/tokens/gcp-ksa/token"
          }
        }
    

    Remplacez les éléments suivants :

    • IAM_SA_NAME: nom du compte de service IAM à usurper.
    • IAM_SA_PROJECT_ID: ID de projet du compte de service IAM.
  7. Enregistrez le manifeste suivant sous le nom workload-config.yaml :

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
      namespace:  K8S_NAMESPACE
    spec:
      serviceAccountName: KSA_NAME
      containers:
      - name: my-container
        image: my-image
        command: ["sleep","infinity"]
        env:
          - name: GOOGLE_APPLICATION_CREDENTIALS
            value: /var/run/secrets/tokens/gcp-ksa/google-application-credentials.json
        volumeMounts:
        - name: gcp-ksa
          mountPath: /var/run/secrets/tokens/gcp-ksa
          readOnly: true
      volumes:
      - name: gcp-ksa
        projected:
          defaultMode: 420
          sources:
          - serviceAccountToken:
              path: token
              audience: WORKLOAD_IDENTITY_POOL
              expirationSeconds: 172800
          - configMap:
              name: my-cloudsdk-config
              optional: false
              items:
                - key: "config"
                  path: "google-application-credentials.json"
    
    

    Lorsque vous déployez cette charge de travail, le volume gcp-ksa du pod contient les données suivantes:

    Le conteneur du pod installe le volume gcp-ksa sur le chemin /var/run/secrets/tokens/gcp-ksa et configure ADC pour rechercher le fichier JSON de configuration des identifiants dans ce chemin.

  8. Déployer la charge de travail :

    kubectl apply -f workload-config.yaml
    

Vérifier la configuration de la fédération d'identité de charge de travail du parc

Dans cette section, vous allez créer un bucket Cloud Storage et y accéder à partir d'un pod qui utilise la fédération d'identité de charge de travail pour un parc. Avant de suivre ces étapes, assurez-vous d'avoir configuré la fédération d'identité de charge de travail en suivant les instructions de la section Utiliser la fédération d'identité de charge de travail de parc dans les applications.

Cette section ne vous explique pas comment valider la fédération d'identité de charge de travail à l'aide de la méthode d'emprunt d'identité de compte de service IAM.

  1. Recherchez votre numéro de projet numérique:

    gcloud projects describe FLEET_PROJECT_ID \
        --format="value(projectNumber)"
    

    Le résultat ressemble à ce qui suit :

    1234567890
    
  2. Créez un bucket Cloud Storage :

    gcloud storage buckets create gs://FLEET_PROJECT_ID-test-bucket \
        --location=LOCATION
    

    Remplacez LOCATION par un emplacement Google Cloud.

  3. Créez une stratégie d'autorisation IAM qui accorde l'accès au bucket au compte de service que vous avez créé:

    gcloud storage buckets add-iam-policy-binding gs://FLEET_PROJECT_ID-test-bucket \
        --condition=None \
        --role=roles/storage.objectViewer \
        --member=principal://iam.googleapis.com/projects/FLEET_PROJECT_NUMBER/locations/global/workloadIdentityPools/FLEET_PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME
    

    Remplacez les éléments suivants :

    • FLEET_PROJECT_NUMBER: numéro numérique de votre projet.
    • FLEET_PROJECT_ID : ID de votre projet.
    • NAMESPACE: nom de l'espace de noms Kubernetes qui exécute votre pod à partir de la section précédente.
    • KSA_NAME: nom du compte de service Kubernetes utilisé par votre pod de la section précédente.
  4. Créez une session shell dans votre pod:

    kubectl exec -it pods/my-pod --namespace=NAMESPACE -- /bin/bash
    
  5. Essayez de lister les objets du bucket:

    curl -X GET -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    "https://storage.googleapis.com/storage/v1/b/FLEET_PROJECT_ID-test-bucket/o"
    

    Le résultat est le suivant :

    {
      "kind": "storage#objects"
    }
    

S'authentifier à partir du code

Lorsque vous utilisez les bibliothèques clientes Cloud, les bibliothèques d'authentification utilisent automatiquement ADC pour rechercher des identifiants permettant de s'authentifier auprès des services Google Cloud . Vous devez utiliser les bibliothèques clientes Cloud compatibles avec la fédération d'identité de charge de travail. Vous trouverez ci-dessous les versions minimales requises des bibliothèques clientes Cloud, ainsi que des instructions pour la vérification de votre version actuelle:

C++

La plupart des bibliothèques clientesGoogle Cloud pour C++ sont compatibles avec la fédération d'identité à l'aide d'un objet ChannelCredentials, créé en appelant grpc::GoogleDefaultCredentials(). Pour initialiser cet identifiant, vous devez créer les bibliothèques clientes avec la version 1.36.0 ou ultérieure de gRPC.

La bibliothèque cliente Cloud Storage pour C++ utilise l'API REST et non gRPC. Elle n'est donc pas compatible avec la fédération d'identités.

Go

Les bibliothèques clientes pour Go sont compatibles avec la fédération d'identité si elles utilisent la version 0.0.0-20210218202405-ba52d332ba99 ou une version ultérieure du module golang.org/x/oauth2.

Pour vérifier quelle version de ce module est utilisée par votre bibliothèque cliente, exécutez les commandes suivantes :

cd $GOPATH/src/cloud.google.com/go
go list -m golang.org/x/oauth2

Java

Les bibliothèques clientes pour Java sont compatibles avec la fédération d'identité si elles utilisent la version 0.24.0 ou une version ultérieure de l'artefact com.google.auth:google-auth-library-oauth2-http.

Pour vérifier la version de cet artefact utilisée par votre bibliothèque cliente, exécutez la commande Maven suivante dans le répertoire de votre application :

mvn dependency:list -DincludeArtifactIds=google-auth-library-oauth2-http

Node.js

Les bibliothèques clientes pour Node.js sont compatibles avec la fédération d'identité si elles utilisent la version 7.0.2 ou ultérieure du package google-auth-library.

Pour vérifier la version de ce package utilisée par votre bibliothèque cliente, exécutez la commande suivante dans le répertoire de votre application :

npm list google-auth-library

Lorsque vous créez un objet GoogleAuth, vous pouvez spécifier un ID de projet ou autoriser GoogleAuth à le trouver automatiquement. Pour trouver automatiquement l'ID du projet, le compte de service dans le fichier de configuration doit disposer du rôle de visiteur (roles/browser) ou d'un rôle avec des autorisations équivalentes sur votre projet. Pour en savoir plus, consultez la section README du package google-auth-library.

Python

Les bibliothèques clientes pour Python sont compatibles avec la fédération d'identité si elles utilisent la version 1.27.0 ou ultérieure du package google-auth.

Pour vérifier la version de ce package utilisée par votre bibliothèque cliente, exécutez la commande suivante dans l'environnement dans lequel le package est installé :

pip show google-auth

Pour spécifier un ID de projet pour le client d'authentification, vous pouvez définir la variable d'environnement GOOGLE_CLOUD_PROJECT ou autoriser le client à trouver automatiquement l'ID du projet. Pour trouver automatiquement l'ID du projet, le compte de service dans le fichier de configuration doit disposer du rôle de visiteur (roles/browser) ou d'un rôle avec des autorisations équivalentes sur votre projet. Pour en savoir plus, consultez le guide de l'utilisateur du package google-auth.

Étape suivante

Découvrez les bonnes pratiques à suivre pour organiser vos parcs lorsque vous utilisez la fédération d'identité de charge de travail de parc.