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
- ConfigMaps Kubernetes
- Stratégies d'autorisation IAM (Identity and Access Management)
À 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.
- Dernière version de la Google Cloud CLI, qui inclut
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:
- 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.
- 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:
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 syntaxeFLEET_PROJECT_ID.svc.id.goog
.
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.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.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" } }
Déployez le ConfigMap :
kubectl create -f adc-config-map.yaml
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:- Les données du ConfigMap que vous avez déployées en tant que fichier nommé
google-application-credentials.json
. Il s'agit d'un fichier de configuration des identifiants ADC. - Le jeton de compte de service Kubernetes sous la forme
token
. Kubernetes installe un JWT signé pour le ServiceAccount en tant que fichier de jeton ServiceAccount projeté.
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.- Les données du ConfigMap que vous avez déployées en tant que fichier nommé
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.
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 syntaxeFLEET_PROJECT_ID.svc.id.goog
.
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.
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.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 nomsdefault
.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.
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.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.
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:- Les données du ConfigMap que vous avez déployées en tant que fichier nommé
google-application-credentials.json
. Il s'agit d'un fichier de configuration des identifiants ADC. - Le jeton de compte de service Kubernetes sous la forme
token
. Kubernetes installe un JWT signé pour le ServiceAccount en tant que fichier de jeton ServiceAccount projeté.
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.- Les données du ConfigMap que vous avez déployées en tant que fichier nommé
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.
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
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.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.
Créez une session shell dans votre pod:
kubectl exec -it pods/my-pod --namespace=NAMESPACE -- /bin/bash
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.