Comment utiliser une identité managée avec Azure Container Instances
Utilisez les identités managées pour les ressources Azure pour exécuter du code dans Azure Container Instances interagissant avec d’autres services Azure, et ce sans avoir à gérer les codes secrets ou les informations d’identification dans le code. Cette fonctionnalité fournit un déploiement Azure Container Instances avec une identité managée automatiquement dans Microsoft Entra ID.
Dans cet article, vous en apprendrez davantage sur les identités managées dans Azure Container Instances, et vous découvrirez comment :
- Activer une identité attribuée par l’utilisateur ou par le système dans un groupe de conteneurs
- Autoriser l’identité à accéder à un coffre de clés Azure
- Utiliser l’identité managée pour accéder à un coffre de clés à partir d’un conteneur en cours d’exécution
Adaptez les exemples pour activer et utiliser des identités dans Azure Container Instances pour accéder aux autres services Azure. Ces exemples sont interactifs. Toutefois, en pratique, vos images de conteneur exécuteraient du code pour accéder aux services Azure.
Pourquoi utiliser une identité managée ?
Utilisez une identité managée dans un conteneur en cours d’exécution pour vous authentifier sur n’importe quel service prenant en charge l’authentification Microsoft Entra, sans avoir à gérer les informations d’identification dans le code de votre conteneur. Pour les services qui ne prennent pas en charge l’authentification AD, vous pouvez stocker des codes secrets dans un coffre de clés Azure et utiliser l’identité managée pour accéder à celui-ci afin de récupérer les informations d’identification. Pour en savoir plus sur l’utilisation des identités managées, consultez la section Que sont les identités managées pour les ressources Azure ?
Activer une identité managée
Lorsque vous créez un groupe de conteneurs, activez une ou plusieurs identités managées en définissant une propriété ContainerGroupIdentity. Vous pouvez également activer ou mettre à jour des identités managées après l’exécution d’un groupe de conteneurs. Les deux actions entraînent le redémarrage du groupe de conteneurs. Pour définir les identités sur un nouveau groupe de conteneurs ou sur un groupe existant, utilisez Azure CLI, un modèle Resource Manager, un fichier YAML ou un autre outil Azure.
Azure Container Instances prend en charge les deux types d’identités Azure managées : attribuées par l’utilisateur et attribuées par le système. Sur un groupe de conteneurs, vous pouvez activer une identité attribuée par le système, une ou plusieurs identités attribuées par l’utilisateur, ou les deux types d’identités. Si vous n’êtes pas familiarisé avec les identités managées pour les ressources Azure, consultez la présentation.
Utiliser une identité managée
Pour utiliser une identité managée, l’identité doit être autorisée à accéder à une ou plusieurs ressources de service Azure (par exemple, une application web, un coffre de clés ou un compte de stockage) dans l’abonnement. L’utilisation d’une identité managée dans un conteneur en cours d’exécution est semblable à l’utilisation d’une identité dans une machine virtuelle Azure. Consultez l’aide relative aux machines virtuelles pour en savoir plus sur l’utilisation d’un jeton, d’Azure PowerShell ou Azure CLI, ou des kits de développement logiciel Azure.
Prérequis
Utilisez l’environnement Bash dans Azure Cloud Shell. Pour plus d’informations, consultez Démarrage rapide pour Bash dans Azure Cloud Shell.
Si vous préférez exécuter les commandes de référence de l’interface de ligne de commande localement, installez l’interface Azure CLI. Si vous exécutez sur Windows ou macOS, envisagez d’exécuter Azure CLI dans un conteneur Docker. Pour plus d’informations, consultez Guide pratique pour exécuter Azure CLI dans un conteneur Docker.
Si vous utilisez une installation locale, connectez-vous à Azure CLI à l’aide de la commande az login. Pour finir le processus d’authentification, suivez les étapes affichées dans votre terminal. Pour connaître les autres options de connexion, consultez Se connecter avec Azure CLI.
Lorsque vous y êtes invité, installez l’extension Azure CLI lors de la première utilisation. Pour plus d’informations sur les extensions, consultez Utiliser des extensions avec Azure CLI.
Exécutez az version pour rechercher la version et les bibliothèques dépendantes installées. Pour effectuer une mise à niveau vers la dernière version, exécutez az upgrade.
- Cet article demande la version 2.0.49 ou ultérieure d’Azure CLI. Si vous utilisez Azure Cloud Shell, la version la plus récente est déjà installée.
Créer un coffre de clés Azure
Les exemples présentés dans cet article utilisent une identité managée dans Azure Container Instances pour accéder à un code secret du coffre de clés Azure.
Commencez par créer un groupe de ressources nommé myResourceGroup à l’emplacement eastus à l’aide de la commande az group create suivante :
az group create --name myResourceGroup --location eastus
Utilisez la commande az keyvault create pour créer un coffre de clés. Veillez à spécifier un nom de coffre de clés unique.
az keyvault create \
--name mykeyvault \
--resource-group myResourceGroup \
--location eastus
Stockez un exemple de secret dans le coffre de clés à l’aide de la commande az keyvault secret set :
az keyvault secret set \
--name SampleSecret \
--value "Hello Container Instances" \
--description ACIsecret --vault-name mykeyvault
Utilisez les exemples suivants pour accéder au coffre de clés à l’aide d’une identité managée attribuée par l’utilisateur ou par le système dans Azure Container Instances.
Exemple 1 : Utiliser une identité attribuée par l’utilisateur pour accéder au coffre de clés Azure
Créer une identité
Créez d’abord une identité dans votre abonnement à l’aide de la commande az identity create. Vous pouvez utiliser le groupe de ressources utilisé pour créer le coffre de clés, ou en utiliser un autre.
az identity create \
--resource-group myResourceGroup \
--name myACIId
Pour utiliser l’identité dans les étapes suivantes, utilisez la commande az identity show pour stocker l’ID de principal de service et l’ID de ressource de l’identité dans des variables.
# Get service principal ID of the user-assigned identity
SP_ID=$(az identity show \
--resource-group myResourceGroup \
--name myACIId \
--query principalId --output tsv)
# Get resource ID of the user-assigned identity
RESOURCE_ID=$(az identity show \
--resource-group myResourceGroup \
--name myACIId \
--query id --output tsv)
Autoriser l’identité attribuée par l’utilisateur à accéder au coffre de clés
Exécutez la commande az keyvault set-policy suivante pour définir une stratégie d’accès sur le coffre de clés. L’exemple suivant permet à l’identité affectée par l’utilisateur d’obtenir des secrets du coffre de clés :
az keyvault set-policy \
--name mykeyvault \
--resource-group myResourceGroup \
--object-id $SP_ID \
--secret-permissions get
Activer une identité attribuée par l’utilisateur dans un groupe de conteneurs
Exécutez la commande az container create suivante pour créer une instance de conteneur basée sur une image azure-cli
de Microsoft. Cet exemple fournit un groupe contenant un seul conteneur que vous pouvez utiliser de manière interactive pour accéder à d’autres services Azure. Dans cette section, seul le système d’exploitation de base est utilisé. Pour obtenir un exemple d’utilisation d’Azure CLI dans le conteneur, consultez Activer l’identité attribuée par le système sur un groupe de conteneurs.
Le paramètre --assign-identity
passe votre identité managée attribuée par l’utilisateur au groupe. Cette commande longue laisse le conteneur s’exécuter. Cet exemple utilise le groupe de ressources utilisé pour créer le coffre de clés, mais vous pouvez en spécifier un autre.
az container create \
--resource-group myResourceGroup \
--name mycontainer \
--image mcr.microsoft.com/azure-cli \
--assign-identity $RESOURCE_ID \
--command-line "tail -f /dev/null"
Après quelques secondes, vous devriez recevoir une réponse d’Azure CLI indiquant que le déploiement est terminé. Vérifiez son état à l’aide de la commande az container show.
az container show \
--resource-group myResourceGroup \
--name mycontainer
La section identity
de la sortie ressemble à ce qui suit, elle montre la définition de l’identité dans le groupe de conteneurs. Le principalID
sous userAssignedIdentities
est le principal de service de l’identité que vous avez créée dans Microsoft Entra ID :
[...]
"identity": {
"principalId": "null",
"tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
"type": "UserAssigned",
"userAssignedIdentities": {
"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/danlep1018/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId": {
"clientId": "00001111-aaaa-2222-bbbb-3333cccc4444",
"principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222"
}
}
},
[...]
Utiliser une identité attribuée par l’utilisateur pour obtenir un secret du coffre de clés
Vous pouvez désormais utiliser l’identité managée dans l’instance de conteneur en cours d’exécution pour accéder au coffre de clés. Commencez par lancer un shell bash dans le conteneur :
az container exec \
--resource-group myResourceGroup \
--name mycontainer \
--exec-command "/bin/bash"
Exécutez les commandes suivantes dans le shell bash du conteneur. Pour obtenir un jeton d’accès permettant d’utiliser Microsoft Entra ID pour s’authentifier auprès du coffre de clés, exécutez la commande suivante :
client_id="00001111-aaaa-2222-bbbb-3333cccc4444"
curl "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fvault.azure.net&client_id=$client_id" -H Metadata:true -s
Sortie :
{"access_token":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Imk2bEdrM0ZaenhSY1ViMkMzbkVRN3N5SEpsWSIsImtpZCI6Imk2bEdrM0ZaenhSY1ViMkMzbkVRN3N5SEpsWSJ9......xxxxxxxxxxxxxxxxx","refresh_token":"","expires_in":"28799","expires_on":"1539927532","not_before":"1539898432","resource":"https://vault.azure.net/","token_type":"Bearer"}
Pour stocker le jeton d’accès dans une variable qui pourra être utilisée dans les prochaines commandes pour l’authentification, exécutez la commande suivante :
TOKEN=$(curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fvault.azure.net' -H Metadata:true | jq -r '.access_token')
Utilisez maintenant le jeton d’accès pour vous authentifier auprès du coffre de clés et lire un secret. Veillez à remplacer le nom de votre coffre de clés dans l’URL (https://mykeyvault.vault.azure.net/...)°:
curl https://mykeyvault.vault.azure.net/secrets/SampleSecret/?api-version=7.4 -H "Authorization: Bearer $TOKEN"
La réponse ressemble à ce qui suit, elle affiche le code secret. Dans votre code, il vous faudrait analyser cette sortie pour obtenir le code secret. Utilisez ensuite le code secret dans une opération ultérieure pour accéder à une autre ressource Azure.
{"value":"Hello Container Instances","contentType":"ACIsecret","id":"https://mykeyvault.vault.azure.net/secrets/SampleSecret/xxxxxxxxxxxxxxxxxxxx","attributes":{"enabled":true,"created":1539965967,"updated":1539965967,"recoveryLevel":"Purgeable"},"tags":{"file-encoding":"utf-8"}}
Exemple 2 : Utiliser une identité attribuée par le système pour accéder à un coffre de clés Azure
Activer une identité attribuée par le système dans un groupe de conteneurs
Exécutez la commande az container create suivante pour créer une instance de conteneur basée sur une image azure-cli
de Microsoft. Cet exemple fournit un groupe contenant un seul conteneur que vous pouvez utiliser de manière interactive pour accéder à d’autres services Azure.
Le paramètre --assign-identity
, sans valeur supplémentaire, active une identité managée attribuée par le système dans le groupe. L’identité est limitée au groupe de ressources du groupe de conteneurs. Cette commande longue laisse le conteneur s’exécuter. Cet exemple utilise le même groupe de ressources que celui utilisé pour créer le coffre de clés, qui se trouve dans l’étendue de l’identité.
# Get the resource ID of the resource group
RG_ID=$(az group show --name myResourceGroup --query id --output tsv)
# Create container group with system-managed identity
az container create \
--resource-group myResourceGroup \
--name mycontainer \
--image mcr.microsoft.com/azure-cli \
--assign-identity --scope $RG_ID \
--command-line "tail -f /dev/null"
Après quelques secondes, vous devriez recevoir une réponse d’Azure CLI indiquant que le déploiement est terminé. Vérifiez son état à l’aide de la commande az container show.
az container show \
--resource-group myResourceGroup \
--name mycontainer
La section identity
de la sortie ressemble à ce qui suit. Elle montre qu’une identité attribuée par le système a été créée dans Microsoft Entra ID :
[...]
"identity": {
"principalId": "bbbbbbbb-cccc-dddd-2222-333333333333",
"tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
"type": "SystemAssigned",
"userAssignedIdentities": null
},
[...]
Définissez une variable sur la valeur principalId
(l’ID du principal de service) de l’identité, pour une utilisation ultérieure.
SP_ID=$(az container show \
--resource-group myResourceGroup \
--name mycontainer \
--query identity.principalId --out tsv)
Autoriser le groupe de conteneurs à accéder au coffre de clés
Exécutez la commande az keyvault set-policy suivante pour définir une stratégie d’accès sur le coffre de clés. L’exemple suivant permet à l’identité managée attribuée par le système d’obtenir des secrets du coffre de clés :
az keyvault set-policy \
--name mykeyvault \
--resource-group myResourceGroup \
--object-id $SP_ID \
--secret-permissions get
Utiliser une identité de groupe de conteneurs pour obtenir un secret du coffre de clés
Maintenant, vous pouvez utiliser l’identité managée pour accéder au coffre de clés dans l’instance de conteneur en cours d’exécution. Commencez par lancer un shell bash dans le conteneur :
az container exec \
--resource-group myResourceGroup \
--name mycontainer \
--exec-command "/bin/bash"
Exécutez les commandes suivantes dans le shell bash du conteneur. Connectez-vous d’abord à l’interface Azure CLI à l’aide de l’identité managée :
az login --identity
À partir du conteneur en cours d’exécution, récupérez le secret du coffre de clés :
az keyvault secret show \
--name SampleSecret \
--vault-name mykeyvault --query value
La valeur du secret est récupérée :
"Hello Container Instances"
Activer une identité managée à l’aide d’un modèle Resource Manager
Pour activer une identité managée dans un groupe de conteneurs à l’aide d’un modèle Resource Manager, définissez la propriété identity
de l’objet Microsoft.ContainerInstance/containerGroups
avec un objet ContainerGroupIdentity
. Dans les extraits de code suivants, la propriété identity
est configurée pour différents scénarios. Consultez les références sur les modèles Resource Manager. Spécifiez une version apiVersion
minimale de 2018-10-01
.
Identité attribuée par l’utilisateur
Une identité attribuée par l’utilisateur est un ID de ressource qui se présente sous cette forme :
"/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}"
Vous pouvez activer une ou plusieurs identités attribuées par l’utilisateur.
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"myResourceID1": {
}
}
}
Identité attribuée par le système
"identity": {
"type": "SystemAssigned"
}
Identités attribuées par l’utilisateur et par le système
Sur un groupe de conteneurs, vous pouvez activer à la fois une identité attribuée par le système, et une ou plusieurs identités attribuées par l’utilisateur.
"identity": {
"type": "SystemAssigned, UserAssigned",
"userAssignedIdentities": {
"myResourceID1": {
}
}
}
...
Activer une identité managée à l’aide du fichier YAML
Pour activer une identité managée dans un groupe de conteneurs déployé à l’aide d’un fichier YAML, incluez le code YAML suivant.
Spécifiez une version apiVersion
minimale de 2018-10-01
.
Identité attribuée par l’utilisateur
Une identité attribuée par l’utilisateur est un ID de ressource qui se présente sous la forme
'/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}'
Vous pouvez activer une ou plusieurs identités attribuées par l’utilisateur.
identity:
type: UserAssigned
userAssignedIdentities:
{'myResourceID1':{}}
Identité attribuée par le système
identity:
type: SystemAssigned
Identités attribuées par l’utilisateur et par le système
Sur un groupe de conteneurs, vous pouvez activer à la fois une identité attribuée par le système, et une ou plusieurs identités attribuées par l’utilisateur.
identity:
type: SystemAssigned, UserAssigned
userAssignedIdentities:
{'myResourceID1':{}}
Identité managée sur des conteneurs Windows
Le fonctionnement de l’identité managée sur des groupes de conteneurs Windows est différent de celui sur des groupes de conteneurs Linux. Pour les conteneurs Windows, le serveur de métadonnées (169.254.169.254) n’est pas disponible pour obtenir le jeton Microsoft Entra ID. Les clients peuvent suivre un autre modèle pour obtenir le jeton d’accès dans des conteneurs Windows. Le modèle implique l’envoi d’une demande de jeton au IDENTITY_ENDPOINT, ainsi que des informations supplémentaires telles que l’ID de principal et le secret, comme illustré ci-dessous. L’IDENTITY_ENDPOINT et IDENTITY_HEADER sont injectés comme variable d’environnement dans votre conteneur.
curl -G -v %IDENTITY_ENDPOINT% --data-urlencode resource=https://vault.azure.net --data-urlencode principalId=<principal id> -H secret:%IDENTITY_HEADER%
Exemple de script PowerShell
identityEndpoint = $env:IDENTITY_ENDPOINT
$identityHeader = $env:IDENTITY_HEADER
$resource = "https://vault.azure.net"
$principalId = "b2ee9347-623c-4794-85af-2d5261356f67"
Invoke-RestMethod -Uri "$identityEndpoint" `
-Method Get `
-Headers @{secret = $identityHeader} `
-Body @{resource = $resource; principalId = $principalId} `
-ContentType "application/x-www-form-urlencoded"
Le module az login et d’autre bibliothèques de client dépendant du serveur de métadonnées (169.254.169.254) ne fonctionnent pas dans un conteneur Windows. De plus, les conteneurs Windows dans un réseau virtuel ne peuvent pas se connecter au point de terminaison. Par conséquent, un jeton d’identité managée ne peut pas être généré dans un conteneur de réseau virtuel Windows.
Étapes suivantes
Dans cet article, vous en avez appris davantage sur les identités managées dans Azure Container Instances, et vous avez découvert comment :
- Activer une identité attribuée par l’utilisateur ou par le système dans un groupe de conteneurs
- Autoriser l’identité à accéder à un coffre de clés Azure
- Utiliser l’identité managée pour accéder à un coffre de clés à partir d’un conteneur en cours d’exécution
En savoir plus sur les identités managées pour les ressources Azure.
Consultez un exemple de Kit de développement logiciel (SDK) Azure Go dans lequel une identité managée est utilisée pour accéder à un coffre de clés Key Vault à partir d’Azure Container Instances.