Authentification du cluster Workload Identity

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.com
    • sts.googleapis.com
    • iamcredentials.googleapis.com
    • gkehub.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.

  • 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)

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.objectViewer
roles/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 Kubernetes

  • NAMESPACE : 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.

  1. Utilisez la commande gcloud projects describe pour trouver le numéro de votre projet :

    gcloud projects describe PROJECT_ID --format="value(projectNumber)"
    

    Remplacez PROJECT_ID par l'ID de votre projet.

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

    Remplacez les valeurs suivantes :

    • PROJECT_NUMBER : identifiant numérique de votre projet
    • NAMESPACE : espace de noms de votre cluster
    • KSA_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.

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

    Remplacez PROJECT_ID par l'ID de votre projet.

  2. 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.admin
    
  3. Utilisez 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 cluster
    • KSA_NAME : nom de votre compte de service Kubernetes
  4. 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.

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

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

    Remplacez PROJECT_NUMBER par le numéro de votre projet Google Cloud . Vous pouvez trouver le numéro de projet en exécutant gcloud projects describe PROJECT_ID --format="value(projectNumber)".

  2. Utilisez la commande kubectl create configmap pour créer un ConfigMap Kubernetes afin de stocker le fichier de configuration :

    kubectl create configmap CREDENTIAL_CONFIG_MAP \
        --namespace NAMESPACE \
        --from-file=credential-configuration.json
    

    Remplacez les valeurs suivantes :

    • CREDENTIAL_CONFIG_MAP : nom de votre ConfigMap, qui contient votre fichier de configuration des identifiants

    • NAMESPACE : espace de noms de votre cluster

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

    Remplacez les valeurs suivantes :

    • KSA_NAME : nom de votre compte de service Kubernetes

    • MY_CONTAINER : nom de votre conteneur

    • MY_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