Accéder aux ressources de Microsoft Azure

Ce document explique comment utiliser la fédération d'identité pour accéder aux ressources Google Cloud à partir de Microsoft Azure.

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 une identité gérée pour une ressource Azure à usurper 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. Assurez-vous de disposer du rôle "Administrateur du pool d'identités de charge de travail" (roles/iam.workloadIdentityPoolAdmin).

    Les rôles IAM primitifs "Propriétaire" (roles/owner) et "Éditeur" (roles/editor) accordent également l'autorisation de configurer la fédération d'identité. Cependant, nous vous recommandons d'utiliser le rôle "Administrateur du pool d'identités de charge de travail" pour éviter d'accorder tout accès superflu aux ressources Google Cloud.

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

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

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.

Commande 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"

API 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 :

 

Configurer Azure pour la fédération d'identité

Pour préparer votre locataire Azure pour la fédération d'identité, procédez comme suit :

  1. Créez une application Azure AD et un compte de service principal, puis définissez son URI d'ID application comme suit :

    https://iam.googleapis.com/projects/project-number/locations/global/workloadIdentityPools/pool-id
    
  2. Créez une identité gérée et notez son ID d'objet.

  3. Attribuez l'identité gérée à une machine virtuelle à laquelle vous souhaitez accorder l'accès aux ressources Google Cloud.

Ajouter Azure en tant que fournisseur d'identité

Pour configurer Azure 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 ID de locataire Azure.

Vous pouvez également fournir plusieurs paramètres facultatifs :

  • Un nom à afficher et une description.

  • Une liste de mappages d'attributs qui mappent les revendications d'un jeton Azure aux attributs d'un jeton Google. Utilisez assertion pour faire référence aux identifiants Azure, google pour les attributs Google et attribute pour les attributs personnalisés.

    Il existe deux attributs Google : google.subject et google.groups. Vous pouvez référencer ces attributs dans les liaisons IAM. google.subject s'affiche également dans les entrées de journal Cloud Logging.

    En général, nous vous recommandons de mapper assertion.sub, qui contient l'ID d'objet de l'identité gérée, sur google.subject. Cela permet de fournir un identifiant stable à utiliser dans les liaisons IAM. Voici un exemple de mappage :

    google.subject=assertion.sub
    

    Pour les assertions plus complexes, vous pouvez utiliser Common Expression Language. Par exemple, si votre pool d'identités de charge de travail contient plusieurs fournisseurs d'identité, vous pouvez ajouter un préfixe pour lever toute ambiguïté :

    google.subject="azure::" + assertion.tid + "::" + assertion.sub
    

    Le champ google.subject ne peut pas dépasser 127 caractères.

    Vous pouvez également spécifier des attributs personnalisés. Par exemple, les éléments suivants mappent assertion.tid sur attribute.tid :

    attribute.tid=assertion.tid
    

    L'exemple suivant attribue un nom à afficher en fonction de la valeur de assertion.oid :

    attribute.managed_identity_name={
    "8bb39bdb-1cc5-4447-b7db-a19e920eb111":"workload1",
    "55d36609-9bcf-48e0-a366-a3cf19027d2a":"workload2"
    }[assertion.oid]
    

    Pour obtenir la liste complète des revendications que vous pouvez référencer, obtenez un jeton d'accès pour une VM Azure dans votre charge de travail. Dans votre requête, remplacez le paramètre resource par le nom complet de la ressource de votre pool d'identités de charge de travail. Exemple :

    curl -s
      'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://iam.googleapis.com/projects/project-number/locations/global/workloadIdentityPools/pool-id' \
      -H Metadata:true -H "Cache-Control: no-cache"
    

    Cette requête renvoie un jeton d'accès pour la VM Azure, que vous pouvez décoder pour afficher les revendications disponibles.

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

    Pour vérifier si un identifiant contient une revendication, 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 revendications des identifiants Azure ou aux attributs de l'identifiant 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'est pas membre d'un groupe spécifique :

    "e968c2ef-047c-498d-8d79-16ca1b61e77e" in assertion.groups
    

    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 Azure comme fournisseur d'identité :

Commande gcloud

Exécutez la commande gcloud beta iam workload-identity-pools providers create-oidc pour ajouter Azure comme fournisseur d'identité :

gcloud beta iam workload-identity-pools providers create-oidc provider-id \
    --workload-identity-pool="pool-id" \
    --issuer-uri="https://sts.windows.net/azure-tenant-id" \
    --location="global"

API REST

La méthode projects.locations.workloadIdentityPools.providers.create ajoute Azure 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 :

{
  "issuerUrl": "https://sts.windows.net/azure-tenant-id"
}

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

 

Emprunter l'identité d'un compte de service

Vous pouvez accorder aux pools d'identités de charge de travail, et aux identités fédérées à partir de leurs fournisseurs, des rôles sur les ressources à l'aide d'IAM. Le rôle Utilisateur Workload Identity (roles/iam.workloadIdentityUser) donne l'autorisation d'usurper l'identité d'un compte de service, ce qui permet aux identités externes d'accéder aux ressources Google Cloud.

Pour ajouter cette liaison pour une identité gérée spécifique, procédez comme suit :

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/managed-identity-object-id"

Pour ajouter cette liaison pour toutes les identités d'un pool, procédez comme suit :

gcloud iam service-accounts add-iam-policy-binding service-account-email \
    --role roles/iam.workloadIdentityUser \
    --member "principalSet://iam.googleapis.com/project/project-number/workloadIdentityPools/pool-id/groups/azure-tenant-id"

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-name/custom-attribute-value"

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 Azure contre un jeton Google

Une fois que votre identité gérée Azure est capable d'usurper l'identité d'un compte de service, vous pouvez échanger ses identifiants pour des identifiants Google.

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

  1. Utilisez le service de métadonnées d'instance Azure (IMS, Azure Instance Metadata Service) pour obtenir un jeton d'accès Azure.

  2. Transmettez le jeton d'accès Azure à la méthode du service de jetons de sécurité token() pour obtenir un jeton d'accès fédéré :

    API 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-id : ID 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é que vous avez configuré précédemment dans ce tutoriel.

    Méthode HTTP et URL :

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

    Corps JSON de la requête :

    {
      "audience": "https://iam.googleapis.com/projects/project-id/locations/global/workloadIdentityPools/pool-id/providers/provider-id",
      "grant_type": "urn:ietf:params:oauth:grant-type:token-exchange",
      "requested_token_type": "urn:ietf:params:oauth:token-type:access_token",
      "scope": "https://www.googleapis.com/auth/cloud-platform",
      "subject_token_type": "urn:ietf:params:oauth:token-type:jwt",
      "subject_token": "azure-id-token"
    }
    

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

     

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

  3. Échangez le jeton fédéré contre un jeton d'accès OAuth 2.0 en appelant generateAccessToken() :

    API REST

    curl -X POST -H "Authorization: Bearer federated-token \
      https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/service-account-email:generateAccessToken
    

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 service-account-access-token

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

Étapes suivantes