Externí ověřování v úloze ACR pomocí identity spravované Azure
V úloze ACR můžete povolit spravovanou identitu pro prostředky Azure. Úloha může použít identitu pro přístup k jiným prostředkům Azure, aniž by bylo nutné zadávat nebo spravovat přihlašovací údaje.
V tomto článku se dozvíte, jak povolit spravovanou identitu v úloze, která přistupuje k tajným kódům uloženým v trezoru klíčů Azure.
Pokud chcete vytvořit prostředky Azure, musíte spustit Azure CLI verze 2.0.68 nebo novější. Verzi zjistíte spuštěním příkazu az --version
. Pokud potřebujete instalaci nebo upgrade, přečtěte si téma Instalace Azure CLI.
Přehled scénáře
Ukázkový úkol čte přihlašovací údaje Docker Hubu uložené v trezoru klíčů Azure. Přihlašovací údaje jsou pro účet Docker Hubu s oprávněními k zápisu (push) privátnímu úložišti Docker Hubu. Ke čtení přihlašovacích údajů nakonfigurujete úlohu se spravovanou identitou a přiřadíte jí příslušná oprávnění. Úloha přidružená k identitě vytvoří image a přihlásí se do Docker Hubu, aby se image odeslala do privátního úložiště.
Tento příklad ukazuje kroky pomocí spravované identity přiřazené uživatelem nebo přiřazenou systémem. Vaše volba identity závisí na potřebách vaší organizace.
Ve skutečném scénáři může společnost publikovat image do privátního úložiště v Docker Hubu jako součást procesu sestavení.
Požadavky
Potřebujete registr kontejneru Azure, ve kterém spustíte úlohu. V tomto článku se tento registr jmenuje myregistry. V dalších krocích nahraďte vlastním názvem registru.
Pokud ještě nemáte registr kontejneru Azure, přečtěte si článek Rychlý start: Vytvoření privátního registru kontejneru pomocí Azure CLI. Image do registru ještě nemusíte nasdílovat.
Potřebujete také privátní úložiště v Docker Hubu a účet Docker Hubu s oprávněními k zápisu do úložiště. V tomto příkladu má toto úložiště název hubuser/hubrepo.
Vytvoření trezoru klíčů a ukládání tajných kódů
Nejprve v případě potřeby vytvořte skupinu prostředků myResourceGroup v umístění eastus pomocí následujícího příkazu az group create :
az group create --name myResourceGroup --location eastus
Pomocí příkazu az keyvault create vytvořte trezor klíčů. Nezapomeňte zadat jedinečný název trezoru klíčů.
az keyvault create --name mykeyvault --resource-group myResourceGroup --location eastus
Pomocí příkazu az keyvault secret set uložte požadované přihlašovací údaje Docker Hubu do trezoru klíčů. V těchto příkazech se hodnoty předávají v proměnných prostředí:
# 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
V reálném scénáři by tajné kódy pravděpodobně byly nastaveny a udržovány v samostatném procesu.
Definování kroků úkolů v souboru YAML
Kroky pro tuto ukázkovou úlohu jsou definovány v souboru YAML. Vytvořte soubor s názvem dockerhubtask.yaml
v místním pracovním adresáři a vložte následující obsah. Nezapomeňte nahradit název trezoru klíčů v souboru názvem vašeho trezoru klíčů.
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
Kroky úkolu proveďte následovně:
- Správa tajných přihlašovacích údajů pro ověření pomocí Docker Hubu
- Ověřte se pomocí Docker Hubu předáním tajných kódů příkazu
docker login
. - Vytvořte image pomocí ukázkového souboru Dockerfile v úložišti Azure-Samples/acr-tasks .
- Nasdílejte image do privátního úložiště Docker Hubu.
Možnost 1: Vytvoření úlohy s identitou přiřazenou uživatelem
Kroky v této části vytvoří úlohu a povolí identitu přiřazenou uživatelem. Pokud chcete místo toho povolit identitu přiřazenou systémem, přečtěte si téma 2: Vytvoření úlohy s identitou přiřazenou systémem.
Vytvoření identity přiřazené uživatelem
Pomocí příkazu az identity create vytvořte ve svém předplatném identitu myACRTasksId. Můžete použít stejnou skupinu prostředků, kterou jste použili dříve k vytvoření registru kontejneru nebo jiné skupiny prostředků.
az identity create \
--resource-group myResourceGroup \
--name myACRTasksId
Pokud chcete nakonfigurovat identitu přiřazenou uživatelem v následujících krocích, pomocí příkazu az identity show uložte ID prostředku, ID objektu zabezpečení a ID klienta v proměnných.
# 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)
Vytvořit úkol
Vytvořte úlohu dockerhubtask spuštěním následujícího příkazu az acr task create . Úloha se spustí bez kontextu zdrojového kódu a příkaz odkazuje na soubor dockerhubtask.yaml
v pracovním adresáři. Parametr --assign-identity
předá ID prostředku identity přiřazené uživatelem.
az acr task create \
--name dockerhubtask \
--registry myregistry \
--context /dev/null \
--file dockerhubtask.yaml \
--assign-identity $resourceID
Ve výstupu příkazu se identity
v části zobrazuje identita typu UserAssigned
nastavená v úloze:
[...]
"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"
}
[...]
Udělení přístupu k identitě trezoru klíčů
Spuštěním následujícího příkazu az keyvault set-policy nastavte zásadu přístupu v trezoru klíčů. Následující příklad umožňuje identitě číst tajné kódy z trezoru klíčů.
az keyvault set-policy --name mykeyvault \
--resource-group myResourceGroup \
--object-id $principalID \
--secret-permissions get
Pokračujte ručním spuštěním úlohy.
Možnost 2: Vytvoření úlohy s identitou přiřazenou systémem
Kroky v této části vytvoří úlohu a povolí identitu přiřazenou systémem. Pokud chcete místo toho povolit identitu přiřazenou uživatelem, přečtěte si téma 1: Vytvoření úlohy s identitou přiřazenou uživatelem.
Vytvořit úkol
Vytvořte úlohu dockerhubtask spuštěním následujícího příkazu az acr task create . Úloha se spustí bez kontextu zdrojového kódu a příkaz odkazuje na soubor dockerhubtask.yaml
v pracovním adresáři. Parametr --assign-identity
bez hodnoty povoluje identitu přiřazenou systémem pro úlohu.
az acr task create \
--name dockerhubtask \
--registry myregistry \
--context /dev/null \
--file dockerhubtask.yaml \
--assign-identity
Ve výstupu příkazu se identity
v části zobrazuje identita typu SystemAssigned
nastavená v úloze. Je principalId
ID objektu zabezpečení identity úlohy:
[...]
"identity": {
"principalId": "xxxxxxxx-2703-42f9-97d0-xxxxxxxxxxxx",
"tenantId": "xxxxxxxx-86f1-41af-91ab-xxxxxxxxxxxx",
"type": "SystemAssigned",
"userAssignedIdentities": null
},
"location": "eastus",
[...]
Pomocí příkazu az acr task show uložte hodnotu principalId do proměnné, abyste ji mohli použít v pozdějších příkazech. Název úlohy a registru nahraďte následujícím příkazem:
principalID=$(az acr task show \
--name <task_name> --registry <registry_name> \
--query identity.principalId --output tsv)
Udělení přístupu k identitě trezoru klíčů
Spuštěním následujícího příkazu az keyvault set-policy nastavte zásadu přístupu v trezoru klíčů. Následující příklad umožňuje identitě číst tajné kódy z trezoru klíčů.
az keyvault set-policy --name mykeyvault \
--resource-group myResourceGroup \
--object-id $principalID \
--secret-permissions get
Ruční spuštění úlohy
Pokud chcete ověřit úspěšné spuštění úlohy, ve které jste povolili spravovanou identitu, spusťte úlohu ručně pomocí příkazu az acr task run . Parametr --set
slouží k předání názvu privátního úložiště úkolu. V tomto příkladu je zástupný název úložiště hubuser/hubrepo.
az acr task run --name dockerhubtask --registry myregistry --set PrivateRepo=hubuser/hubrepo
Po úspěšném spuštění úlohy se ve výstupu zobrazí úspěšné ověření do Docker Hubu a image se úspěšně sestaví a odešle do privátního úložiště:
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
Pokud chcete potvrdit, že se image nasdílí, zkontrolujte značku (cf24
v tomto příkladu) v privátním úložišti Docker Hubu.
Další kroky
- Přečtěte si další informace o povolení spravované identity v úloze ACR.
- Viz referenční informace k ACR Tasks YAML