Partager via


Déployer et configurer l’identité de charge de travail sur un cluster AKS activé par le cluster Azure Arc (préversion)

S’applique à : Azure Local, version 23H2

La fédération des identités de charge de travail vous permet de configurer une identité managée affectée par l’utilisateur ou une inscription d’application dans Microsoft Entra ID pour approuver des jetons à partir d’un fournisseur d’identité externe (IDP), tel que Kubernetes, permettant l’accès aux ressources protégées par Microsoft Entra, comme Azure Key Vault ou le stockage Blob Azure.

Azure Kubernetes Service (AKS) activé par Azure Arc est un service Kubernetes managé qui vous permet de déployer facilement des clusters Kubernetes compatibles avec l’identité de charge de travail. Cet article explique comment effectuer les tâches suivantes :

  • Créez un cluster AKS Arc avec l’identité de charge de travail activée (préversion).
  • Créez un compte de service Kubernetes et liez-le à l’identité managée Azure.
  • Créez des informations d’identification fédérées sur l’identité managée pour approuver l’émetteur OIDC.
  • Déployez votre application.
  • Exemple : Accordez à un pod dans le cluster l’accès aux secrets dans un coffre de clés Azure.

Important

Ces fonctionnalités en préversion sont disponibles en libre-service, en mode opt-in. Les préversions sont fournies « en l’état » et « en fonction des disponibilités », et sont exclues des contrats de niveau de service et de la garantie limitée. Azure Kubernetes Service, activé par les préversions d’Azure Arc, est partiellement couvert par le support client sur une base optimale.

Remarque

En préversion publique, AKS sur Azure Stack HCI prend en charge l’activation de l’identité de charge de travail lors de la création du cluster AKS. Toutefois, l’activation de l’identité de charge de travail après sa création ou sa désactivation ultérieurement n’est pas prise en charge.

Prérequis

Avant de déployer un cluster Kubernetes avec Azure Arc activé, vous devez disposer des conditions préalables suivantes :

  • Si vous n’en avez pas, créez un compte gratuit Azure avant de commencer.
  • Cet article nécessite la version 1.4.23 ou ultérieure d’Azure CLI. Si vous utilisez Azure Cloud Shell, sachez que la version la plus récente est déjà installée.

Exporter des variables d’environnement

Pour simplifier les étapes de configuration des identités requises, les commandes suivantes définissent des variables d’environnement référencées dans les exemples de cet article. Remplacez les valeurs suivantes par les vôtres :

$AZSubscriptionID = "00000000-0000-0000-0000-000000000000" 
$Location = "westeurope" 
$resource_group_name = "myResourceGroup" 

$aks_cluster_name = "myAKSCluster" 

$SERVICE_ACCOUNT_NAMESPACE = "default" 
$SERVICE_ACCOUNT_NAME = "workload-identity-sa" 

$FedIdCredentialName = "myFedIdentity" 
$MSIName = "myIdentity" 

# To access key vault secrets from a pod in the cluster, include these variables:
$KVName = "KV-workload-id" 
$KVSecretName= "KV-secret"

Définir l’abonnement actif

Tout d’abord, définissez votre abonnement comme abonnement actif actuel. Exécutez la commande az account set avec votre ID d’abonnement :

az login  
az account set -s $AZSubscriptionID

Créer un groupe de ressources

Un groupe de ressources Azure est un groupe logique dans lequel des ressources Azure sont déployées et gérées. Lorsque vous créez un groupe de ressources, vous êtes invité à spécifier un emplacement. Cet emplacement est l'emplacement de stockage des métadonnées de votre groupe de ressources et l'endroit où vos ressources s'exécutent dans Azure si vous ne spécifiez pas une autre région lors de la création de la ressource.

Exécutez la commande az group create pour créer un groupe de ressources :

az group create --name $resource_group_name --location $Location

L’exemple de sortie suivant montre la création réussie d’un groupe de ressources :

{ 
  "id": "/subscriptions/<guid>/resourceGroups/myResourceGroup", 
  "location": "westeurope", 
  "managedBy": null, 
  "name": "$resource_group_name", 
  "properties": { 
    "provisioningState": "Succeeded" 
  }, 
  "tags": null 
}

Étape 1 : Créer un cluster AKS Arc avec l’identité de charge de travail activée

