Sdílet prostřednictvím


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říkazudocker 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 (cf24v tomto příkladu) v privátním úložišti Docker Hub.

Další kroky