Accéder aux ressources d'AWS

Ce document explique comment utiliser la fédération d'identité pour accéder aux ressources Google Cloud à partir d'Amazon Web Services (AWS).

Traditionnellement, les applications exécutées en dehors de Google Cloud ont toujours utilisé des clés de compte de service pour accéder aux ressources Google Cloud. Grâce à la fédération d'identité, vous pouvez autoriser un utilisateur ou un rôle AWS à emprunter l'identité d'un compte de service. Cela permet à votre charge de travail d'accéder directement aux ressources Google Cloud à l'aide d'un jeton d'accès de courte durée, et élimine les tâches de maintenance et de sécurité associées aux clés de compte de service.

Avant de commencer

  1. Activer les API IAM, Resource Manager, Service Account Credentials, and Security Token Service (STS).

    Activer les API

  2. Vérifiez que vous disposez des rôles Administrateur de pools Workload Identity (roles/iam.workloadIdentityPoolAdmin) et Administrateur de compte de service (roles/iam.serviceAccountAdmin) sur le projet.

    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.

  3. Mettez à jour la règle d'administration de votre organisation pour autoriser la fédération à partir d'AWS.

    Vous pouvez également spécifier les ID des compte AWS autorisés à accéder à vos ressources Google Cloud.

  4. Créez un rôle AWS et notez son nom de ressource Amazon (ARN).

  5. Créez un compte de service Google Cloud.

  6. Accordez l'accès au compte de service pour lui permettre d'appeler les API Google Cloud nécessaires à votre charge de travail.

Paramètres du fournisseur d'identité pour AWS

Lorsque vous ajoutez AWS comme fournisseur d'identité pour votre pool d'identités de charge de travail, vous devez fournir les éléments suivants :

Vous pouvez également fournir les informations suivantes :

  • Un nom à afficher et une description.

  • Une liste de mappages d'attributs qui mappent les attributs d'un jeton AWS aux attributs d'un jeton Google. Par défaut, chaque pool utilise les mappages d'attributs suivants, qui couvrent les scénarios les plus courants :

    Google AWS Description
    google.subject assertion.arn Compte principal authentifié par IAM. Il s'agit également de l'objet qui s'affiche dans les entrées de journaux Cloud Logging. Ce mappage est automatiquement renseigné avec l'ARN au format arn:aws:sts::ACCOUNT_ID:assumed-role/AWS_ROLE/AWS_SESSION_NAME.
    attribute.aws_role Rôle AWS Le rôle AWS, au format arn:aws:sts::ACCOUNT_ID:assumed-role/AWS_ROLE.

    Vous pouvez également spécifier des mappages personnalisés que vous pouvez référencer dans les liaisons de rôles IAM. Le fait de spécifier un mappage personnalisé remplace les valeurs par défaut. Utilisez assertion pour faire référence aux identifiants AWS, google pour les attributs Google et attribute pour les attributs personnalisés.

    Par exemple, l'exemple suivant mappe google.subject sur assertion.arn et attribute.aws_account sur assertion.account :

    google.subject=assertion.arn,
    attribute.aws_account=assertion.account
    

    Consultez la documentation de GetCallerIdentity() pour obtenir la liste des attributs des jetons AWS que vous pouvez référencer. Les attributs de la documentation AWS utilisent le camel case et les majuscules, mais le mappage d'attributs pour la fédération d'identité de la charge de travail utilise des minuscules. Par exemple, Account devient assertion.account.

    Pour les assertions plus complexes, vous pouvez utiliser le Common Expression Language. Exemple :

    attribute.environment=assertion.arn.contains(":instance-profile/Production") ? "prod" : "test"
    

    Pour référencer une partie spécifique d'un attribut dans une expression, utilisez la fonction CEL extract(), qui extrait une valeur d'un attribut en suivant un modèle que vous fournissez. Pour en savoir plus sur extract(), consultez Extraire des valeurs d'attributs.

    Pour vérifier si un identifiant contient un attribut, utilisez la fonction has().

  • Une condition d'attribut spécifiant les attributs que le compte principal doit présenter. La condition d'attribut peut s'appliquer aux identifiants externes et aux identifiants Google. Une requête qui ne répond pas à la condition d'attribut est rejetée.

    Les conditions d'attribut possèdent le format d'une expression CEL qui renvoie une valeur booléenne. Par exemple, la requête suivante rejette les requêtes d'une identité qui n'a pas de rôle AWS spécifique :

    attribute.aws_role == "ROLE_MAPPING"
    

    Pour en savoir plus sur les cas d'utilisation courants, consultez la section Conditions d'attribut.

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

