Configurer la fédération d'identité de charge de travail avec AWS ou Azure

Ce guide explique comment utiliser la fédération d'identité de charge de travail pour permettre aux charges de travail AWS et Azure de s'authentifier auprès de Google Cloud sans clé de compte de service.

Grâce à la fédération d'identité de charge de travail, les charges de travail exécutées sur AWS EC2 et Azure peuvent échanger leurs identifiants spécifiques à l'environnement contre des jetons de service et de sécurité Google Cloud de courte durée.

Les identifiants spécifiques à l'environnement incluent les suivants :

En configurant la fédération d'identité de charge de travail, vous pouvez autoriser ces charges de travail à échanger ces identifiants spécifiques à l'environnement contre des identifiants Google Cloud de courte durée. Les charges de travail peuvent utiliser ces identifiants éphémères pour accéder aux API Google Cloud.

Avant de commencer

  • Configurez l'authentification.

    Sélectionnez l'onglet correspondant à la façon dont vous prévoyez d'utiliser les exemples de cette page :

    Console

    Lorsque vous utilisez la console Google Cloud pour accéder aux services et aux API Google Cloud, vous n'avez pas besoin de configurer l'authentification.

    gcloud

    Vous pouvez utiliser les exemples gcloud CLI de cette page dans l'un des environnements de développement suivants :

    • Cloud Shell : pour utiliser un terminal en ligne avec gcloud CLI déjà configuré, activez Cloud Shell.

      En bas de cette page, une session Cloud Shell démarre et affiche une invite de ligne de commande. L'initialisation de la session peut prendre quelques secondes.

    • Shell local : pour utiliser gcloud CLI dans un environnement de développement local, installez et initialisez gcloud CLI.

    Python

    Pour utiliser les exemples Python de cette page dans un environnement de développement local, installez et initialisez gcloud CLI, puis configurez le service Identifiants par défaut de l'application à l'aide de vos identifiants utilisateur.

    1. Installez Google Cloud CLI.
    2. Pour initialiser gcloudCLI, exécutez la commande suivante :

      gcloud init
    3. Créez des identifiants d'authentification locaux pour votre compte Google :

      gcloud auth application-default login

    Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local dans la documentation sur l'authentification Google Cloud.

Préparer votre fournisseur d'identité externe

Vous n'avez besoin de suivre ces étapes qu'une seule fois pour chaque locataire Azure ou compte AWS.

AWS

Vous n'avez pas besoin de modifier la configuration dans votre compte AWS.

Après avoir configuré un pool d'identités de charge de travail pour qu'il approuve votre compte AWS, vous pouvez autoriser les utilisateurs AWS et les rôles AWS à utiliser des identifiants de sécurité AWS permanents ou temporaires pour obtenir des identifiants Google Cloud de courte durée.

Azure

Vous devez créer une application Azure AD dans votre locataire Azure AD et la configurer pour pouvoir l'utiliser pour la fédération d'identité de charge de travail.

Une fois que vous avez configuré un pool d'identités de charge de travail pour approuver l'application, les utilisateurs Azure et les comptes de services principaux peuvent demander des jetons d'accès pour cette application et les échanger contre des identifiants Google Cloud de courte durée.

