Externí ověřování v úloze ACR s využitím spravované identity Azure
V úloze ACR můžete povolit spravovanou identitu pro prostředky Azure. Úloha může identitu použít pro přístup k dalším prostředkům Azure, aniž by potřebovala 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.
K vytvoření prostředků Azure tento článek vyžaduje, abyste spustili 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á úloha přečte Docker Hub přihlašovací údaje uložené v trezoru klíčů Azure. Přihlašovací údaje jsou pro účet Docker Hub s oprávněním k zápisu (nabízení) k privátnímu úložišti Docker Hub. 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ě sestaví image a přihlásí se k Docker Hub, aby se image odeslala do privátního úložiště.
Tento příklad ukazuje postup použití spravované identity přiřazené uživatelem nebo systémem. Vaše volba identity závisí na potřebách vaší organizace.
V reálném scénáři může společnost publikovat image do soukromého úložiště v Docker Hub jako součást procesu sestavení.
Požadavky
Potřebujete registr kontejneru Azure, ve kterém úlohu spustíte. V tomto článku má tento registr název myregistry. V pozdějších krocích nahraďte vlastním názvem registru.
Pokud ještě nemáte registr kontejneru Azure, přečtěte si rychlý start: Vytvoření privátního registru kontejnerů pomocí Azure CLI. Image do registru ještě nemusíte nasdílovat.
Potřebujete také privátní úložiště v Docker Hub a účet Docker Hub 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 uložení tajných kódů
Pokud potřebujete, nejprve 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
K vytvoření trezoru klíčů použijte příkaz az keyvault create . Nezapomeňte zadat jedinečný název trezoru klíčů.
az keyvault create --name mykeyvault --resource-group myResourceGroup --location eastus
Uložte požadované přihlašovací údaje Docker Hub v trezoru klíčů pomocí příkazu az keyvault secret set. 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 se tajné kódy pravděpodobně nastavovaly a udržovaly v samostatném procesu.
Definování kroků úkolu v souboru YAML
Kroky pro tento ukázkový úkol 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 úlohy dělají toto:
- Správa tajných přihlašovacích údajů pro ověřování pomocí Docker Hub
- Ověření pomocí Docker Hub předáním tajných kódů příkazu
docker login
. - Sestavte image pomocí ukázkového souboru Dockerfile v úložišti Azure-Samples/acr-tasks .
- Nasdílíte image do privátního úložiště Docker Hub.
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 místo toho chcete povolit identitu přiřazenou systémem, podívejte se na možnost 2: Vytvoření úlohy s identitou přiřazenou systémem.
Vytvoření identity přiřazené uživatelem
Ve svém předplatném vytvořte identitu myACRTasksId pomocí příkazu az identity create . Můžete použít stejnou skupinu prostředků, kterou jste použili dříve k vytvoření registru kontejneru, nebo jinou.
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 identity, ID objektu zabezpečení a ID klienta do 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 úlohu
Spuštěním následujícího příkazu az acr task create vytvořte úlohu dockerhubtask. Úloha běží 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 identity
příkazu oddíl ukazuje, že je v úloze nastavená identita typu UserAssigned
:
[...]
"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 identitě k trezoru klíčů
Spuštěním následujícího příkazu az keyvault set-policy nastavte zásady přístupu pro trezor 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
Přejděte k ručnímu spuštění ú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 místo toho chcete povolit identitu přiřazenou uživatelem, podívejte se na možnost 1: Vytvoření úlohy s identitou přiřazenou uživatelem.
Vytvořit úlohu
Spuštěním následujícího příkazu az acr task create vytvořte úlohu dockerhubtask. Úloha běží bez kontextu zdrojového kódu a příkaz odkazuje na soubor dockerhubtask.yaml
v pracovním adresáři. Parametr --assign-identity
bez hodnoty umožňuje v úloze identitu přiřazenou systémem.
az acr task create \
--name dockerhubtask \
--registry myregistry \
--context /dev/null \
--file dockerhubtask.yaml \
--assign-identity
Ve výstupu identity
příkazu oddíl ukazuje, že je v úloze nastavená identita typu SystemAssigned
. 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 principalId do proměnné, abyste ho mohli použít v pozdějších příkazech. V následujícím příkazu nahraďte název úlohy a registru:
principalID=$(az acr task show \
--name <task_name> --registry <registry_name> \
--query identity.principalId --output tsv)
Udělení přístupu identitě k trezoru klíčů
Spuštěním následujícího příkazu az keyvault set-policy nastavte zásady přístupu pro trezor 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, jestli se úloha, ve které jste povolili spravovanou identitu, úspěšně spustila, aktivujte ji ručně pomocí příkazu az acr task run . Parametr --set
se používá k předání názvu privátního úložiště úloze. 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í Docker Hub a image se úspěšně sestaví a nasdílí 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 Hub.
Další kroky
- Přečtěte si další informace o povolení spravované identity v úloze ACR.
- Projděte si referenční informace k ACR Tasks YAML.