Un pool d'identités de charge de travail vous permet d'organiser et de gérer des identités externes. Les pools d'identités de charge de travail sont isolés les uns des autres, mais un pool peut usurper l'identité d'un nombre illimité de comptes de service. En général, nous vous recommandons de créer un pool pour chacun de vos environnements, par exemple pour vos environnements de développement, de préproduction ou de production, ce qui équivaut généralement à un pool par compte AWS.

Pour créer un pool d'identités de charge de travail, vous devez fournir un ID. Vous pouvez également fournir une description et un nom à afficher facultatifs. L'ID ne peut pas commencer par gcp-. Ce préfixe est réservé à Google.

Après avoir créé le pool d'identités de charge de travail, vous pouvez ajouter un fournisseur de pool d'identités de charge de travail. Chaque fournisseur de pool d'identités de charge de travail représente un fournisseur d'identité spécifique, tel que AWS. Un pool unique peut contenir plusieurs fournisseurs. Pour créer le fournisseur, vous avez besoin des informations décrites sur cette page dans Paramètres du fournisseur d'identité pour AWS.

Console

  1. Dans Cloud Console, 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. Saisissez un nom pour le pool d'identités de charge de travail.

    Cloud Console utilise ce nom pour créer l'ID du pool. Pour modifier l'ID du pool, cliquez sur Modifier. Vous ne pourrez pas modifier l'ID du pool par la suite.

  3. Facultatif : saisissez une description du pool d'identités de charge de travail.

  4. Cliquez sur Continuer.

  5. Dans la liste déroulante Sélectionner un fournisseur, sélectionnez AWS, puis cliquez sur Continuer.

  6. Saisissez un nom de fournisseur.

    Cloud Console utilise ce nom pour créer l'ID du fournisseur. Pour modifier l'ID du fournisseur, cliquez sur Modifier. Vous ne pourrez pas modifier l'ID du fournisseur par la suite.

  7. Saisissez votre ID de compte AWS, puis cliquez sur Continuer.

  8. Facultatif : pour configurer le mappage d'attributs, cliquez sur Modifier le mappage.

    Le mappage d'attributs vous permet d'utiliser les informations sur les identités externes pour accorder l'accès à un sous-ensemble de ces identités. Pour AWS, un mappage par défaut est fourni.

    Pour en savoir plus, consultez la section Paramètres du fournisseur d'identité pour AWS sur cette page.

  9. Facultatif : pour fournir une condition d'attribut spécifiant les identités pouvant s'authentifier, cliquez sur Ajouter une condition et saisissez une expression CEL (Common Expression Language) valide. Pour plus d'informations, consultez la section Conditions d'attribut.

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

gcloud

Pour créer un pool d'identités de charge de travail, exécutez la commande gcloud iam workload-identity-pools create :

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

La réponse est semblable à ce qui suit :

Created workload identity pool [POOL_ID].

Pour ajouter un fournisseur de pools d'identités de charge de travail, utilisez la commande gcloud iam workload-identity-pools providers create-aws :

gcloud iam workload-identity-pools providers create-aws PROVIDER_ID \
    --workload-identity-pool="POOL_ID" \
    --account-id="AWS_ACCOUNT_ID" \
    --location="global"