Pour créer un cluster AKS Arc, vous avez besoin des valeurs et $logicnet_Id des $customlocation_ID valeurs.

  • $customlocation_ID: ID Azure Resource Manager de l’emplacement personnalisé. L’emplacement personnalisé est configuré pendant le déploiement du cluster Azure Stack HCI. Votre administrateur d’infrastructure doit vous donner l’ID Resource Manager de l’emplacement personnalisé. Vous pouvez également obtenir l’ID Resource Manager à l’aide $customlocation_ID = $(az customlocation show --name "<your-custom-location-name>" --resource-group $resource_group_name --query "id" -o tsv)de , si l’administrateur de l’infrastructure fournit un nom d’emplacement personnalisé et un nom de groupe de ressources.
  • $logicnet_Id: ID Azure Resource Manager du réseau logique Local Azure créé en suivant ces étapes. Votre administrateur d’infrastructure doit vous donner l’ID Resource Manager du réseau logique. Vous pouvez également obtenir l’ID Resource Manager à l’aide $logicnet_Id = $(az stack-hci-vm network lnet show --name "<your-lnet-name>" --resource-group $resource_group_name --query "id" -o tsv)de , si l’administrateur de l’infrastructure fournit un nom de réseau logique et un nom de groupe de ressources.

Exécutez la commande az aksarc create avec le --enable-oidc-issuer --enable-workload-identity paramètre. Fournissez vos ID entra-admin-group-object-ids et vérifiez que vous êtes membre du groupe d’administration Microsoft Entra ID pour l’accès en mode proxy :

az aksarc create  
-n $aks_cluster_name -g $resource_group_name  
--custom-location $customlocation_ID --vnet-ids $logicnet_Id  
--aad-admin-group-object-ids <entra-admin-group-object-ids> 
--generate-ssh-keys  
--enable-oidc-issuer --enable-workload-identity

Au bout de quelques minutes, la commande se termine et retourne des informations au format JSON sur le cluster.

L’extension d’identité de charge de travail peut prendre un certain temps après la création d’un cluster provisionné. Utilisez la commande suivante pour vérifier l’état de l’extension d’identité de charge de travail :

