Utiliser Microsoft Entra Workload ID avec Azure Kubernetes Service (AKS)

Les charges de travail déployées sur un cluster Azure Kubernetes Services (AKS) nécessitent les informations d’identification de l’application Microsoft Entra ou des identités managées pour accéder aux ressources protégées Microsoft Entra, telles qu’Azure Key Vault et Microsoft Graph. Microsoft Entra Workload ID s’intègre aux fonctionnalités natives de Kubernetes pour se fédérer avec des fournisseurs d’identité externes.

Microsoft Entra Workload ID utilise une projection de volume de jeton de compte de service, ce qui permet aux pods d’utiliser une identité Kubernetes (autrement dit, un compte de service). Un jeton Kubernetes est émis et la fédération OIDC permet aux applications Kubernetes d’accéder aux ressources Azure en toute sécurité avec Microsoft Entra ID en fonction de comptes de service annotés.

Microsoft Entra Workload ID fonctionne particulièrement bien avec la collection de bibliothèques clientes Azure Identity et la bibliothèque d’authentification Microsoft (MSAL) si vous utilisez une inscription de l’application. Votre charge de travail peut utiliser n’importe laquelle de ces bibliothèques pour authentifier des ressources cloud Azure et y accéder en toute transparence.

Cet article vous permet de comprendre cette nouvelle fonctionnalité d’authentification et passe en revue les options disponibles pour planifier votre stratégie de projet et votre éventuelle migration à partir d’une identité managée par pod Microsoft Entra.

Dépendances

  • AKS prend en charge Microsoft Entra Workload ID version 1.22 et ultérieure.
  • Azure CLI version 2.47.0 ou ultérieure. Exécutez az --version pour rechercher la version, puis exécutez az upgrade pour mettre à niveau la version. Si vous devez installer ou mettre à niveau, voir Installer Azure CLI.

Bibliothèques clientes d’identité Azure

Dans les bibliothèques de client Azure Identity, choisissez l’une des approches suivantes :

  • Utilisez DefaultAzureCredential, qui tente d’utiliser le WorkloadIdentityCredential.
  • Créez une instance ChainedTokenCredential qui inclut WorkloadIdentityCredential.
  • Utilisez WorkloadIdentityCredential directement.

Le tableau suivant fournit la version de package minimale demandée par la bibliothèque de client de chaque écosystème linguistique.

Écosystème Bibliothèque Version minimale
.NET Azure.Identity 1.9.0
C++ azure-identity-cpp 1.6.0
Go azidentity 1.3.0
Java azure-identity 1.9.0
Node.js @azure/identity 3.2.0
Python azure-identity 1.13.0

Dans les exemples de code suivants, DefaultAzureCredential est utilisé. Ce type d’informations d’identification utilise les variables d’environnement injectées par le webhook de mutation de l’identité de charge de travail Azure pour s’authentifier dans Azure Key Vault.

using Azure.Identity;
using Azure.Security.KeyVault.Secrets;

string keyVaultUrl = Environment.GetEnvironmentVariable("KEYVAULT_URL");
string secretName = Environment.GetEnvironmentVariable("SECRET_NAME");

var client = new SecretClient(
    new Uri(keyVaultUrl),
    new DefaultAzureCredential());

KeyVaultSecret secret = await client.GetSecretAsync(secretName);

Bibliothèque d’authentification Microsoft (MSAL)

Les bibliothèques de client suivantes sont la version minimale demandée.

Écosystème Bibliothèque Image Exemple A Windows
.NET Bibliothèque d’authentification Microsoft pour .NET ghcr.io/azure/azure-workload-identity/msal-net:latest Lien Oui
Go Bibliothèque d’authentification Microsoft pour Go ghcr.io/azure/azure-workload-identity/msal-go:latest Lien Oui
Java Bibliothèque d’authentification Microsoft pour Java ghcr.io/azure/azure-workload-identity/msal-java:latest Lien Non
JavaScript Bibliothèque d’authentification Microsoft pour JS ghcr.io/azure/azure-workload-identity/msal-node:latest Lien Non
Python Bibliothèque d’authentification Microsoft pour Python ghcr.io/azure/azure-workload-identity/msal-python:latest Lien Non