La réponse est semblable à ce qui suit :

Created workload identity pool provider [PROVIDER_ID].

REST

Pour créer un pool d'identités de charge de travail, procédez comme suit :

La méthode projects.locations.workloadIdentityPools.create crée un pool d'identités de charge de travail.

Méthode HTTP et URL :

POST https://iam.googleapis.com/v1/projects/project-id/locations/global/workloadIdentityPools?workloadIdentityPoolId=pool-id

Corps JSON de la requête :

{
  "description": "description",
  "display-name": "display-name"
}

Pour envoyer votre requête, développez l'une des options suivantes :

La méthode renvoie un objet Operation de longue durée semblable à l'exemple suivant :

{
  "name": "projects/project-number/locations/global/workloadIdentityPools/pool-id/operations/operation-id"
}

Pour ajouter un fournisseur de pools d'identités de charge de travail, procédez comme suit :

La méthode projects.locations.workloadIdentityPools.providers.create ajoute AWS comme fournisseur.

Méthode HTTP et URL :

POST https://iam.googleapis.com/v1/projects/project-id/locations/global/workloadIdentityPools/pool-id/providers?workloadIdentityPoolProviderId=provider-id

Corps JSON de la requête :

{
  "aws": {
    "accountId": "aws-account-id"
  }
}

Pour envoyer votre requête, développez l'une des options suivantes :

La méthode renvoie un objet Operation de longue durée semblable à l'exemple suivant :

{
  "name": "projects/project-number/locations/global/workloadIdentityPools/pool-id/providers/provider-id/operations/operation-id"
}

Autoriser les identités externes à emprunter l'identité d'un compte de service

Les identités externes ne peuvent pas accéder directement à la plupart des ressources Google Cloud. Pour permettre à ces identités d'emprunter l'identité d'un compte de service, vous devez leur attribuer le rôle Utilisateur Workload Identity (roles/iam.workloadIdentityUser) sur ce compte de service. Lorsque les identités externes empruntent l'identité d'un compte de service, elles disposent des mêmes rôles et autorisations que le compte de service.

Pour attribuer le rôle Utilisateur Workload Identity aux identités AWS, procédez comme suit :

Console

Avant d'accorder le rôle Utilisateur Workload Identity, déterminez les identités que vous allez autoriser à emprunter le compte de service. Vous pouvez attribuer le rôle à toutes les identités du pool d'identités de charge de travail ou à un sous-ensemble de ces identités en fonction du mappage d'attributs :

Identités Nom de l'attribut Valeur d'attribut
Un utilisateur AWS spécifique subject

arn:aws:sts::AWS_ACCOUNT_ID:assumed-role/AWS_ROLE_NAME/AWS_SESSION_NAME

Pour savoir comment extraire un nom de session de rôle AWS à partir d'un ARN AWS, consultez la documentation AWS relative aux identifiants IAM.

Toutes les identités avec un rôle AWS spécifique aws_role arn:aws:sts::AWS_ACCOUNT_ID:assumed-role/AWS_ROLE_NAME
Toutes les identités avec une valeur d'attribut spécifique ATTRIBUTE_NAME ATTRIBUTE_VALUE

