Utiliser Workload Identity avec Google Cloud

Workload Identity vous permet d'attribuer des identités et une autorisation distinctes et précises pour chaque application du cluster. Workload Identity est la méthode recommandée pour que les applications s'exécutant dans GKE sur Azure puissent accéder aux services Google Cloud. Pour en savoir plus, consultez la page concernant Workload Identity.

Cet article explique comment utiliser Workload Identity pour vous connecter aux services Google Cloud à partir de vos charges de travail.

Configurer un compte de service Google Cloud

Dans cette section, vous allez créer un compte de service Google Cloud (GSA) avec des autorisations limitées pour accéder aux services Google Cloud.

Obtenir votre pool d'identités de charge de travail et votre fournisseur

Pour configurer Workload Identity, vous devez disposer des valeurs de l'URI du fournisseur d'identité de votre cluster et des pools d'identités de charge de travail.

  1. Déterminer le pool d'identités de charge de travail pour votre cluster

    Tous les clusters GKE disposent d'un fournisseur d'identité créé dans le pool d'identités de charge de travail PROJECT_ID.svc.id.goog. Pour obtenir le nom du pool d'identités de votre cluster, utilisez Google Cloud CLI :

    gcloud container azure clusters describe CLUSTER_NAME \
        --location=GOOGLE_CLOUD_LOCATION \
        --format='value(workloadIdentityConfig.workloadPool)'
    

    Remplacez les éléments suivants :

    • CLUSTER_NAME par le nom de votre cluster.
    • GOOGLE_CLOUD_LOCATION par le nom de l'emplacement Google Cloud qui gère votre cluster.

    La sortie inclut le nom du pool d'identités de votre cluster. Enregistrez cette valeur. Vous en aurez besoin ultérieurement.

  2. Déterminer le fournisseur d'identité pour votre cluster

    Pour trouver le nom du fournisseur d'identité de votre cluster, utilisez Google Cloud CLI :

    gcloud container azure clusters describe CLUSTER_NAME \
        --location=GOOGLE_CLOUD_LOCATION \
        --format='value(workloadIdentityConfig.identityProvider)'
    

    Remplacez les éléments suivants :

    • CLUSTER_NAME
    • GOOGLE_CLOUD_LOCATION

    La sortie inclut le nom du fournisseur d'identités de votre cluster. Enregistrez cette valeur. Vous en aurez besoin ultérieurement.

Créer un compte de service Google Cloud

Pour créer un compte de service Google Cloud (GSA), lui attribuer des autorisations et ajouter une liaison de stratégie IAM au GSA, procédez comme suit :

  1. Créez le GSA avec Google Cloud CLI :

    gcloud iam service-accounts create GSA_NAME --project=PROJECT_ID
    

    Remplacez les éléments suivants :

    • GSA_NAME : nom du GSA de votre application.
    • PROJECT_ID : projet Google Cloud du GSA.
  2. Ajoutez une liaison IAM pour permettre au GSA d'accéder aux services.

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --role IAM_ROLE
    

    Remplacez les éléments suivants :

    • GSA_NAME : nom du GSA de votre application.
    • PROJECT_ID : ID de projet du GSA.
    • IAM_ROLE : rôle IAM à attribuer au GSA.

    Dans cet exemple, nous allons utiliser le rôle roles/compute.viewer, qui permet un accès en lecture seule aux services de calcul :

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/compute.viewer
    
  3. Accordez des autorisations à votre compte de service Kubernetes (KSA) pour emprunter l'identité du GSA. Pour ce faire, ajoutez une liaison de stratégie IAM avec le rôle roles/iam.workloadIdentityUser :

    gcloud iam service-accounts add-iam-policy-binding GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --member serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE//KSA_NAME] \
        --role roles/iam.workloadIdentityUser
    

    Remplacez les éléments suivants :

    • GSA_NAME
    • PROJECT_ID
    • NAMESPACE : espace de noms Kubernetes de l'application.
    • KSA_NAME : KSA à utiliser pour l'application.

Déploiement d'un exemple d'application