Limites

  • Vous pouvez seulement avoir 20 jeux d’informations d’identification d’identité fédérée par identité managée.
  • Il faut quelques secondes pour que les informations d’identification d’identité fédérée soient propagées après avoir été ajoutées initialement.
  • Le module complémentaire Nœuds virtuels, basé sur le projet open source Virtual Kubelet, n’est pas pris en charge.
  • La création d’informations d’identification d’identité fédérée n’est pas prise en charge sur les identités managées affectées par l’utilisateur dans ces régions.

Fonctionnement

Dans ce modèle de sécurité, le cluster AKS agit comme un émetteur de jetons, et Microsoft Entra ID utilise OpenID Connect pour découvrir des clés de signature publique et vérifier l’authenticité du jeton de compte de service avant de l’échanger pour un jeton Microsoft Entra. Votre charge de travail peut échanger un jeton de compte de service projeté sur son volume pour un jeton Microsoft Entra à l’aide de la bibliothèque de client Azure Identity ou de la bibliothèque d’authentification Microsoft (MSAL).

Diagram of the AKS workload identity security model.

Le tableau suivant décrit les points de terminaison de l’émetteur OIDC requis pour Microsoft Entra Workload ID :

Point de terminaison Description
{IssuerURL}/.well-known/openid-configuration Également appelé document de découverte OIDC. Il contient les métadonnées relatives aux configurations de l’émetteur.
{IssuerURL}/openid/v1/jwks Il contient la ou les clés de signature publiques que Microsoft Entra ID utilise pour vérifier l’authenticité du jeton de compte de service.

Le diagramme suivant récapitule la séquence d’authentification à l’aide d’OpenID Connect.

Diagram of the AKS workload identity OIDC authentication sequence.

Rotation automatique des certificats Webhook

À l’instar des autres modules complémentaires webhook, le certificat est retourné du fait de l’opération de rotation automatique du certificat de cluster.

Étiquettes et annotations de compte de service

Microsoft Entra Workload ID prend en charge les mappages suivants liés à un compte de service :

  • Un-à-un où un compte de service fait référence à un objet Microsoft Entra.
  • Plusieurs à un où plusieurs comptes de service font référence au même objet Microsoft Entra.
  • Un-à-plusieurs où un compte de service fait référence à plusieurs objets Microsoft Entra en modifiant l’annotation d’ID client. Pour plus d’informations, consultez Comment fédérer plusieurs identités avec un compte de service Kubernetes.

Notes

Si les annotations de compte de service sont mises à jour, vous devez redémarrer le pod pour que les modifications prennent effet.

Si vous avez utilisé une identité managée par pod Microsoft Entra, considérez un compte de service comme une identité Azure, sauf qu’un compte de service fait partie de l’API Kubernetes principale, plutôt qu’une définition de ressource personnalisée (CRD). La section suivante présente une liste des étiquettes et annotations disponibles qui peuvent être utilisées pour configurer le comportement lors de l’échange du jeton de compte de service contre un jeton d’accès Microsoft Entra.

Annotations de compte de service

Toutes les annotations sont facultatives. Si l’annotation n’est pas spécifiée, la valeur par défaut est utilisée.

Annotation Description Default
azure.workload.identity/client-id Représente l’application Microsoft Entra
Azure à utiliser avec le pod.
azure.workload.identity/tenant-id Représente l’ID de locataire Azure où
L’application Microsoft Entra est inscrite.
Variable d’environnement AZURE_TENANT_ID extraite
de ConfigMap azure-wi-webhook-config.
azure.workload.identity/service-account-token-expiration Représente le champ expirationSeconds pour le
jeton de compte de service projeté. Il s’agit d’un champ facultatif que vous configurez pour éviter les temps d’arrêt
occasionnés par des erreurs survenant lors de l’actualisation du jeton de compte de service. L’expiration du jeton de compte de service Kubernetes n’est pas corrélée avec les jetons Microsoft Entra. Les jetons Microsoft Entra expirent dans les 24 heures suivant leur émission.
3600
La plage prise en charge est 3600-86400.

Étiquettes du pod

Remarque