Accordez ensuite l'accès au compte de service, puis téléchargez un fichier de configuration pour générer automatiquement des identifiants :

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

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

  2. Recherchez le pool d'identités de charge de travail contenant les identités AWS, puis cliquez sur l'icône Modifier. Cloud Console affiche les détails du pool d'identités de charge de travail.

  3. Cliquez sur Accorder l'accès.

  4. Dans la liste déroulante Compte de service, sélectionnez le compte de service dont les identités externes seront empruntées.

  5. Choisissez les identités du pool qui peuvent emprunter l'identité du compte de service.

    Pour autoriser toutes les identités à emprunter l'identité du compte de service, sélectionnez Toutes les identités du pool.

    Pour autoriser un sous-ensemble d'identités à emprunter l'identité du compte de service, sélectionnez Uniquement les identités correspondant au filtre, puis procédez comme suit :

    1. Dans la liste déroulante Nom de l'attribut, sélectionnez l'attribut que vous souhaitez évaluer.

      Seuls les attributs mappés apparaissent dans la liste. Les préfixes google. et attribute. ne sont pas affichés.

    2. Dans le champ Valeur de l'attribut, saisissez la valeur attendue de l'attribut.

  6. Cliquez sur Enregistrer.

    Si les identités avaient déjà accès au compte de service, Cloud Console affiche les détails du pool d'identités de charge de travail. Vous pouvez ignorer les étapes restantes.

    Si les identités ont accès au compte de service, Cloud Console affiche la boîte de dialogue Configurer votre application.

  7. Facultatif : pour télécharger un fichier de configuration pour générer automatiquement des identifiants, procédez comme suit :

    1. Dans la liste déroulante Fournisseur, sélectionnez le fournisseur contenant les identités AWS qui empruntent l'identité du compte de service.

    2. Cliquez sur Télécharger la configuration pour télécharger un fichier de configuration JSON.

  8. Cliquez sur Ignorer.

gcloud

Avant d'accorder le rôle Utilisateur Workload Identity, déterminez les identités que vous allez autoriser à emprunter le compte de service. Vous pouvez attribuer le rôle à toutes les identités du pool d'identités de charge de travail ou à un sous-ensemble de ces identités en fonction du mappage d'attributs :

Identités Format d'identifiant
Un utilisateur AWS spécifique

principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/arn:aws:sts::AWS_ACCOUNT_ID:assumed-role/AWS_ROLE_NAME/AWS_SESSION_NAME

Pour savoir comment extraire un nom de session de rôle AWS à partir d'un ARN AWS, consultez la documentation AWS relative aux identifiants IAM.

Toutes les identités avec un rôle AWS spécifique principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.aws_role/arn:aws:sts::AWS_ACCOUNT_ID:assumed-role/AWS_ROLE_NAME
Toutes les identités avec une valeur d'attribut spécifique principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE
Toutes les identités d'un pool principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*

Exécutez ensuite la commande gcloud iam service-accounts add-iam-policy-binding :

gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \
    --role=roles/iam.workloadIdentityUser \
    --member="PRINCIPAL"

Remplacez les valeurs suivantes :

  • SERVICE_ACCOUNT_EMAIL : adresse e-mail associée au compte de service.
  • PRINCIPAL : identités externes qui empruntent l'identité du compte de service.

REST

Avant d'accorder le rôle Utilisateur Workload Identity, déterminez les identités que vous allez autoriser à emprunter le compte de service. Vous pouvez attribuer le rôle à toutes les identités du pool d'identités de charge de travail ou à un sous-ensemble de ces identités en fonction du mappage d'attributs :

Identités Format d'identifiant
Un utilisateur AWS spécifique

principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/arn:aws:sts::AWS_ACCOUNT_ID:assumed-role/AWS_ROLE_NAME/AWS_SESSION_NAME

Pour savoir comment extraire un nom de session de rôle AWS à partir d'un ARN AWS, consultez la documentation AWS relative aux identifiants IAM.

Toutes les identités avec un rôle AWS spécifique principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.aws_role/arn:aws:sts::AWS_ACCOUNT_ID:assumed-role/AWS_ROLE_NAME
Toutes les identités avec une valeur d'attribut spécifique principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE
Toutes les identités d'un pool principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*

Utilisez ensuite le modèle lecture-modification-écriture pour mettre à jour la stratégie :

  1. Lisez la stratégie IAM actuelle du compte de service.
  2. Modifiez la stratégie pour accorder le rôle.
  3. Écrivez la stratégie mise à jour.

Lisez la stratégie Cloud IAM du compte de service.

