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
Assurez-vous de disposer du rôle Administrateur de pools Workload Identity (
roles/iam.workloadIdentityPoolAdmin
).Les rôles de base IAM "Propriétaire" (
roles/owner
) et "Éditeur" (roles/editor
) incluent é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.Mettez à jour la règle d'administration de votre organisation pour autoriser la fédération à partir d'AWS.
Créez un rôle AWS et notez son nom de ressource Amazon (ARN).
Accordez l'accès au compte de service pour lui permettre d'appeler les API Google Cloud nécessaires à votre charge de travail.
Créer un pool d'identités de charge de travail
Un pool d'identités de charge de travail est un conteneur accueillant une collection d'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.
gcloud
Exécutez la commande gcloud beta iam workload-identity-pools create
pour créer un pool d'identités de charge de travail :
gcloud beta iam workload-identity-pools create pool-id \ --location="global" \ --description="description" \ --display-name="display-name"
La réponse est semblable à ce qui suit :
Created WorkloadIdentityPool [pool-id].
REST
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/v1beta/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" }
Ajouter AWS comme fournisseur d'identité
Pour configurer AWS comme fournisseur d'identité pour votre pool d'identités de charge de travail, fournissez au minimum les informations suivantes :
Un ID pour le fournisseur.
L'ID du pool d'identités de la charge de travail de la section précédente de ce document.
Votre identifiant de compte AWS.
Vous pouvez également fournir plusieurs paramètres facultatifs :
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. Utilisez
assertion
pour faire référence aux identifiants AWS,google
pour les attributs Google etattribute
pour les attributs personnalisés. Par exemple, le code suivant mappeattribute.aws_account
àassertion.account
(en plus du mappage par défaut pourgoogle.subject
) :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. Notez que les attributs mentionnés dans la documentation AWS utilisent la notation camel case, tandis que le mappage d'attributs utilise des minuscules. Par exemple,Account
devientassertion.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 surextract()
, 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 peut s'appliquer aux identifiants externes et aux identifiants Google. Toute requête qui ne répond pas à la condition 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 des conditions d'attribut, consultez la page de présentation de la fédération d'identité de charge de travail.
L'exemple suivant montre comment ajouter AWS comme fournisseur d'identité :
gcloud
Exécutez la commande gcloud beta iam workload-identity-pools providers create-aws
pour ajouter AWS comme fournisseur d'identité :
gcloud beta 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 WorkloadIdentityPoolProvider [provider-id].
REST
La méthode projects.locations.workloadIdentityPools.providers.create
ajoute AWS comme fournisseur.
Méthode HTTP et URL :
POST https://iam.googleapis.com/v1beta/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" }
Accorder une autorisation pour 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
).
Pour ajouter cette liaison à un rôle AWS, utilisez le format suivant :
attribute.aws_role/arn:aws:sts::aws-account-id:assumed-role/aws-role-name
Exemple :
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.aws_role/arn:aws:sts::aws-account-id:assumed-role/aws-role-name"
Pour ajouter cette liaison pour un utilisateur AWS, utilisez le format suivant :
subject/arn:aws:sts::aws-account-id:assumed-role/aws-role-name/aws-session-name
Consultez la documentation AWS relative aux identifiants IAM pour en savoir plus sur l'extraction de la session de rôle AWS à partir d'un ARN AWS.
L'exemple suivant illustre l'ajout d'une liaison pour un utilisateur AWS :
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/arn:aws:sts::aws-account-id:assumed-role/aws-role-name/aws-session-name
Vous pouvez également accorder l'accès en fonction d'attributs personnalisés. Exemple :
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.custom-attribute/arn:aws:sts::aws-account-id:aws-role-name"
Pour révoquer l'accès, remplacez add-iam-policy-binding
par remove-iam-policy-binding
.
Vous pouvez également ajouter ou révoquer des liaisons à l'aide de l'API REST ou des bibliothèques clientes. Pour en savoir plus, consultez Accorder, modifier et révoquer les accès à des ressources.
Échanger un jeton AWS contre un jeton Google
Une fois qu'un utilisateur ou rôle AWS est capable d'usurper l'identité d'un compte de service, vous pouvez échanger ses identifiants AWS pour des identifiants Google. Dans le cadre du processus d'échange, vous transmettez une version sérialisée d'une requête à la méthode AWS GetCallerIdentity()
au service de jetons de sécurité. Cela permet à Google Cloud de vérifier l'identité du compte principal AWS et de confirmer qu'il est autorisé à usurper l'identité d'un compte de service.
Pour échanger des identifiants, procédez comme suit :
Créez une requête signée sérialisée à la méthode AWS
GetCallerIdentity()
à l'aide de Signature Version 4.La requête contient les champs suivants :
url
: URL du point de terminaison AWS STS pourGetCallerIdentity()
, telle quehttps://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 champurl
, par exemplests.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 sert à éviter les réutilisations.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
: (facultatif) Jeton de session AWS à inclure lors de l'utilisation d'identifiants de sécurité temporaires.
Une requête se présente comme 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=" } ] }
Transmettez la requête sérialisée à la méthode du service de jetons de sécurité
token()
pour échanger l'identifiant AWS contre un jeton d'accès fédéré :REST
La méthode
token
échange un jeton tiers contre un jeton Google.Avant d'utiliser les données de requête ci-dessous, 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éé précédemment dans ce tutoriel.provider-id
: ID du fournisseur d'identité AWS que vous avez configuré précédemment dans ce tutoriel.aws-request
: requête signée sérialisée àGetCallerIdentity()
, au format JSON échappé en URL.
Méthode HTTP et URL :
POST https://sts.googleapis.com/v1beta/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é.
Appelez
generateAccessToken()
pour échanger le jeton fédéré contre un jeton d'accès au compte de service. Un nombre limité d'API Google Cloud acceptent les jetons fédérés. 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 ci-dessous, effectuez les remplacements suivants :
project-id
: ID de votre projet Google Cloud.sa-id
: ID de votre compte de service. Il peut s'agir de l'adresse e-mail du compte de service au formatsa-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éeexpireTime
soit atteinte :{ "accessToken": "eyJ0eXAi...NiJ9", "expireTime": "2020-04-07T15:01:23.045123456Z" }
Une fois que vous disposez d'un jeton d'accès pour un compte de service, vous pouvez l'utiliser pour appeler les API Google Cloud en l'incluant dans l'en-tête Authorization
de vos requêtes :
Authorization: Bearer access-token
La requête est autorisée en tant que compte de service.
Étape suivante
Exploitez la fédération d'identité pour accéder aux ressources depuis Microsoft Azure ou accéder aux ressources depuis un fournisseur OIDC.
En savoir plus sur la fédération d'identité de charge de travail