Ce document explique comment configurer et utiliser l'authentification du cluster Workload Identity pour Google Distributed Cloud Connected. Au lieu des clés de compte de service, l'authentification de cluster Workload Identity utilise des jetons de courte durée et la fédération d'identité de charge de travail pour permettre à vos charges de travail d'accéder aux ressources Google Cloud de manière sécurisée. Les identifiants éphémères sont des jetons d'accès OAuth 2.0. Par défaut, les jetons d'accès expirent au bout d'une heure.
Avec l'authentification du cluster Workload Identity, vos charges de travail peuvent utiliser leur propre identité Kubernetes pour accéder directement aux ressources Google Cloud ou emprunter l'identité d'un compte de service Google.
L'authentification de cluster Workload Identity présente deux avantages principaux par rapport à l'utilisation de clés de compte de service :
Sécurité améliorée: les clés de compte de service constituent un risque pour la sécurité si elles ne sont pas gérées correctement. Les jetons OAuth 2.0 et la fédération d'identité de charge de travail sont considérés comme des bonnes alternatives aux clés de compte de service. Pour en savoir plus sur les jetons de compte de service, consultez Identifiants de compte de service à court terme. Pour en savoir plus sur la fédération d'identité de charge de travail, consultez Fédération d'identité de charge de travail.
Maintenance réduite: les clés de compte de service nécessitent plus de maintenance. La rotation et la sécurisation régulières de ces clés peuvent représenter un fardeau administratif.
Cette page s'adresse aux administrateurs, aux architectes et aux opérateurs qui configurent, surveillent et gèrent le cycle de vie de l'infrastructure technologique sous-jacente. Pour en savoir plus sur les rôles courants et les exemples de tâches que nous citons dans le contenuGoogle Cloud , consultez Rôles utilisateur et tâches courantes de GKE.
Gestion des clusters
Ce guide traite de la fédération d'identité de charge de travail pour vos applications. La fédération d'identité de charge de travail au niveau du cluster est gérée automatiquement pour les clusters connectés Distributed Cloud.
Les clusters connectés Distributed Cloud sont créés et gérés par Google via l'API Distributed Cloud Edge Container, soit à l'aide de la commande gcloud edge-cloud container clusters create, soit dans la console Google Cloud .
Les clusters connectés Distributed Cloud sont automatiquement enregistrés dans un parc du projet dans lequel ils sont créés. Vous n'avez pas besoin d'enregistrer manuellement votre parc automobile. Le pool de fédération d'identité de charge de travail est automatiquement disponible et suit le format PROJECT_ID.svc.id.goog.
Avant de commencer
Avant de configurer la fédération d'identité de charge de travail, vérifiez que les API suivantes sont activées dans votre projet Google Cloud . Pour en savoir plus sur l'activation des API, consultez Activer des services :
iam.googleapis.comsts.googleapis.comiamcredentials.googleapis.comgkehub.googleapis.com
Assurez-vous que les outils de ligne de commande suivants sont installés :
- La 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 avecGoogle Cloud, ces outils sont installés pour vous.
- La dernière version de la Google Cloud CLI, qui inclut
Assurez-vous d'avoir initialisé gcloud CLI à utiliser avec votre projet.
Assurez-vous de disposer des rôles IAM suivants sur le projet. Les rôles suivants sont requis pour effectuer la configuration :
- Propriétaire (
roles/owner) ou - Administrateur de sécurité IAM (
roles/iam.securityAdmin) et Administrateur de compte de service (roles/iam.serviceAccountAdmin)
- Propriétaire (
Dans les sections suivantes, vous allez créer des comptes de service et accorder les rôles nécessaires pour l'authentification du cluster avec l'identité de charge de travail.
Recommandation : accès direct aux ressources avec la fédération d'identité de charge de travail
Avec l'accès direct aux ressources de la fédération d'identité de charge de travail, vous utilisez la fédération d'identité de charge de travail pour accorder un rôle IAM à un compte de service Kubernetes afin qu'il puisse accéder directement aux ressources Google Cloud.
| Identité | Objectif | Rôles |
|---|---|---|
| Compte de service Kubernetes |
Identité Kubernetes utilisée par votre charge de travail. Attribuez à cette identité les rôles nécessaires pour accéder aux ressources Google Cloud requises. Cet exemple accorde les rôles roles/storage.objectViewer et roles/logging.admin.
|
roles/storage.objectViewerroles/logging.admin |
Autre solution : emprunt d'identité d'un compte de service IAM
Vous pouvez également configurer votre compte de service Kubernetes pour qu'il emprunte l'identité d'un compte de service IAM.
| Compte de service | Objectif | Rôles |
|---|---|---|
| Compte de service Google | Compte de service Google dont votre charge de travail dans le cluster emprunte l'identité. Attribuez à ce compte de service les rôles nécessaires pour accéder aux ressources Google Cloud requises. | Dépend des ressources auxquelles l'utilisateur accède. |
| Compte de service Kubernetes |
Accordez à cette identité la possibilité d'emprunter l'identité du compte de service Google.
Cette autorisation utilise le rôle roles/iam.workloadIdentityUser.
|
roles/iam.workloadIdentityUser
|
Configurer des comptes de service
Les sections suivantes contiennent des instructions pour créer le compte de service Kubernetes requis et lui accorder les rôles nécessaires pour l'authentification du cluster Workload Identity à l'aide de l'accès direct aux ressources de la fédération d'identité de charge de travail ou de l'emprunt d'identité d'un compte de service Google.
Créer un compte de service Kubernetes
Dans votre cluster, utilisez la commande kubectl create pour créer un ServiceAccount Kubernetes pour vos pods. Vous pouvez également utiliser n'importe quel compte de service existant, y compris le compte ServiceAccount par défaut dans l'espace de noms.
kubectl create serviceaccount KSA_NAME --namespace NAMESPACE
Remplacez les valeurs suivantes :
KSA_NAME: nom de votre compte de service KubernetesNAMESPACE: espace de noms de votre cluster
Utiliser la fédération d'identité de charge de travail pour accorder un accès direct aux ressources
Pour accorder des rôles Identity and Access Management directement à l'identité de votre compte de service Kubernetes, procédez comme suit.
Utilisez la commande gcloud projects describe pour trouver le numéro de votre projet :
gcloud projects describe PROJECT_ID --format="value(projectNumber)"Remplacez
PROJECT_IDpar l'ID de votre projet.Utilisez la commande gcloud projects add-iam-policy-binding pour attribuer les rôles requis au principal d'identité Kubernetes :
gcloud projects add-iam-policy-binding PROJECT_ID \ --member="principal://iam.gserviceaccount.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \ --role=roles/storage.objectViewer gcloud projects add-iam-policy-binding PROJECT_ID \ --member="principal://iam.gserviceaccount.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \ --role=roles/logging.adminRemplacez les valeurs suivantes :
PROJECT_NUMBER: identifiant numérique de votre projetNAMESPACE: espace de noms de votre clusterKSA_NAME: nom de votre compte de service Kubernetes
Autre solution : utiliser l'emprunt d'identité d'un compte de service IAM pour accorder l'accès
Si vous préférez que vos charges de travail empruntent l'identité d'un compte de service Google, suivez ces étapes.
Utilisez la commande gcloud iam service-accounts create pour créer un compte de service Google :
gcloud iam service-accounts create my-app-sa \ --project=PROJECT_IDRemplacez
PROJECT_IDpar l'ID de votre projet.Utilisez la commande gcloud projects add-iam-policy-binding pour accorder les rôles requis au compte de service Google :
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:my-app-sa@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/storage.objectViewer gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:my-app-sa@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/logging.adminUtilisez la commande gcloud iam service-accounts add-iam-policy-binding pour accorder au compte de service Kubernetes la possibilité d'emprunter l'identité du compte de service Google :
gcloud iam service-accounts add-iam-policy-binding my-app-sa@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/iam.workloadIdentityUser \ --member="serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE/KSA_NAME]"Remplacez les valeurs suivantes :
NAMESPACE: espace de noms de votre clusterKSA_NAME: nom de votre compte de service Kubernetes
Utilisez la commande kubectl annotate pour annoter le compte de service Kubernetes et l'associer au compte de service Google :
kubectl annotate serviceaccount \ --namespace NAMESPACE KSA_NAME \ iam.gke.io/gcp-service-account=my-app-sa@PROJECT_ID.iam.gserviceaccount.com
Configurer la charge de travail
Mettez à jour la spécification de pod pour utiliser le compte de service Kubernetes et installer le volume de jetons projeté. Étant donné que les clusters connectés Distributed Cloud se trouvent en dehors deGoogle Cloud, vous devez également fournir un fichier de configuration des identifiants et définir la variable d'environnement GOOGLE_APPLICATION_CREDENTIALS pour qu'elle pointe vers ce fichier. Les bibliothèques clientesGoogle Cloud du pod utilisent ces identifiants pour échanger le jeton Kubernetes contre un jeton d'accès Google Cloud via l'API Security Token Service.
Générez le fichier
credential-configuration.json. Choisissez la commande en fonction de l'accès direct aux ressources de la fédération d'identité de charge de travail ou de l'emprunt d'identité d'un compte de service IAM.Accès direct aux ressources de la fédération d'identité de charge de travail
Utilisez la commande gcloud iam workload-identity-pools create-cred-config :
gcloud iam workload-identity-pools create-cred-config \ projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/providers/attestor \ --credential-source-file=/var/run/secrets/tokens/gcp-ksa/token \ --credential-source-type=text \ --output-file=credential-configuration.jsonUtiliser l'emprunt d'identité d'un compte de service IAM pour accorder l'accès
Utilisez la commande gcloud iam workload-identity-pools create-cred-config :
gcloud iam workload-identity-pools create-cred-config \ projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/providers/attestor \ --service-account=my-app-sa@PROJECT_ID.iam.gserviceaccount.com \ --credential-source-file=/var/run/secrets/tokens/gcp-ksa/token \ --credential-source-type=text \ --output-file=credential-configuration.jsonRemplacez
PROJECT_NUMBERpar le numéro de votre projet Google Cloud . Vous pouvez trouver le numéro de projet en exécutantgcloud projects describe PROJECT_ID --format="value(projectNumber)".Utilisez la commande
kubectl create configmappour créer unConfigMapKubernetes afin de stocker le fichier de configuration :kubectl create configmap CREDENTIAL_CONFIG_MAP \ --namespace NAMESPACE \ --from-file=credential-configuration.jsonRemplacez les valeurs suivantes :
CREDENTIAL_CONFIG_MAP: nom de votreConfigMap, qui contient votre fichier de configuration des identifiantsNAMESPACE: espace de noms de votre cluster
Mettez à jour la spécification de votre pod avec le contenu YAML suivant :
spec: serviceAccountName: KSA_NAME containers: - name: MY_CONTAINER image: MY_IMAGE env: - name: GOOGLE_APPLICATION_CREDENTIALS value: /var/run/secrets/tokens/gcp-creds/credential-configuration.json volumeMounts: - mountPath: /var/run/secrets/tokens/gcp-ksa name: gcp-ksa - mountPath: /var/run/secrets/tokens/gcp-creds name: gcp-creds readOnly: true volumes: - name: gcp-ksa projected: defaultMode: 0420 sources: - serviceAccountToken: path: token audience: PROJECT_ID.svc.id.goog expirationSeconds: 3600 - name: gcp-creds configMap: name: CREDENTIAL_CONFIG_MAPRemplacez les valeurs suivantes :
KSA_NAME: nom de votre compte de service KubernetesMY_CONTAINER: nom de votre conteneurMY_IMAGE: nom de votre image
Limites
Les fonctionnalités et capacités suivantes ne sont pas compatibles lorsque vous utilisez la fédération d'identité de charge de travail pour Distributed Cloud connecté :
- Utiliser un serveur proxy pour le processus d'échange de jetons
Pour savoir comment utiliser Workload Identity Federation avec VPC Service Controls, consultez Configurer l'intégration de VPC Service Controls.
Étapes suivantes
- Déployer des charges de travail sur Distributed Cloud connecté
- Gérer les services
- Appliquer les bonnes pratiques de sécurité