La méthode serviceAccounts.getIamPolicy permet d'obtenir la stratégie IAM d'un compte de service.

Avant d'utiliser les données de requête, effectuez les remplacements suivants :

  • PROJECT_ID : ID de votre projet Google Cloud. Les ID de projet sont des chaînes alphanumériques, telles que my-project.
  • SA_ID : ID de votre compte de service. Il peut s'agir de l'adresse e-mail du compte de service au format SA_NAME@PROJECT_ID.iam.gserviceaccount.com ou de l'ID numérique unique du compte de service.

  • POLICY_VERSION : version de la stratégie à renvoyer. Les requêtes doivent spécifier la version de stratégie la plus récente, qui est la version 3. Pour plus d'informations, consultez la section Spécifier une version de stratégie lors de l'obtention d'une stratégie.

Méthode HTTP et URL :

POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_ID:getIamPolicy

Corps JSON de la requête :

{
  "options": {
    "requestedPolicyVersion": POLICY_VERSION
  }
}

Pour envoyer votre requête, développez l'une des options suivantes :

Vous devriez recevoir une réponse JSON de ce type :

{
  "version": 1,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "role": "roles/serviceAccountAdmin",
      "members": [
        "user:admin@example.com"
      ]
    }
  ]
}

En l'absence de stratégie existante, la réponse ne contient que la valeur etag par défaut. Si vous recevez cette réponse, ajoutez un champ version défini sur 3 et un champ bindings défini sur un tableau vide.

Modifiez la stratégie pour attribuer les rôles appropriés à vos comptes principaux.

Pour accorder un rôle, modifiez le tableau bindings dans le corps de la réponse :

  • Si aucune liaison pour le rôle n'existe, ajoutez un objet au tableau bindings qui indique le rôle que vous souhaitez attribuer et le compte principal auquel vous souhaitez l'accorder.
  • Si une liaison existe déjà pour le rôle, ajoutez le nouveau compte principal à la liste des comptes principaux existants.

Exemple :

Pour attribuer le rôle Utilisateur Workload Identity (roles/iam.workloadIdentityUser) au rôle AWS s3access, modifiez l'exemple présenté à l'étape précédente comme suit :

{
  "version": 1,
  "etag": "BwUqLaVeua8=",
  "bindings": [
    {
      "role": "roles/iam.workloadIdentityUser",
      "members": [
        "principalSet://iam.googleapis.com/projects/1234567890123/locations/global/workloadIdentityPools/my-pool/attribute.aws_role/arn:aws:iam::123456789012:role/s3access"
      ]
    },
    {
      "role": "roles/iam.serviceAccountAdmin",
      "members": [
        "user:admin@example.com"
      ]
    }
  ]
}

Écrivez la stratégie mise à jour.

La méthode serviceAccounts.setIamPolicy définit une stratégie IAM mise à jour pour le compte de service.

Avant d'utiliser les données de requête, effectuez les remplacements suivants :

  • PROJECT_ID : ID de votre projet Google Cloud. Les ID de projet sont des chaînes alphanumériques, telles que my-project.
  • SA_ID : ID de votre compte de service. Il peut s'agir de l'adresse e-mail du compte de service au format SA_NAME@PROJECT_ID.iam.gserviceaccount.com ou de l'ID numérique unique du compte de service.

  • POLICY : représentation JSON de la stratégie que vous souhaitez définir. Pour en savoir plus sur le format d'une stratégie, consultez la documentation de référence sur les stratégies.

    Par exemple, pour définir la stratégie présentée à l'étape précédente, remplacez policy par ce qui suit :

    {
      "version": 1,
      "etag": "BwUqLaVeua8=",
      "bindings": [
        {
          "role": "roles/iam.workloadIdentityUser",
          "members": [
            "principalSet://iam.googleapis.com/projects/1234567890123/locations/global/workloadIdentityPools/my-pool/attribute.aws_role/arn:aws:iam::123456789012:role/s3access"
          ]
        },
        {
          "role": "roles/iam.serviceAccountAdmin",
          "members": [
            "user:admin@example.com"
          ]
        }
      ]
    }
    

