Externe verificatie in een ACR-taak met behulp van een door Azure beheerde identiteit

In een ACR-taak kunt u een beheerde identiteit inschakelen voor Azure-resources. De taak kan de identiteit gebruiken voor toegang tot andere Azure-resources, zonder referenties op te geven of te beheren.

In dit artikel leert u hoe u een beheerde identiteit inschakelt in een taak die toegang heeft tot geheimen die zijn opgeslagen in een Azure-sleutelkluis.

Voor het maken van de Azure-resources moet u voor dit artikel Azure CLI versie 2.0.68 of hoger uitvoeren. Voer az --version uit om de versie te bekijken. Zie Azure CLI installeren als u de CLI wilt installeren of een upgrade wilt uitvoeren.

Overzicht van scenario's

De voorbeeldtaak leest Docker Hub referenties die zijn opgeslagen in een Azure-sleutelkluis. De referenties zijn voor een Docker Hub-account met schrijfmachtigingen (push) voor een privé-Docker Hub opslagplaats. Als u de referenties wilt lezen, configureert u de taak met een beheerde identiteit en wijst u de juiste machtigingen toe. Met de taak die aan de identiteit is gekoppeld, wordt een installatiekopieën gemaakt en wordt u aangemeld bij Docker Hub om de installatiekopieën naar de privéopslagplaats te pushen.

In dit voorbeeld ziet u stappen met behulp van een door de gebruiker toegewezen of door het systeem toegewezen beheerde identiteit. Uw keuze van identiteit is afhankelijk van de behoeften van uw organisatie.

In een praktijkscenario kan een bedrijf afbeeldingen publiceren naar een privéopslagplaats in Docker Hub als onderdeel van een bouwproces.

Vereisten

U hebt een Azure-containerregister nodig waarin u de taak uitvoert. In dit artikel heet dit register myregistry. Vervang in latere stappen door uw eigen registernaam.

Als u nog geen Azure-containerregister hebt, raadpleegt u Quickstart: Een privécontainerregister maken met behulp van de Azure CLI. U hoeft nog geen installatiekopieën naar het register te pushen.

U hebt ook een privéopslagplaats in Docker Hub nodig en een Docker Hub-account met machtigingen om naar de opslagplaats te schrijven. In dit voorbeeld heet deze opslagplaats hubuser/hubrepo.

Een sleutelkluis maken en geheimen opslaan

Maak eerst, indien nodig, een resourcegroep met de naam myResourceGroup op de locatie eastus met de volgende opdracht az group create :

az group create --name myResourceGroup --location eastus

Gebruik de opdracht az keyvault create om een sleutelkluis te maken. Zorg ervoor dat u een unieke naam voor de sleutelkluis opgeeft.

az keyvault create --name mykeyvault --resource-group myResourceGroup --location eastus

Sla de vereiste Docker Hub referenties op in de sleutelkluis met behulp van de opdracht az keyvault secret set. In deze opdrachten worden de waarden doorgegeven in omgevingsvariabelen:

# 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

In een praktijkscenario worden geheimen waarschijnlijk in een afzonderlijk proces ingesteld en onderhouden.

Taakstappen definiëren in YAML-bestand

De stappen voor deze voorbeeldtaak worden gedefinieerd in een YAML-bestand. Maak een bestand met de naam dockerhubtask.yaml in een lokale werkmap en plak de volgende inhoud. Zorg ervoor dat u de naam van de sleutelkluis in het bestand vervangt door de naam van uw sleutelkluis.

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

De taakstappen doen het volgende:

  • Geheime referenties beheren om te verifiëren met Docker Hub.
  • Verifieer met Docker Hub door de geheimen door te geven aan de docker login opdracht .
  • Bouw een installatiekopieën met behulp van een Docker-voorbeeldbestand in de opslagplaats Azure-Samples/acr-tasks .
  • Push de installatiekopieën naar de privéopslagplaats Docker Hub.

Optie 1: Taak maken met een door de gebruiker toegewezen identiteit

Met de stappen in deze sectie wordt een taak gemaakt en wordt een door de gebruiker toegewezen identiteit ingeschakeld. Als u in plaats daarvan een door het systeem toegewezen identiteit wilt inschakelen, raadpleegt u Optie 2: Taak maken met door het systeem toegewezen identiteit.

Een door de gebruiker toegewezen identiteit maken

Maak een identiteit met de naam myACRTasksId in uw abonnement met behulp van de opdracht az identity create . U kunt dezelfde resourcegroep gebruiken die u eerder hebt gebruikt om een containerregister te maken, of een andere.

