Authentification externe dans une tâche ACR à l’aide d’une identité managée par Azure
Dans une tâche ACR, vous pouvez activer une identité managée pour les ressources Azure. La tâche peut utiliser l’identité pour accéder à d’autres ressources Azure, sans qu’il soit nécessaire de fournir ni de gérer des informations d’identification.
Dans cet article, vous allez apprendre à activer une identité managée dans une tâche qui accède à des secrets stockés dans un coffre de clés Azure.
Pour créer les ressources Azure, il est nécessaire dans le cadre de cet article d’exécuter Azure CLI version 2.0.68 ou ultérieure. Exécutez az --version
pour trouver la version. Si vous devez installer ou mettre à niveau, voir Installer Azure CLI.
Présentation du scénario
L’exemple de tâche lit les informations d’identification Docker Hub stockées dans un coffre de clés Azure. Les informations d’identification sont pour un compte Docker Hub doté d’autorisations en écriture (push) sur un référentiel Docker Hub privé. Pour lire les informations d’identification, configurez la tâche avec une identité managée et attribuez-lui les autorisations appropriées. La tâche associée à l’identité génère une image et se connecte à Docker Hub pour envoyer l’image au dépôt privé.
Cet exemple montre les étapes à effectuer à l’aide d’une identité managée affectée par l’utilisateur ou par le système. Votre choix d’identité dépend des besoins de votre organisation.
Dans un scénario concret, une entreprise peut publier des images sur un dépôt privé dans Docker Hub dans le cadre d’un processus de génération.
Prérequis
Vous avez besoin d’un registre de conteneurs Azure dans lequel vous exécutez la tâche. Dans cet article, ce registre est nommé myregistry. Remplacez-le par votre propre nom de registre dans les étapes suivantes.
Si vous ne disposez pas d’un registre de conteneurs Azure, consultez Démarrage rapide : Créer un registre de conteneurs privé avec Azure CLI. Vous n’avez pas encore besoin d’envoyer (push) des images au registre.
Vous avez également besoin d’un dépôt privé dans Docker Hub, et d’un compte Docker Hub disposant des autorisations nécessaires pour écrire dans le dépôt. Dans cet exemple, ce dépôt est nommé hubuser/hubrepo.
Créer un coffre de clés et stocker des secrets
Commencez, si nécessaire, 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 les informations d’identification Docker Hub requises dans le coffre de clés à l’aide de la commande az keyvault secret set : Dans ces commandes, les valeurs sont passées dans les variables d’environnement :
# Store Docker Hub user name
az keyvault secret set \
--name UserName \
--value $USERNAME \
--vault-name mykeyvault
# Store Docker Hub password
az keyvault secret set \
--name Password \
--value $PASSWORD \
--vault-name mykeyvault
Dans un scénario concret, les secrets seraient probablement définis et maintenus dans un processus distinct.
Définir des étapes de tâche dans le fichier YAML
Les étapes de cet exemple de tâche sont définies dans un fichier YAML. Créez un fichier nommé dockerhubtask.yaml
dans un répertoire de travail local et collez le contenu suivant. Veillez à remplacer le nom du coffre de clés dans le fichier par le nom de votre coffre de clés.
version: v1.1.0
# Replace mykeyvault with the name of your key vault
secrets:
- id: username
keyvault: https://mykeyvault.vault.azure.net/secrets/UserName
- id: password
keyvault: https://mykeyvault.vault.azure.net/secrets/Password
steps:
# Log in to Docker Hub
- cmd: bash echo '{{.Secrets.password}}' | docker login --username '{{.Secrets.username}}' --password-stdin
# Build image
- build: -t {{.Values.PrivateRepo}}:$ID https://github.com/Azure-Samples/acr-tasks.git -f hello-world.dockerfile
# Push image to private repo in Docker Hub
- push:
- {{.Values.PrivateRepo}}:$ID
Les étapes de tâche effectuent ce qui suit :
- Gérez les informations d’identification secrètes pour l’authentification auprès de Docker Hub.
- Authentifiez-vous auprès de Docker Hub en transmettant les secrets à la commande
docker login
. - Générez une image à l’aide d’un exemple de fichier Docker dans le dépôt Azure-Samples/acr-tasks.
- Envoyez par push l’image au dépôt privé Docker Hub.
Option 1 : Créer une tâche avec une identité affectée par l’utilisateur
Les étapes de cette section créent une tâche et activent une identité affectée par l’utilisateur. Si vous souhaitez activer une identité affectée par le système à la place, consultez l’option 2 : Créer une tâche avec une identité affectée par le système.
Créer une identité attribuée par l’utilisateur
Créez une identité nommée myACRTasksId dans votre abonnement à l’aide de la commande az identity create. Vous pouvez utiliser le groupe de ressources qui vous a servi à créer un registre de conteneurs ou un autre groupe.
az identity create \
--resource-group myResourceGroup \
--name myACRTasksId
Pour configurer l’identité affectée par l’utilisateur aux étapes suivantes, utilisez la commande az identity show pour stocker l’ID du principal, l’ID de client et l’ID de ressource de l’identité dans des variables.
# Get resource ID of the user-assigned identity
resourceID=$(az identity show \
--resource-group myResourceGroup \
--name myACRTasksId \
--query id --output tsv)
# Get principal ID of the task's user-assigned identity
principalID=$(az identity show \
--resource-group myResourceGroup \
--name myACRTasksId \
--query principalId --output tsv)
# Get client ID of the user-assigned identity
clientID=$(az identity show \
--resource-group myResourceGroup \
--name myACRTasksId \
--query clientId --output tsv)
Créer une tâche
Créez la tâche dockerhubtask en exécutant la commande az acr task create suivante. La tâche s’exécute sans contexte de code source et la commande référence le fichier dockerhubtask.yaml
dans le répertoire de travail. Le paramètre --assign-identity
transmet l’ID de ressource de l’identité affectée par l’utilisateur.
az acr task create \
--name dockerhubtask \
--registry myregistry \
--context /dev/null \
--file dockerhubtask.yaml \
--assign-identity $resourceID
Dans la sortie de commande, la section identity
montre que l’identité de type UserAssigned
est définie dans la tâche :
[...]
"identity": {
"principalId": null,
"tenantId": null,
"type": "UserAssigned",
"userAssignedIdentities": {
"/subscriptions/xxxxxxxx-d12e-4760-9ab6-xxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRTasksId": {
"clientId": "xxxxxxxx-f17e-4768-bb4e-xxxxxxxxxxxx",
"principalId": "xxxxxxxx-1335-433d-bb6c-xxxxxxxxxxxx"
}
[...]
Autoriser l’identité à accéder à un 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é de lire des secrets du coffre de clés.
az keyvault set-policy --name mykeyvault \
--resource-group myResourceGroup \
--object-id $principalID \
--secret-permissions get
Poursuivez avec l’exécution manuelle de la tâche.
Option n°2 : Créer une tâche avec une identité affectée par le système
Les étapes de cette section créent une tâche et activent une identité affectée par le système. Si vous souhaitez activer une identité affectée par l’utilisateur à la place, consultez l’Option 1 : Créer une tâche avec une identité affectée par l’utilisateur.
Créer une tâche
Créez la tâche dockerhubtask en exécutant la commande az acr task create suivante. La tâche s’exécute sans contexte de code source et la commande référence le fichier dockerhubtask.yaml
dans le répertoire de travail. Le paramètre --assign-identity
, sans valeur, active une identité managée affectée par le système sur la tâche.
az acr task create \
--name dockerhubtask \
--registry myregistry \
--context /dev/null \
--file dockerhubtask.yaml \
--assign-identity
Dans la sortie de commande, la section identity
montre qu’une identité de type SystemAssigned
est définie dans la tâche. principalId
est l'ID du principal de l'identité de la tâche :
[...]
"identity": {
"principalId": "xxxxxxxx-2703-42f9-97d0-xxxxxxxxxxxx",
"tenantId": "xxxxxxxx-86f1-41af-91ab-xxxxxxxxxxxx",
"type": "SystemAssigned",
"userAssignedIdentities": null
},
"location": "eastus",
[...]
Utilisez la commande az acr task show pour stocker la valeur principalId dans une variable, afin de l’utiliser dans des commandes ultérieures. Remplacez le nom de votre tâche et de votre registre dans la commande suivante :
principalID=$(az acr task show \
--name <task_name> --registry <registry_name> \
--query identity.principalId --output tsv)
Autoriser l’identité à accéder à un 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é de lire des secrets du coffre de clés.
az keyvault set-policy --name mykeyvault \
--resource-group myResourceGroup \
--object-id $principalID \
--secret-permissions get
Exécuter manuellement la tâche
Pour vérifier que la tâche dans laquelle vous avez activé une identité managée s’exécute correctement, déclenchez manuellement la tâche à l’aide de la commande az acr task run. Le paramètre --set
est utilisé pour transmettre le nom du dépôt privé à la tâche. Dans cet exemple, l’espace réservé du nom de dépôt est hubuser/hubrepo.
az acr task run --name dockerhubtask --registry myregistry --set PrivateRepo=hubuser/hubrepo
Quand la tâche s’exécute correctement, la sortie indique une authentification réussie auprès de Docker Hub et l’image est correctement générée et envoyée au dépôt privé :
Queued a run with ID: cf24
Waiting for an agent...
2019/06/20 18:05:55 Using acb_vol_b1edae11-30de-4f2b-a9c7-7d743e811101 as the home volume
2019/06/20 18:05:58 Creating Docker network: acb_default_network, driver: 'bridge'
2019/06/20 18:05:58 Successfully set up Docker network: acb_default_network
2019/06/20 18:05:58 Setting up Docker configuration...
2019/06/20 18:05:59 Successfully set up Docker configuration
2019/06/20 18:05:59 Logging in to registry: myregistry.azurecr.io
2019/06/20 18:06:00 Successfully logged into myregistry.azurecr.io
2019/06/20 18:06:00 Executing step ID: acb_step_0. Timeout(sec): 600, Working directory: '', Network: 'acb_default_network'
2019/06/20 18:06:00 Launching container with name: acb_step_0
[...]
Login Succeeded
2019/06/20 18:06:02 Successfully executed container: acb_step_0
2019/06/20 18:06:02 Executing step ID: acb_step_1. Timeout(sec): 600, Working directory: '', Network: 'acb_default_network'
2019/06/20 18:06:02 Scanning for dependencies...
2019/06/20 18:06:04 Successfully scanned dependencies
2019/06/20 18:06:04 Launching container with name: acb_step_1
Sending build context to Docker daemon 129kB
[...]
2019/06/20 18:06:07 Successfully pushed image: hubuser/hubrepo:cf24
2019/06/20 18:06:07 Step ID: acb_step_0 marked as successful (elapsed time in seconds: 2.064353)
2019/06/20 18:06:07 Step ID: acb_step_1 marked as successful (elapsed time in seconds: 2.594061)
2019/06/20 18:06:07 Populating digests for step ID: acb_step_1...
2019/06/20 18:06:09 Successfully populated digests for step ID: acb_step_1
2019/06/20 18:06:09 Step ID: acb_step_2 marked as successful (elapsed time in seconds: 2.743923)
2019/06/20 18:06:09 The following dependencies were found:
2019/06/20 18:06:09
- image:
registry: registry.hub.docker.com
repository: hubuser/hubrepo
tag: cf24
digest: sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a
runtime-dependency:
registry: registry.hub.docker.com
repository: library/hello-world
tag: latest
digest: sha256:0e11c388b664df8a27a901dce21eb89f11d8292f7fca1b3e3c4321bf7897bffe
git:
git-head-revision: b0ffa6043dd893a4c75644c5fed384c82ebb5f9e
Run ID: cf24 was successful after 15s
Pour confirmer que l’image a fait l’objet d’un envoi (push), recherchez la balise (cf24
dans cet exemple) dans le dépôt privé Docker Hub.
Étapes suivantes
- En savoir plus sur l’activation d’une identité gérée dans une tâche ACR.
- Consultez la référence YAML ACR Tasks