Pour les applications utilisant l’identité de charge de travail, il nécessaire d’ajouter l’étiquette azure.workload.identity/use: "true" à la spécification du pod pour que AKS déplace l’identité de charge de travail vers un scénario de Fail Close afin de fournir un comportement cohérent et fiable aux pods qui doivent utiliser l’identité de charge de travail. Dans le cas contraire, les pods échouent après avoir été redémarrés.

Libellé Description Valeur recommandée Requis
azure.workload.identity/use Cette étiquette est nécessaire dans la spécification de modèle de pod. Seuls les pods avec cette étiquette sont mutés par le webhook d’admission de mutation azure-workload-identity pour injecter les variables d’environnement spécifiques à Azure et le volume de jeton projeté du compte de service. true Oui

Annotations de pod

Toutes les annotations sont facultatives. Si l’annotation n’est pas spécifiée, la valeur par défaut est utilisée.

Annotation Description Default
azure.workload.identity/service-account-token-expiration Représente le champ expirationSeconds pour le jeton de compte de service projeté. Il s’agit d’un champ facultatif que vous configurez pour éviter tout temps d’arrêt résultant d’erreurs lors de l’actualisation du jeton de compte de service. L’expiration du jeton de compte de service Kubernetes n’est pas corrélée avec les jetons Microsoft Entra. Les jetons Microsoft Entra expirent dans les 24 heures suivant leur émission. 1 3600
La plage prise en charge est 3600-86400.
azure.workload.identity/skip-containers Représente une liste de conteneurs séparés par des points-virgules pour ignorer l’ajout d’un volume de jeton de compte de service projeté. Par exemple : container1;container2. Par défaut, le volume de jeton de compte de service projeté est ajouté à tous les conteneurs si le compte de service est étiqueté avec azure.workload.identity/use: true.
azure.workload.identity/inject-proxy-sidecar Injecte un conteneur init de proxy et un sidecar de proxy dans le pod. Le proxy sidecar est utilisé pour intercepter des requêtes de jetons adressées à IMDS et acquérir un jeton Microsoft Entra pour le compte de l’utilisateur avec des informations d’identification d’identité fédérée. true
azure.workload.identity/proxy-sidecar-port Représente le port du sidecar de proxy. 8000

1 Est prioritaire si le compte de service est également annoté.

Comment migrer vers une identité de charge de travail

Vous pouvez configurer un cluster exécutant déjà une identité managée par pod pour utiliser une identité de charge de travail de deux façons. La première option vous permet d’utiliser la configuration que vous avez implémentée pour l’identité managée par pod aujourd’hui. Vous devez simplement annoter le compte de service dans l’espace de noms avec l’identité, ce qui permet à l’identité de charge de travail d’injecter les annotations dans les pods.

La deuxième option consiste à réécrire votre application pour utiliser la dernière version de la bibliothèque de client Azure Identity.

Pour simplifier et faciliter le processus de migration, nous avons développé un sidecar de migration qui convertit les transactions IMDS que votre application effectue sur OpenID Connect (OIDC). Le sidecar de migration n’est pas destiné à être une solution à long terme, mais un moyen d’être rapidement opérationnel pour l’identité de charge de travail. L’exécution du sidecar de migration dans votre application achemine les transactions IMDS de l’application vers OIDC. L’autre approche consiste à opérer une mise à niveau vers une version prise en charge de la bibliothèque de client Azure Identity qui prend en charge l’authentification OIDC.

Le tableau suivant récapitule nos recommandations de migration ou de déploiement pour une identité de charge de travail.

Scénario Description
Un déploiement de cluster nouveau ou existant exécute une version prise en charge de la bibliothèque de client Azure Identity Aucune étape de migration n’est requise.
Exemples de ressources de déploiement :
- Déployer et configurer une identité de charge de travail sur un nouveau cluster
- Tutoriel : Utiliser une identité de charge de travail avec une application sur AKS
Un déploiement de cluster nouveau ou existant exécute une version non prise en charge de la bibliothèque de client Azure Identity Mettez à jour l’image conteneur pour utiliser une version prise en charge du Kit de développement logiciel (SDK) Azure Identity, ou utilisez le sidecar de migration.

Étapes suivantes