Pour créer l'application, procédez comme suit :

  1. Créez une application Azure AD et un compte principal de service.

  2. Définissez un URI d'ID d'application pour l'application. Vous pouvez utiliser l'URI d'ID d'application par défaut (api://APPID) ou spécifier un URI personnalisé.

    Vous aurez besoin de l'URI d'ID d'application lors de la configuration du fournisseur du pool d'identités de charge de travail.

Pour permettre à une application d'obtenir des jetons d'accès pour l'application Azure AD, vous pouvez utiliser des identités gérées :

  1. Créez une identité gérée. Notez l'ID d'objet de l'identité gérée. Vous en aurez besoin plus tard lors de la configuration de l'emprunt d'identité.

  2. Attribuez l'identité gérée à une machine virtuelle ou à une autre ressource qui exécute votre application.

Configurer la fédération d'identité de charge de travail

Vous n'avez besoin d'effectuer ces étapes qu'une seule fois par compte AWS ou locataire Azure AD. Vous pouvez ensuite utiliser le même pool d'identités de charge de travail et le même fournisseur pour plusieurs charges de travail et sur plusieurs projets Google Cloud.

Pour commencer à configurer la fédération d'identité de charge de travail, procédez comme suit :

  1. Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.

    Accéder au sélecteur de projet

  2. Il est préférable d'utiliser un projet dédié pour gérer les pools et les fournisseurs d'identités de charge de travail.
  3. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  4. Activer les API IAM, Resource Manager, Service Account Credentials, and Security Token Service.

    Activer les API

Définir un mappage et une condition d'attribut

Les identifiants spécifiques à l'environnement de votre charge de travail AWS ou Azure contiennent plusieurs attributs. Vous devez choisir l'attribut que vous souhaitez utiliser comme identifiant de sujet (google.subject) dans Google Cloud.

Google Cloud utilise l'identifiant de sujet dans Cloud Audit Logs et dans les identifiants principaux pour identifier de manière unique un utilisateur ou un rôle AWS ou Azure.

Vous pouvez éventuellement mapper d'autres attributs. Vous pouvez ensuite faire référence à ces attributs supplémentaires lorsque vous autorisez l'accès aux ressources.

AWS

Vos mappages d'attributs peuvent utiliser les champs de réponse pour GetCallerIdentity comme attributs sources. Ces champs incluent les suivants :

  • account : numéro de compte AWS.
  • arn : ARN AWS de l'entité externe.
  • userid : identifiant unique de l'entité appelante.

Si votre application s'exécute sur une instance Amazon Elastic Compute Cloud (EC2) avec un rôle associé, vous pouvez utiliser le mappage d'attributs suivant :

google.subject=assertion.arn
attribute.account=assertion.account
attribute.aws_role=assertion.arn.extract('assumed-role/{role}/')
attribute.aws_ec2_instance=assertion.arn.extract('assumed-role/{role_and_session}').extract('/{session}')

Le mappage effectue les opérations suivantes :

  • Utilisez l'ARN comme identifiant de sujet (exemple : "arn:aws:sts::000000000000:assumed-role/ec2-my-role/i-00000000000000000).
  • Introduisez un attribut personnalisé account et attribuez-lui l'ID de compte AWS.
  • Introduisez un attribut personnalisé aws_role et attribuez-lui le nom de rôle AWS (exemple : ec2-my-role).
  • Introduisez un attribut personnalisé aws_ec2_instance et attribuez-lui l'ID d'instance EC2 (exemple : i-00000000000000000).

Ce mappage vous permet d'accorder l'accès aux éléments suivants :

  • Une instance EC2 spécifique :

    principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.aws_ec2_instance/EC2_INSTANCE_ID
    

  • Tous les utilisateurs et toutes les instances d'un rôle :

    principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.aws_role/ROLE_NAME
    

Azure

Vos mappages d'attributs peuvent utiliser les revendications intégrées aux jetons d'accès Azure, y compris les revendications personnalisées, en tant qu'attributs sources. Dans la plupart des cas, il est préférable d'utiliser la revendication sub comme identifiant de sujet :

google.subject=assertion.sub

Pour un jeton d'accès attribué à une identité gérée, la revendication sub contient l'ID d'objet de l'identité gérée. Si vous utilisez une autre revendication, assurez-vous qu'elle est unique et ne peut pas être réaffectée.

Si vous n'êtes pas sûr de la liste des revendications que vous pouvez référencer, procédez comme suit :

  1. Connectez-vous à une VM Azure à laquelle une identité gérée est attribuée.

  2. Obtenez un jeton d'accès auprès du service de métadonnées d'instance Azure (IMDS) :

    Bash

    curl \
      "http://169.254.169.254/metadata/identity/oauth2/token?resource=APP_ID_URI&api-version=2018-02-01" \
      -H "Metadata: true" | jq -r .access_token
    

    Cette commande utilise l'outil jq. jq est disponible par défaut dans Cloud Shell.

    PowerShell

    $SubjectTokenType = "urn:ietf:params:oauth:token-type:jwt"
    $SubjectToken = (Invoke-RestMethod `
      -Uri "http://169.254.169.254/metadata/identity/oauth2/token?resource=APP_ID_URI&api-version=2018-02-01" `
      -Headers @{Metadata="true"}).access_token
    Write-Host $SubjectToken
    

    Remplacez APP_ID_URI par l'URI d'ID d'application de l'application que vous avez configurée pour la fédération d'identité de charge de travail.

  3. Dans un navigateur Web, accédez à https://jwt.ms/ et collez le jeton d'accès dans la zone de texte.

  4. Cliquez sur Revendications pour afficher la liste des revendications intégrées dans le jeton d'accès.

Pour les identités de service, il n'est généralement pas nécessaire de créer un mappage pour google.groups ou tout attribut personnalisé.

Vous pouvez également définir une condition d'attribut. Les conditions d'attribut sont des expressions CEL qui peuvent vérifier les attributs d'assertion et les attributs cibles. Si la condition d'attribut renvoie true pour un identifiant donné, celui-ci est accepté. Dans le cas contraire, l'identifiant est rejeté.

AWS

Vous pouvez utiliser une condition d'attribut pour limiter les utilisateurs et les rôles IAM pouvant utiliser la fédération d'identité de charge de travail pour obtenir des jetons Google Cloud de courte durée.

Par exemple, la condition suivante restreint l'accès aux rôles AWS et interdit les autres identifiants IAM :

assertion.arn.startsWith('arn:aws:sts::AWS_ACCOUNT_ID:assumed-role/')

Azure

Vous pouvez utiliser une condition d'attribut pour limiter les utilisateurs et les comptes principaux de service pouvant utiliser la fédération d'identité de charge de travail afin d'obtenir des jetons Google Cloud de courte durée. Vous pouvez également configurer votre application Azure AD pour utiliser des attributions de rôles d'application.

Créer le pool d'identité de charge de travail et le fournisseur

Rôles requis

Pour obtenir les autorisations nécessaires pour configurer la fédération d'identité de charge de travail, demandez à votre administrateur de vous accorder les rôles IAM suivants sur le projet :

Pour en savoir plus sur l'attribution de rôles, consultez la section Gérer les accès.

Vous pouvez également obtenir les autorisations requises via des rôles personnalisés ou d'autres rôles prédéfinis.

Le rôle de base IAM "Propriétaire" (roles/owner) inclut également des autorisations permettant de configurer la fédération d'identité. Les rôles de base ne doivent pas être attribués dans un environnement de production, mais ils peuvent être attribués dans un environnement de développement ou de test.

Vous avez maintenant collecté toutes les informations dont vous avez besoin pour créer un pool d'identités de charge de travail et un fournisseur :

Console

  1. Dans la console Google Cloud, accédez à la page Nouveau fournisseur et pool de charges de travail.

    Accéder au nouveau fournisseur de charges de travail et au pool

  2. Dans la section Créer un pool d'identités, saisissez les informations suivantes :

    • Nom : nom du pool. Le nom est également utilisé comme ID du pool. Vous ne pourrez pas modifier l'ID du pool par la suite.
    • Description : texte décrivant l'objectif du pool.
  3. Cliquez sur Continuer.

  4. Configurez les paramètres du fournisseur :

    AWS

    Configurez les paramètres de fournisseur suivants :

    • Sélectionnez un fournisseur : AWS.
    • Nom du fournisseur : nom du fournisseur. Le nom est également utilisé comme ID de fournisseur. Vous ne pourrez pas modifier l'ID du fournisseur par la suite.

    Azure

    Configurez les paramètres de fournisseur suivants :

    • Sélectionner un fournisseur : OpenID Connect (OIDC).
    • Nom du fournisseur : nom du fournisseur. Le nom est également utilisé comme ID de fournisseur. Vous ne pourrez pas modifier l'ID du fournisseur par la suite.
    • URL de l'émetteur : https://sts.windows.net/TENANT_ID. Remplacez TENANT_ID par l'ID de locataire (GUID) de votre locataire Azure AD.
    • Audiences autorisées : URI d'ID d'application que vous avez utilisé lors de l'enregistrement de l'application dans Azure AD.
  5. Cliquez sur Continuer.

  6. Dans la section Configurer les attributs du fournisseur, ajoutez les mappages d'attributs que vous avez identifiés précédemment.

  7. Dans la section Conditions d'attribut, saisissez la condition d'attribut que vous avez identifiée précédemment. Laissez le champ vide si vous n'avez pas de condition d'attribut.

  8. Cliquez sur Enregistrer pour créer le pool d'identités de charge de travail et le fournisseur.

gcloud

  1. Créez un pool d'identités de charge de travail :

    gcloud iam workload-identity-pools create POOL_ID \
        --location="global" \
        --description="DESCRIPTION" \
        --display-name="DISPLAY_NAME"
    

    Remplacez les éléments suivants :

    • POOL_ID : ID unique du pool.
    • DISPLAY_NAME : nom du pool.
    • DESCRIPTION : description du pool. Cette description apparaît lorsque vous accordez l'accès aux identités du pool.
  2. Ajoutez un fournisseur de pool d'identités de charge de travail :

    AWS

    Pour créer le fournisseur de pool d'identités de charge de travail pour AWS, exécutez la commande suivante :

    gcloud iam workload-identity-pools providers create-aws PROVIDER_ID \
      --location="global"  \
      --workload-identity-pool="POOL_ID" \
      --account-id="ACCOUNT_ID" \
      --attribute-mapping="MAPPINGS" \
      --attribute-condition="CONDITIONS"
    

    Remplacez les éléments suivants :

    Exemple :

    gcloud iam workload-identity-pools providers create-aws example-provider \
      --location="global"  \
      --workload-identity-pool="pool-1" \
      --account-id="123456789000" \
      --attribute-mapping="google.subject=assertion.arn"
    

    Azure

    Pour créer le fournisseur de pools d'identités de charge de travail pour Azure, exécutez la commande suivante :

    gcloud iam workload-identity-pools providers create-oidc PROVIDER_ID \
        --location="global" \
        --workload-identity-pool="POOL_ID" \
        --issuer-uri="ISSUER_URI" \
        --allowed-audiences="APPLICATION_ID_URI" \
        --attribute-mapping="MAPPINGS" \
        --attribute-condition="CONDITIONS"
    

    Remplacez les éléments suivants :

    • PROVIDER_ID : ID unique du fournisseur.
    • POOL_ID : ID du pool.
    • ISSUER_URI : ID de locataire (GUID) de votre locataire Azure AD, parfois au format https://sts.windows.net/TENANT_ID. L'URI d'émetteur peut varier et pour trouver l'URI de l'émetteur, vous pouvez déboguer votre JWT à l'aide de JWT.io.
    • APPLICATION_ID_URI : URI d'ID d'application que vous avez utilisé lors de l'enregistrement de l'application dans Azure AD.
    • MAPPINGS : liste de mappages d'attributs que vous avez précédemment identifiés, séparés par des virgules.
    • CONDITIONS : (facultatif) condition d'attribut que vous avez identifiée précédemment.

    Exemple :

    gcloud iam workload-identity-pools providers create-oidc example-provider \
        --location="global" \
        --workload-identity-pool="pool-1" \
        --issuer-uri="https://sts.windows.net/00000000-1111-2222-3333-444444444444" \
        --allowed-audiences="api://my-app" \
        --attribute-mapping="google.subject=assertion.sub,google.groups=assertion.groups"
    

Authentifier une charge de travail

Vous devez effectuer ces étapes une fois par charge de travail.

Créer un compte de service pour la charge de travail externe

  1. Activer les API IAM, Security Token Service, and Service Account Credentials.

    Activer les API

  2. Créez un compte de service qui représente la charge de travail. Il est préférable d'utiliser un compte de service dédié pour chaque charge de travail.

    Le compte de service ne doit pas obligatoirement se trouver dans le même projet que le pool d'identités de charge de travail.

  3. Accordez au compte de service l'accès aux ressources auxquelles vous souhaitez que les identités externes accèdent.

Autoriser la charge de travail externe à emprunter l'identité du compte de service

Pour autoriser les identités externes à emprunter l'identité d'un compte de service, vous devez leur accorder le rôle d'utilisateur Workload Identity (roles/iam.workloadIdentityUser) sur le compte de service. Vous pouvez accorder le rôle à une identité externe spécifique ou à plusieurs identités externes :

  • Pour une identité externe spécifique, écrivez une condition d'attribut qui vérifie l'attribut google.subject.
  • Pour un groupe d'identités externes, créez une condition d'attribut qui vérifie l'attribut google.groups ou un attribut personnalisé attribute.NAME.

Console

Pour autoriser les identités externes à emprunter l'identité d'un compte de service à l'aide de la console Google Cloud, procédez comme suit :

  1. Dans la console Google Cloud, accédez à la page Pools d'identités de charge de travail.

    Accéder aux pools d'identité de charge de travail

  2. Recherchez le pool d'identités de charge de travail que vous souhaitez mettre à jour, puis sélectionnez-le.

  3. Pour accorder l'accès au pool d'identités de charge de travail sélectionné, cliquez sur Accorder l'accès.

  4. Dans la liste Compte de service, sélectionnez le compte de service dont les identités externes doivent emprunter l'identité.

  5. Pour choisir les identités du pool qui peuvent emprunter l'identité du compte de service, effectuez l'une des actions suivantes :

    • Pour n'autoriser que les identités spécifiques du pool d'identités de charge de travail à emprunter l'identité du compte de service, sélectionnez Uniquement les identités correspondant au filtre.

      Dans la liste Nom de l'attribut, sélectionnez l'attribut sur lequel vous souhaitez filtrer les données.

      Dans le champ Valeur d'attribut, saisissez la valeur attendue de l'attribut. Par exemple, si vous utilisez un mappage d'attribut google.subject=assertion.sub, définissez le nom de l'attribut sur subject et la valeur d'attribut sur la valeur de la revendication sub dans les jetons émis par votre fournisseur d'identité externe.

  6. Pour enregistrer la configuration, cliquez sur Enregistrer, puis sur Ignorer.

gcloud

Pour autoriser les identités externes à emprunter l'identité d'un compte de service à l'aide de gcloud CLI, procédez comme suit :

  1. Pour obtenir le numéro de votre projet actuel, exécutez la commande suivante :

    gcloud projects describe $(gcloud config get-value core/project) --format=value\(projectNumber\)
    
  2. Pour attribuer le rôle utilisateur Workload Identity (roles/iam.workloadIdentityUser) aux identités externes qui répondent à un certain critère, procédez comme suit :

    Par sujet

    gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \
        --role=roles/iam.workloadIdentityUser \
        --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT"
    

    Par groupe

    gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \
        --role=roles/iam.workloadIdentityUser \
        --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP"
    

    Par attribut

    gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \
        --role=roles/iam.workloadIdentityUser \
        --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE"
    

    Remplacez les éléments suivants :

    • SERVICE_ACCOUNT_EMAIL : adresse e-mail du compte de service.
    • PROJECT_NUMBER : numéro de projet du projet contenant le pool d'identités de charge de travail.
    • POOL_ID : ID du pool d'identités de charge de travail.
    • SUBJECT : valeur attendue pour l'attribut que vous avez mappé sur google.subject.
    • GROUP : valeur attendue pour l'attribut que vous avez mappé sur google.groups.
    • ATTRIBUTE_NAME : nom d'un attribut personnalisé dans votre mappage d'attributs

Créer une configuration d'identifiants

Les bibliothèques clientes Cloud, gcloud CLI et Terraform peuvent obtenir automatiquement des identifiants externes et les utiliser pour emprunter l'identité d'un compte de service. Pour permettre aux bibliothèques et aux outils de mener ce processus à son terme, vous devez fournir un fichier de configuration des identifiants. Ce fichier définit les éléments suivants :

  • Où obtenir des identifiants externes
  • Quel pool d'identités de charge de travail et quel fournisseur utiliser
  • À quel compte de service emprunter l'identité

Pour créer un fichier de configuration d'identifiants, procédez comme suit :

Console

Téléchargez un fichier de configuration des identifiants dans la console Google Cloud :

  1. Dans la console Google Cloud, accédez à la page Pools d'identités de charge de travail.

    Accéder aux pools d'identité de charge de travail

  2. Recherchez le pool d'identités de charge de travail contenant le fournisseur d'identité que vous souhaitez utiliser, puis cliquez dessus.

  3. Sélectionnez Comptes de service connectés.

  4. Recherchez le compte de service que vous souhaitez utiliser, puis cliquez sur Télécharger.

  5. Dans la boîte de dialogue Configurer votre application, sélectionnez le fournisseur qui contient les identités externes qui emprunteront l'identité du compte de service.

  6. Spécifiez les paramètres supplémentaires suivants :

    AWS

    Aucun paramètre supplémentaire n'est requis.

    Azure

    URL d'ID d'application : URI d'ID application de l'application Azure

  7. Sélectionnez Télécharger la configuration pour télécharger le fichier de configuration des identifiants, puis cliquez sur Fermer.

gcloud

Pour créer un fichier de configuration d'identifiants à l'aide de gcloud iam workload-identity-pools create-cred-config, procédez comme suit :

AWS

Pour créer un fichier de configuration des identifiants permettant à la bibliothèque d'obtenir un jeton d'accès à partir des métadonnées de l'instance EC2, procédez comme suit :

gcloud iam workload-identity-pools create-cred-config \
    projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \
    --service-account=SERVICE_ACCOUNT_EMAIL \
    --service-account-token-lifetime-seconds=SERVICE_ACCOUNT_TOKEN_LIFETIME \
    --aws \
    --output-file=FILEPATH.json

Remplacez les éléments suivants :

  • PROJECT_NUMBER : numéro de projet du projet contenant le pool d'identités de charge de travail
  • POOL_ID : ID du pool d'identités de charge de travail
  • PROVIDER_ID : ID du fournisseur du pool d'identités de charge de travail
  • SERVICE_ACCOUNT_EMAIL : adresse e-mail du compte de service.
  • SERVICE_ACCOUNT_TOKEN_LIFETIME : durée de vie du jeton d'accès au compte de service, en secondes. Sa valeur par défaut est d'une heure lorsqu'elle n'est pas spécifiée. Pour spécifier une durée de vie supérieure à une heure, vous devez configurer la contrainte de règle d'administration constraints/iam.allowServiceAccountCredentialLifetimeExtension.
  • FILEPATH : fichier dans lequel enregistrer la configuration.

Si vous utilisez AWS IMDSv2, une option supplémentaire --enable-imdsv2 doit être ajoutée à la commande gcloud iam workload-identity-pools create-cred-config :

gcloud iam workload-identity-pools create-cred-config \
    projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \
    --service-account=SERVICE_ACCOUNT_EMAIL \
    --aws \
    --enable-imdsv2 \
    --output-file=FILEPATH.json

Si l'utilisation du serveur de métadonnées AWS n'est pas possible, vous pouvez fournir des identifiants de sécurité AWS via les variables d'environnement AWS suivantes :

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY
  • AWS_REGION ou AWS_DEFAULT_REGION
  • Facultatif : AWS_SESSION_TOKEN.

Les bibliothèques et gcloud CLI utilisent ces variables d'environnement AWS lorsque le serveur de métadonnées AWS n'est pas disponible.

Azure

Créez un fichier de configuration des identifiants autorisant la bibliothèque à obtenir un jeton d'accès à partir du service de métadonnées d'instance Azure (IMDS) :

gcloud iam workload-identity-pools create-cred-config \
    projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \
    --service-account=SERVICE_ACCOUNT_EMAIL \
    --service-account-token-lifetime-seconds=SERVICE_ACCOUNT_TOKEN_LIFETIME \
    --azure \
    --app-id-uri APPLICATION_ID_URI \
    --output-file=FILEPATH.json

Remplacez les éléments suivants :

  • PROJECT_NUMBER : numéro de projet du projet contenant le pool d'identités de charge de travail
  • POOL_ID : ID du pool d'identités de charge de travail
  • PROVIDER_ID : ID du fournisseur du pool d'identités de charge de travail
  • SERVICE_ACCOUNT_EMAIL : adresse e-mail du compte de service.
  • APPLICATION_ID_URI : URI de l'ID d'application de l'application Azure.
  • SERVICE_ACCOUNT_TOKEN_LIFETIME : durée de vie du jeton d'accès au compte de service, en secondes. Sa valeur par défaut est d'une heure lorsqu'elle n'est pas spécifiée. Pour spécifier une durée de vie supérieure à une heure, vous devez configurer la contrainte de règle d'administration constraints/iam.allowServiceAccountCredentialLifetimeExtension.
  • FILEPATH : fichier dans lequel enregistrer la configuration.

Utiliser la configuration des identifiants pour accéder à Google Cloud

Pour permettre aux outils et aux bibliothèques clientes d'utiliser votre configuration d'identifiants, procédez comme suit dans votre environnement AWS ou Azure :

  1. Initialisez une variable d'environnement GOOGLE_APPLICATION_CREDENTIALS et pointez-la vers le fichier de configuration des identifiants :

    Bash

      export GOOGLE_APPLICATION_CREDENTIALS=`pwd`/FILEPATH.json
      
    FILEPATH est le chemin d'accès relatif au fichier de configuration des identifiants.

    PowerShell

      $env:GOOGLE_APPLICATION_CREDENTIALS = Resolve-Path 'FILEPATH.json'
      
    FILEPATH est le chemin d'accès relatif au fichier de configuration des identifiants.
  2. Utilisez une bibliothèque cliente ou un outil compatible avec la fédération d'identité de charge de travail et capable de trouver automatiquement les identifiants :

    C++

    Les bibliothèques clientes Google Cloud pour C++ sont compatibles avec la fédération d'identité de charge de travail depuis la version v2.6.0. Pour utiliser la fédération d'identité de charge de travail, vous devez créer les bibliothèques clientes avec la version 1.36.0 ou ultérieure de gRPC.

    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é de charge de travail 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.

    gcloud

    Pour vous authentifier à l'aide de la fédération d'identité de charge de travail, utilisez la commande gcloud auth login :

    gcloud auth login --cred-file=FILEPATH.json
    

    Remplacez FILEPATH par le chemin d'accès au fichier de configuration des identifiants.

    La fédération d'identité de charge de travail dans gcloud CLI est disponible dans les versions 363.0.0 et ultérieures de gcloud CLI.

    Terraform

    Le fournisseur Google Cloud est compatible avec la fédération d'identité de charge de travail si vous utilisez la version 3.61.0 ou ultérieure :

    terraform {
      required_providers {
        google = {
          source  = "hashicorp/google"
          version = "~> 3.61.0"
        }
      }
    }
    

    gsutil

    Pour vous authentifier à l'aide de la fédération d'identité de charge de travail, appliquez l'une des méthodes suivantes :

    Lorsque vous utilisez gsutil conjointement avec gcloud, connectez-vous comme d'habitude :

    gcloud auth login --cred-file=FILEPATH.json
    

    Si vous utilisez gsutil en tant qu'application de ligne de commande autonome, modifiez le fichier .boto pour inclure la section suivante :

    [Credentials]
    gs_external_account_file = FILEPATH
    

    Dans les deux cas, remplacez FILEPATH par le chemin d'accès au fichier de configuration des identifiants.

    La fédération d'identité de charge de travail dans gsutil est compatible avec les versions 379.0.0 et ultérieures de gcloud CLI.

    bq

    Pour vous authentifier à l'aide de la fédération d'identité de charge de travail, utilisez la commande gcloud auth login, comme suit :

    gcloud auth login --cred-file=FILEPATH.json
    

    Remplacez FILEPATH par le chemin d'accès au fichier de configuration des identifiants.

    La fédération d'identité de charge de travail dans bq est disponible dans les versions 390.0.0 et ultérieures de gcloud CLI.

    Si vous ne pouvez pas utiliser de bibliothèque cliente compatible avec la fédération d'identité de charge de travail, vous pouvez vous authentifier de manière automatisée à l'aide de l'API REST.

Scénarios avancés

Authentifier une charge de travail à l'aide de l'API REST

Si vous ne pouvez pas utiliser les bibliothèques clientes, vous pouvez suivre les étapes ci-dessous pour permettre à une charge de travail externe d'obtenir un jeton d'accès éphémère à l'aide de l'API REST :

  1. Obtenez des identifiants auprès de votre fournisseur d'identité externe :

    AWS

    Créez un document JSON contenant les informations que vous devez normalement inclure dans une requête adressée au point de terminaison GetCallerIdentity() AWS, y compris une signature de requête valide.

    La fédération d'identité de charge de travail fait référence à ce document JSON sous la forme d'un jeton GetCallerIdentity. Le jeton permet à la fédération d'identité de charge de travail de valider l'identité sans révéler la clé d'accès secrète AWS.

    Un jeton GetCallerIdentity ressemble à ce qui suit :

    {
      "url": "https://sts.amazonaws.com?Action=GetCallerIdentity&Version=2011-06-15",
      "method": "POST",
      "headers": [
        {
          "key": "Authorization",
          "value" : "AWS4-HMAC-SHA256 Credential=AKIASOZTBDV4D7ABCDEDF/20200228/us-east-1/sts/aws4_request, SignedHeaders=host;x-amz-date,Signature=abcedefdfedfd"
        },
        {
          "key": "host",
          "value": "sts.amazonaws.com"
        },
        {
          "key": "x-amz-date",
          "value": "20200228T225005Z"
        },
        {
          "key": "x-goog-cloud-target-resource",
          "value": "//iam.googleapis.com/projects/12345678/locations/global/workloadIdentityPools/my-pool/providers/my-aws-provider"
        },
        {
          "key": "x-amz-security-token",
          "value": "GizFWJTqYX...xJ55YoJ8E9HNU="
        }
      ]
    }
    

    Le jeton contient les champs suivants :

    • url : URL du point de terminaison AWS STS pour GetCallerIdentity(), avec le corps d'une requête GetCallerIdentity() standard ajoutée en tant que paramètres de requête. Par exemple, https://sts.amazonaws.com?Action=GetCallerIdentity&Version=2011-06-15. Nous vous recommandons d'utiliser des points de terminaison STS régionaux et de concevoir une infrastructure fiable pour vos charges de travail. Pour en savoir plus, consultez la section Points de terminaison STS AWS régionaux.
    • method : méthode de requête HTTP : POST.
    • headers : en-têtes de requête HTTP, qui doivent inclure les éléments suivants :
      • Authorization : signature de la requête.
      • host : nom d'hôte du champ url, par exemple sts.amazonaws.com.
      • x-amz-date : heure d'envoi de la requête, formatée en tant que chaîne ISO 8601 au format de base. Cette valeur est généralement définie sur l'heure actuelle et permet d'éviter les attaques de répétitions.
      • x-goog-cloud-target-resource : nom complet de la ressource du fournisseur d'identité sans préfixe https:. Exemple :
        //iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID
        
      • x-amz-security-token : jeton de session Requis uniquement si vous utilisez des identifiants de sécurité temporaires.

    L'exemple suivant crée un jeton GetCallerIdentity encodé au format URL. Extrayez le jeton encodé au format URL pour une utilisation ultérieure. Il crée également un jeton lisible à titre indicatif :

    import json
    import urllib
    
    import boto3
    from botocore.auth import SigV4Auth
    from botocore.awsrequest import AWSRequest
    
    def create_token_aws(project_number: str, pool_id: str, provider_id: str) -> None:
        # Prepare a GetCallerIdentity request.
        request = AWSRequest(
            method="POST",
            url="https://sts.amazonaws.com/?Action=GetCallerIdentity&Version=2011-06-15",
            headers={
                "Host": "sts.amazonaws.com",
                "x-goog-cloud-target-resource": f"//iam.googleapis.com/projects/{project_number}/locations/global/workloadIdentityPools/{pool_id}/providers/{provider_id}",
            },
        )
    
        # Set the session credentials and Sign the request.
        # get_credentials loads the required credentials as environment variables.
        # Refer:
        # https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html
        SigV4Auth(boto3.Session().get_credentials(), "sts", "us-east-1").add_auth(request)
    
        # Create token from signed request.
        token = {"url": request.url, "method": request.method, "headers": []}
        for key, value in request.headers.items():
            token["headers"].append({"key": key, "value": value})
    
        # The token lets workload identity federation verify the identity without revealing the AWS secret access key.
        print("Token:\n%s" % json.dumps(token, indent=2, sort_keys=True))
        print("URL encoded token:\n%s" % urllib.parse.quote(json.dumps(token)))
    
    def main() -> None:
        # TODO(Developer): Replace the below credentials.
        # project_number: Google Project number (not the project id)
        project_number = "my-project-number"
        pool_id = "my-pool-id"
        provider_id = "my-provider-id"
    
        create_token_aws(project_number, pool_id, provider_id)
    
    if __name__ == "__main__":
        main()

    Initialisez les variables suivantes :

    Bash

    SUBJECT_TOKEN_TYPE="urn:ietf:params:aws:token-type:aws4_request"
    SUBJECT_TOKEN=TOKEN
    

    PowerShell

    $SubjectTokenType = "urn:ietf:params:aws:token-type:aws4_request"
    $SubjectToken = "TOKEN"
    

    TOKEN correspond au jeton GetCallerIdentity encodé au format URL qui a été généré par le script ci-dessus.

    Azure

    Connectez-vous à une VM Azure dotée d'une identité gérée assignée et obtenez un jeton d'accès auprès du service de métadonnées d'instance Azure (IMDS) :

    Bash

    SUBJECT_TOKEN_TYPE="urn:ietf:params:oauth:token-type:jwt"
    SUBJECT_TOKEN=$(curl \
      "http://169.254.169.254/metadata/identity/oauth2/token?resource=APP_ID_URI&api-version=2018-02-01" \
      -H "Metadata: true" | jq -r .access_token)
    echo $SUBJECT_TOKEN
    

    Cette commande utilise l'outil jq. jq est disponible par défaut dans Cloud Shell.

    PowerShell

    $SubjectTokenType = "urn:ietf:params:oauth:token-type:jwt"
    $SubjectToken = (Invoke-RestMethod `
      -Uri "http://169.254.169.254/metadata/identity/oauth2/token?resource=APP_ID_URI&api-version=2018-02-01" `
      -Headers @{Metadata="true"}).access_token
    Write-Host $SubjectToken
    

    APP_ID_URI est l'URI d'ID application de l'application que vous avez configurée pour la fédération d'identité de charge de travail.

  2. Utilisez l'API Security Token Service pour échanger l'identifiant contre un jeton d'accès éphémère :

    Bash

    STS_TOKEN=$(curl https://sts.googleapis.com/v1/token \
        --data-urlencode "audience=//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID" \
        --data-urlencode "grant_type=urn:ietf:params:oauth:grant-type:token-exchange" \
        --data-urlencode "requested_token_type=urn:ietf:params:oauth:token-type:access_token" \
        --data-urlencode "scope=https://www.googleapis.com/auth/cloud-platform" \
        --data-urlencode "subject_token_type=$SUBJECT_TOKEN_TYPE" \
        --data-urlencode "subject_token=$SUBJECT_TOKEN" | jq -r .access_token)
    echo $STS_TOKEN
    

    PowerShell

    [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12
    $StsToken = (Invoke-RestMethod `
        -Method POST `
        -Uri "https://sts.googleapis.com/v1/token" `
        -ContentType "application/json" `
        -Body (@{
            "audience"           = "//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID"
            "grantType"          = "urn:ietf:params:oauth:grant-type:token-exchange"
            "requestedTokenType" = "urn:ietf:params:oauth:token-type:access_token"
            "scope"              = "https://www.googleapis.com/auth/cloud-platform"
            "subjectTokenType"   = $SubjectTokenType
            "subjectToken"       = $SubjectToken
        } | ConvertTo-Json)).access_token
    Write-Host $StsToken
    

    Remplacez les valeurs suivantes :

    • PROJECT_NUMBER : numéro de projet du projet contenant le pool d'identités de charge de travail
    • POOL_ID : ID du pool d'identités de charge de travail
    • PROVIDER_ID : ID du fournisseur du pool d'identités de charge de travail
  3. Utilisez le jeton du service de jetons de sécurité pour appeler la méthode generateAccessToken de l'API Service Account Credentials IAM afin d'obtenir un jeton d'accès :

Bash

ACCESS_TOKEN=$(curl -0 -X POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT_EMAIL:generateAccessToken \
    -H "Content-Type: text/json; charset=utf-8" \
    -H "Authorization: Bearer $STS_TOKEN" \
    -d @- <<EOF | jq -r .accessToken
    {
        "scope": [ "https://www.googleapis.com/auth/cloud-platform" ]
    }
EOF
)
echo $ACCESS_TOKEN

PowerShell

$AccessToken = (Invoke-RestMethod `
    -Method POST `
    -Uri "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT_EMAIL:generateAccessToken" `
    -Headers @{ "Authorization" = "Bearer $StsToken" } `
    -ContentType "application/json" `
    -Body (@{
        "scope" = , "https://www.googleapis.com/auth/cloud-platform"
    } | ConvertTo-Json)).accessToken
Write-Host $AccessToken

Remplacez SERVICE_ACCOUNT_EMAIL par l'adresse e-mail du compte de service.

Étapes suivantes