Méthode HTTP et URL :

POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_ID:setIamPolicy

Corps JSON de la requête :

{
  "policy": POLICY
}

Pour envoyer votre requête, développez l'une des options suivantes :

La réponse contient la stratégie mise à jour.

Générer des identifiants Google

Si vous utilisez une bibliothèque cliente compatible, vous pouvez la configurer de sorte qu'elle génère automatiquement des identifiants Google. Vous pouvez également générer manuellement des identifiants AWS, puis les échanger contre des identifiants Google.

Lorsque cela est possible, nous vous recommandons de générer automatiquement les identifiants afin de ne pas avoir à mettre en œuvre vous-même le processus d'échange de jetons.

Générer automatiquement des identifiants

Si vous accédez à Google Cloud à l'aide d'une bibliothèque cliente pour l'un des langages suivants, vous pouvez configurer la bibliothèque cliente pour qu'elle génère automatiquement les identifiants à l'aide de la fédération d'identité :

C++

La plupart des bibliothèques clientes Google 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.

Pour configurer la bibliothèque cliente afin de générer automatiquement des identifiants, vous devez créer un fichier de configuration JSON. Vous pouvez créer ce fichier à l'aide de Cloud Console ou de l'outil gcloud.

Console

Tout d'abord, suivez les instructions de cette page pour autoriser les identités externes à emprunter l'identité d'un compte de service. Vous pouvez ensuite créer un fichier de configuration JSON pour tout compte de service que les identités externes peuvent emprunter.

Pour créer un fichier de configuration JSON, procédez comme suit :

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

    Accéder aux pools d'identités 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 sur l'icône Modifier . Cloud Console affiche les détails du pool d'identités de charge de travail.
  3. Cliquez sur Comptes de service connectés.
  4. Recherchez le compte de service que vous souhaitez utiliser, puis cliquez sur Télécharger.
  5. Dans la liste déroulante Fournisseur, sélectionnez le fournisseur contenant les identités AWS qui empruntent l'identité du compte de service.
  6. Cliquez sur Télécharger la configuration pour télécharger le fichier de configuration JSON, puis sur Terminé.

gcloud

Pour créer un fichier de configuration JSON, exécutez 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 \
    --output-file=FILEPATH \
    --aws

Remplacez les valeurs suivantes :

  • PROJECT_NUMBER : ID numérique du projet.
  • POOL_ID : ID du pool d'identités de charge de travail.
  • PROVIDER_ID : ID du fournisseur de pools d'identités de charge de travail.
  • SERVICE_ACCOUNT_EMAIL : adresse e-mail du compte de service dont l'identité doit être empruntée.
  • FILEPATH : chemin d'accès du fichier de configuration.

Après avoir généré le fichier de configuration, définissez la variable d'environnement GOOGLE_APPLICATION_CREDENTIALS sur le chemin d'accès du fichier de configuration. Cette variable d'environnement indique à la bibliothèque cliente d'utiliser les identifiants par défaut de l'application pour s'authentifier. Pour en savoir plus, consultez la section Rechercher automatiquement des identifiants.

Échanger manuellement des identifiants

Une fois qu'un utilisateur ou rôle AWS est capable d'usurper l'identité d'un compte de service, vous pouvez échanger manuellement ses identifiants AWS pour des identifiants Google.

Dans le cadre du processus d'échange, vous transmettez un jeton GetCallerIdentity au service de jetons de sécurité. Le jeton GetCallerIdentity contient les informations que vous devez normalement inclure dans une requête adressée à la méthode AWS GetCallerIdentity(), ainsi que la signature que vous souhaitez normalement pour la requête. Google Cloud utilise le jeton GetCallerIdentity pour vérifier l'identité du compte AWS principal et confirmer que celui-ci est autorisé à emprunter l'identité d'un compte de service.