az identity create \
  --resource-group myResourceGroup \
  --name myACRTasksId

Als u de door de gebruiker toegewezen identiteit in de volgende stappen wilt configureren, gebruikt u de opdracht az identity show om de resource-id, principal-id en client-id van de identiteit op te slaan in variabelen.

# 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)

Taak maken

Maak de taak dockerhubtask door de volgende opdracht az acr task create uit te voeren. De taak wordt uitgevoerd zonder broncodecontext en de opdracht verwijst naar het bestand dockerhubtask.yaml in de werkmap. De --assign-identity parameter geeft de resource-id van de door de gebruiker toegewezen identiteit door.

az acr task create \
  --name dockerhubtask \
  --registry myregistry \
  --context /dev/null \
  --file dockerhubtask.yaml \
  --assign-identity $resourceID

In de uitvoer van de opdracht ziet u in de identity sectie dat de identiteit van het type UserAssigned is ingesteld in de taak:

[...]
"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"
      }
[...]

Identiteit toegang verlenen tot sleutelkluis

Voer de volgende opdracht az keyvault set-policy uit om een toegangsbeleid in te stellen voor de sleutelkluis. In het volgende voorbeeld kan de identiteit geheimen lezen uit de sleutelkluis.

az keyvault set-policy --name mykeyvault \
  --resource-group myResourceGroup \
  --object-id $principalID \
  --secret-permissions get

Ga verder met De taak handmatig uitvoeren.

Optie 2: Een taak maken met een door het systeem toegewezen identiteit

Met de stappen in deze sectie maakt u een taak en schakelt u een door het systeem toegewezen identiteit in. Als u in plaats daarvan een door de gebruiker toegewezen identiteit wilt inschakelen, raadpleegt u Optie 1: Taak maken met een door de gebruiker toegewezen identiteit.

Taak maken

Maak de taak dockerhubtask door de volgende opdracht az acr task create uit te voeren. De taak wordt uitgevoerd zonder broncodecontext en de opdracht verwijst naar het bestand dockerhubtask.yaml in de werkmap. De --assign-identity parameter zonder waarde maakt de door het systeem toegewezen identiteit voor de taak mogelijk.

az acr task create \
  --name dockerhubtask \
  --registry myregistry \
  --context /dev/null \
  --file dockerhubtask.yaml \
  --assign-identity 

In de uitvoer van de opdracht toont de identity sectie een identiteit van het type SystemAssigned dat is ingesteld in de taak. De principalId is de principal-id van de taak-id:

[...]
  "identity": {
    "principalId": "xxxxxxxx-2703-42f9-97d0-xxxxxxxxxxxx",
    "tenantId": "xxxxxxxx-86f1-41af-91ab-xxxxxxxxxxxx",
    "type": "SystemAssigned",
    "userAssignedIdentities": null
  },
  "location": "eastus",
[...]

Gebruik de opdracht az acr task show om de principalId op te slaan in een variabele, voor gebruik in latere opdrachten. Vervang de naam van uw taak en het register in de volgende opdracht:

principalID=$(az acr task show \
  --name <task_name> --registry <registry_name> \
  --query identity.principalId --output tsv)

Identiteit toegang verlenen tot sleutelkluis

Voer de volgende opdracht az keyvault set-policy uit om een toegangsbeleid in te stellen voor de sleutelkluis. In het volgende voorbeeld kan de identiteit geheimen lezen uit de sleutelkluis.

az keyvault set-policy --name mykeyvault \
  --resource-group myResourceGroup \
  --object-id $principalID \
  --secret-permissions get

De taak handmatig uitvoeren

Als u wilt controleren of de taak waarin u een beheerde identiteit hebt ingeschakeld, met succes wordt uitgevoerd, activeert u de taak handmatig met de opdracht az acr task run . De --set parameter wordt gebruikt om de naam van de privéopslagplaats door te geven aan de taak. In dit voorbeeld is de naam van de tijdelijke aanduiding voor de opslagplaats hubuser/hubrepo.

az acr task run --name dockerhubtask --registry myregistry --set PrivateRepo=hubuser/hubrepo

Wanneer de taak is uitgevoerd, toont de uitvoer een geslaagde verificatie voor Docker Hub en wordt de installatiekopie gebouwd en naar de privéopslagplaats gepusht:

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

Als u wilt controleren of de afbeelding is gepusht, controleert u op de tag (cf24in dit voorbeeld) in de privéopslagplaats Docker Hub.

Volgende stappen