Dans cette section, vous allez déployer un exemple d'application qui accède à l'API Compute Engine. Pour utiliser cet exemple, le rôle IAM roles/compute.viewer doit être attribué à votre compte de service. Pour déployer l'exemple d'application, procédez comme suit :

  1. Copiez le fichier manifeste suivant dans un fichier nommé workload-identity-sample.yaml :

    apiVersion: v1
    kind: Namespace
    metadata:
      name: NAMESPACE
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: KSA_NAME
      namespace: NAMESPACE
    automountServiceAccountToken: false
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: cloud-sdk-config
      namespace: NAMESPACE
    data:
      config: |
        {
          "type": "external_account",
          "audience": "identitynamespace:PROJECT_ID.svc.id.goog:IDENTITY_PROVIDER",
          "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/GSA_NAME@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"
          }
        }
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: cloud-sdk-example
      namespace: NAMESPACE
    spec:
      serviceAccount: KSA_NAME
      containers:
      - name: cloud-sdk
        image: gcr.io/google.com/cloudsdktool/cloud-sdk:latest
        command:
        - /bin/bash
        - -c
        - 'set -eu -o pipefail; while true; do gcloud compute zones list --filter="name ~ us-central1-*"; sleep 5; done'
        env:
        - name: CLOUDSDK_AUTH_CREDENTIAL_FILE_OVERRIDE
          value: /var/run/secrets/tokens/gcp-ksa/google-application-credentials.json
        - name: CLOUDSDK_CORE_PROJECT
          value: PROJECT_ID
        volumeMounts:
        - name: gcp-ksa
          mountPath: /var/run/secrets/tokens/gcp-ksa
          readOnly: true
      volumes:
      - name: gcp-ksa
        projected:
          defaultMode: 420
          sources:
          - serviceAccountToken:
              audience: PROJECT_ID.svc.id.goog
              expirationSeconds: 86400
              path: token
          - configMap:
              name: cloud-sdk-config
              optional: false
              items:
              - key: config
                path: google-application-credentials.json
    

    Remplacez les éléments suivants :

    • PROJECT_ID
    • NAMESPACE
    • KSA_NAME
    • GSA_NAME
    • IDENTITY_PROVIDER par le nom du fournisseur d'identité de votre cluster.
  2. Appliquez le fichier manifeste à votre cluster :

    kubectl apply -f workload-identity-sample.yaml
    
  3. Vérifiez que l'exemple d'application fonctionne et consultez les journaux du pod :

    kubectl logs -f cloud-sdk-example -n NAMESPACE
    

    Remplacez les éléments suivants :

    • NAMESPACE

    Si le pod parvient à accéder à l'API de calcul Google Cloud, la sortie ressemble à ceci :

    NAME           REGION       STATUS  NEXT_MAINTENANCE  TURNDOWN_DATE
    us-central1-c  us-central1  UP
    us-central1-a  us-central1  UP
    us-central1-f  us-central1  UP
    us-central1-b  us-central1  UP
    

Nettoyer

  1. Supprimer l'exemple d'application

    kubectl delete -f manifest.yaml
    
  2. Supprimer la liaison de stratégie IAM du compte de service Google Cloud

    gcloud iam service-accounts remove-iam-policy-binding \
        GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --member serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE//KSA_NAME] \
        roles/iam.workloadIdentityUser
    

    Remplacez les éléments suivants :

    • GSA_NAME
    • PROJECT_ID
    • NAMESPACE
    • KSA_NAME
  3. Supprimez la liaison de stratégie IAM du projet.

    gcloud projects remove-iam-policy-binding PROJECT_ID \
        --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/compute.viewer
    

    Remplacez les éléments suivants :

    • GSA_NAME
    • PROJECT_ID
  4. Supprimer le compte de service Google Cloud

    gcloud iam service-accounts delete \
       GSA_NAME@PROJECT_ID.iam.gserviceaccount.com
    

    Remplacez les éléments suivants :

    • GSA_NAME
    • PROJECT_ID

Étapes suivantes