Pour échanger des identifiants, procédez comme suit :

  1. Obtenez des identifiants AWS temporaires.

  2. Créez un jeton GetCallerIdentity. Ce jeton contient les informations pour une requête envoyée à la méthode GetCallerIdentity() AWS, ainsi que la signature AWS pour obtenir les informations. Utiliser la signature version 4.

    La requête 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. Les points de terminaison régionaux sont également acceptés.
    • 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é. Exemple :
      //iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID
      
      • x-amz-security-token : requis uniquement si vous utilisez des identifiants de sécurité temporaires. Jeton de session AWS à inclure.

    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="
        }
      ]
    }
    
  3. Pour échanger les identifiants AWS contre un jeton d'accès fédéré, transmettez le jeton GetCallerIdentity à la méthode token() du service de jetons de sécurité :

    REST

    La méthode token échange un jeton tiers contre un jeton Google.

    Avant d'utiliser les données de requête, effectuez les remplacements suivants :

    • PROJECT_NUMBER : numéro de votre projet Google Cloud.
    • POOL_ID : ID du pool d'identités de charge de travail que vous avez créé.
    • PROVIDER_ID : ID du fournisseur d'identité AWS que vous avez configuré.
    • AWS_REQUEST : jeton GetCallerIdentity, au format JSON échappé en URL.

    Méthode HTTP et URL :

    POST https://sts.googleapis.com/v1/token

    Corps JSON de la requête :

    {
      "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": "urn:ietf:params:aws:token-type:aws4_request",
      "subjectToken": "AWS_REQUEST"
    }
    

    Pour envoyer votre requête, développez l'une des options suivantes :

     

    La méthode renvoie un jeton fédéré.

  4. Pour échanger le jeton fédéré d'un jeton d'accès de compte de service, appelez la méthode generateAccessToken(). Un nombre limité d'API Google Cloud acceptent les jetons fédérés. En revanche, toutes les API Google Cloud sont compatibles avec les jetons d'accès au compte de service.

    REST

    La méthode serviceAccounts.generateAccessToken de l'API Service Account Credentials génère un jeton d'accès OAuth 2.0 pour un compte de service.

    Avant d'utiliser les données de requête, effectuez les remplacements suivants :

    • PROJECT_ID : ID de votre projet Google Cloud. Les ID de projet sont des chaînes alphanumériques, telles que my-project.
    • SA_ID : ID de votre compte de service. Il peut s'agir de l'adresse e-mail du compte de service au format SA_NAME@PROJECT_ID.iam.gserviceaccount.com ou de l'ID numérique unique du compte de service.
    • token : jeton d'accès fédéré.

    Méthode HTTP et URL :

    POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SA_NAME@PROJECT_ID.iam.gserviceaccount.com:generateAccessToken

    Corps JSON de la requête :

    {
      "scope": [
        "https://www.googleapis.com/auth/cloud-platform"
      ]
    }
    

    Pour envoyer votre requête, développez l'une des options suivantes :

    Si la requête generateAccessToken a abouti, le corps de la réponse contient un jeton d'accès OAuth 2.0 et une heure d'expiration. Ce jeton d'accès (accessToken) peut alors être utilisé pour authentifier une requête au nom du compte de service jusqu'à ce que l'heure d'expiration spécifiée expireTime soit atteinte :

    {
      "accessToken": "eyJ0eXAi...NiJ9",
      "expireTime": "2020-04-07T15:01:23.045123456Z"
    }
    

Lorsque vous disposez d'un jeton d'accès pour un compte de service, vous pouvez l'utiliser pour appeler les API Google Cloud en incluant le jeton dans l'en-tête Authorization de vos requêtes :

Authorization: Bearer SERVICE_ACCOUNT_ACCESS_TOKEN

La requête est autorisée en tant que compte de service.

Étape suivante