az connectedk8s show -n $aks_cluster_name -g $resource_group_name
# agentState = "Succeeded" 
"agentPublicKeyCertificate": "", 
  "agentVersion": "1.21.10", 
  "arcAgentProfile": { 
    "agentAutoUpgrade": "Enabled", 
    "agentErrors": [], 
    "agentState": "Succeeded", 
    "desiredAgentVersion": "", 
    "systemComponents": null 

# oidcIssuerProfile "enabled": true and "issuerUrl" present 

"oidcIssuerProfile": { 
    "enabled": true, 
    "issuerUrl": "https://oidcdiscovery-{location}-endpoint-1111111111111111.000.azurefd.net/00000000-0000-0000-0000-000000000000/11111111-1111-1111-1111-111111111111/"}

Dans le Portail Azure, vous pouvez afficher l’extension wiextension sous la section Propriétés de votre cluster Kubernetes.

Important

Dans le cadre de l’amélioration de la sécurité pour les clusters AKS Arc, l’activation de l’identité de charge de travail déclenche deux modifications. Tout d’abord, la clé de signature du compte Kubernetes service pivote automatiquement toutes les 45 jours et reste valide pendant 90 jours. Deuxièmement, l’indicateur --service-account-extend-token-expiration est désactivé, réduisant la validité des jetons d’un an à un maximum de 24 heures.

Enregistrer l’URL de l’émetteur OIDC dans une variable d’environnement

Une fois le cluster AKS créé, vous pouvez obtenir l’URL de l’émetteur OIDC et l’enregistrer dans une variable d’environnement. Exécutez la commande suivante :

$SERVICE_ACCOUNT_ISSUER =$(az connectedk8s show --n $aks_cluster_name --resource-group $resource_group_name --query "oidcIssuerProfile.issuerUrl" --output tsv)

Étape 2 : Créer un compte de service Kubernetes et le lier à l’identité managée Azure

Tout d’abord, créez une identité managée. Exécutez la commande az identity create :

az identity create --name $MSIName --resource-group $resource_group_name --location $Location --subscription $AZSubscriptionID

Ensuite, créez des variables pour l’ID client de l’identité managée :

$MSIId=$(az identity show --resource-group $resource_group_name --name $MSIName --query 'clientId' --output tsv)
$MSIPrincipalId=$(az identity show --resource-group $resource_group_name --name $MSIName --query 'principalId' --output tsv)

Créer un compte de service Kubernetes

Créez un compte de service Kubernetes et annotez-le avec l’ID client de l’identité managée créée à l’étape précédente :

az connectedk8s proxy -n $aks_cluster_name -g $resource_group_name

Ouvrez une nouvelle fenêtre. Copiez et collez les commandes CLI suivantes :

$yaml = @" apiVersion: v1 kind: ServiceAccount metadata: annotations: azure.workload.identity/client-id: $MSIId name: $SERVICE_ACCOUNT_NAME namespace: $SERVICE_ACCOUNT_NAMESPACE "@ $yaml = $yaml -replace '\$MSIId', $MSIId ` -replace '\$SERVICE_ACCOUNT_NAME', $SERVICE_ACCOUNT_NAME ` -replace '\$SERVICE_ACCOUNT_NAMESPACE', $SERVICE_ACCOUNT_NAMESPACE $yaml | kubectl apply -f -

La sortie suivante montre la création réussie du compte de service :

serviceaccount/workload-identity-sa created

Étape 3 : Créer des informations d’identification fédérées sur l’identité managée pour approuver l’émetteur OIDC

Tout d’abord, créez des informations d’identification d’identité fédérée. Utilisez la commande az identity federated-credential create pour créer les informations d’identification de l’identité fédérée entre l’identité managée, l’émetteur du compte de service et le sujet. Pour plus d’informations sur les informations d’identification d’identité fédérée dans Microsoft Entra, consultez Vue d’ensemble des informations d’identification d’identité fédérée dans Microsoft Entra ID.

# Create a federated credential 

az identity federated-credential create --name $FedIdCredentialName --identity-name $MSIName --resource-group $resource_group_name --issuer $SERVICE_ACCOUNT_ISSUER --subject "system:serviceaccount:${SERVICE_ACCOUNT_NAMESPACE}:${SERVICE_ACCOUNT_NAME}" 

# Show the federated credential 

az identity federated-credential show --name $FedIdCredentialName --resource-group $resource_group_name --identity-name $MSIName

Remarque

Après avoir ajouté des informations d’identification d’identité fédérée, la propagation prend quelques secondes. Les demandes de jeton effectuées immédiatement après peuvent échouer jusqu’à l’actualisation du cache. Pour éviter ce problème, envisagez d’ajouter un bref délai après la création des informations d’identification d’identité fédérée.

Étape 4 : Déployer votre application

Lorsque vous déployez vos pods d’application, le manifeste doit référencer le compte de service créé lors de l’étape Créer un compte de service Kubernetes. Le manifeste suivant montre comment référencer le compte, en particulier les propriétés et spec\serviceAccountName les metadata\namespace propriétés. Veillez à spécifier une image pour image et un nom de conteneur pour containerName :

$image = "<image>"  # Replace <image> with the actual image name 
$containerName = "<containerName>"  # Replace <containerName> with the actual container name 

$yaml = @" 
apiVersion: v1 
kind: Pod 
metadata: 
  name: sample-quick-start 
  namespace: $SERVICE_ACCOUNT_NAMESPACE 
  labels: 
    azure.workload.identity/use: "true" # Required. Only pods with this label can use workload identity. 
spec: 
  serviceAccountName: $SERVICE_ACCOUNT_NAME 
  containers: 
    - image: $image 
      name: $containerName 
"@ 

# Replace variables within the YAML content 
$yaml = $yaml -replace '\$SERVICE_ACCOUNT_NAMESPACE', $SERVICE_ACCOUNT_NAMESPACE ` 
                -replace '\$SERVICE_ACCOUNT_NAME', $SERVICE_ACCOUNT_NAME 

# Apply the YAML configuration 
$yaml | kubectl apply -f - 

Important

Vérifiez que les pods d’application utilisant l’identité de charge de travail incluent l’étiquette azure.workload.identity/use: "true" dans la spécification du pod. Sinon, les pods échouent après leur redémarrage.

Exemple : Accorder des autorisations pour accéder à Azure Key Vault

Les instructions de cette étape décrivent comment accéder aux secrets, clés ou certificats dans un coffre de clés Azure à partir du pod. Les exemples de cette section configurent l’accès aux secrets dans le coffre de clés pour l’identité de charge de travail, mais vous pouvez effectuer des étapes similaires pour configurer l’accès aux clés ou aux certificats.

L’exemple suivant montre comment utiliser le modèle d’autorisation de contrôle d’accès en fonction du rôle Azure (Azure RBAC) pour accorder au pod l’accès au coffre de clés. Pour plus d’informations sur le modèle d’autorisation RBAC Azure pour Azure Key Vault, consultez Accorder l’autorisation aux applications d’accéder à un coffre de clés Azure à l’aide d’Azure RBAC.

  1. Créez un coffre de clés avec la protection contre le vidage et l’autorisation RBAC activée. Vous pouvez également utiliser un coffre de clés existant s’il est configuré pour la protection contre le vidage et l’autorisation RBAC :

    az keyvault create --name $KVName --resource-group $resource_group_name --location $Location --enable-purge-protection --enable-rbac-authorization
    
    # retrieve the key vault ID for role assignment
    $KVId=$(az keyvault show --resource-group $resource_group_name --name $KVName --query id --output tsv)
    
  2. Attribuez le rôle Agent de secrets RBAC Key Vault à vous-même afin de pouvoir créer un secret dans le nouveau coffre de clés. Les nouvelles attributions de rôles peuvent prendre jusqu’à cinq minutes pour se propager et être mises à jour par le serveur d’autorisation.

    az role assignment create --assignee-object-id $MSIPrincipalId --role "Key Vault Secrets Officer" --scope $KVId --assignee-principal-type ServicePrincipal
    
  3. Créez un secret dans le coffre de clés :

    az keyvault secret set --vault-name $KVName --name $KVSecretName --value "Hello!"
    
  4. Attribuez le rôle Utilisateur des secrets Key Vault à l’identité managée affectée par l’utilisateur que vous avez créée précédemment. Cette étape donne à l’identité managée l’autorisation de lire les secrets à partir du coffre de clés :

    az role assignment create --assignee-object-id $MSIPrincipalId --role "Key Vault Secrets User" --scope $KVId --assignee-principal-type ServicePrincipal
    
  5. Créez une variable d’environnement pour l’URL du coffre de clés :

    $KVUrl=$(az keyvault show --resource-group $resource_group_name --name $KVName --query properties.vaultUri --output tsv)
    
  6. Déployez un pod qui référence le compte de service et l’URL du coffre de clés :

    $yaml = @" 
    apiVersion: v1 
    kind: Pod 
    metadata: 
      name: sample-quick-start 
      namespace: $SERVICE_ACCOUNT_NAMESPACE 
      labels: 
        azure.workload.identity/use: "true" 
    spec: 
      serviceAccountName: $SERVICE_ACCOUNT_NAME 
      containers: 
        - image: ghcr.io/azure/azure-workload-identity/msal-go 
          name: oidc 
          env: 
          - name: KEYVAULT_URL 
            value: $KVUrl 
          - name: SECRET_NAME 
            value: $KVSecretName 
      nodeSelector: 
        kubernetes.io/os: linux 
    "@ 
    
    # Replace variables within the YAML content 
    $yaml = $yaml -replace '\$SERVICE_ACCOUNT_NAMESPACE', $SERVICE_ACCOUNT_NAMESPACE ` 
                    -replace '\$SERVICE_ACCOUNT_NAME', $SERVICE_ACCOUNT_NAME ` 
                    -replace '\$KVUrl', $KVUrl ` 
                    -replace '\$KVSecretName', $KVSecretName 
    
    # Apply the YAML configuration 
    $yaml | kubectl --kubeconfig $aks_cluster_name apply -f -
    

Étapes suivantes

Dans cet article, vous avez déployé un cluster Kubernetes et l’avez configuré pour utiliser une identité de charge de travail en préparation des charges de travail d’application pour s’authentifier avec ces informations d’identification. Vous êtes maintenant prêt à déployer votre application et à la configurer pour utiliser l’identité de charge de travail avec la dernière version de la bibliothèque de client Identité Azure.