Autentikasi eksternal dalam tugas ACR menggunakan identitas yang dikelola Azure

Dalam tugas ACR,Anda dapat mengaktifkan identitas terkelola untuk sumber daya Azure. Tugas ini dapat menggunakan identitas untuk mengakses sumber daya Azure lainnya, tanpa perlu menyediakan atau mengelola informasi masuk.

Dalam artikel ini, Anda mempelajari cara mengaktifkan identitas terkelola dalam tugas yang mengakses rahasia yang disimpan dalam Azure Key Vault.

Untuk membuat sumber daya Azure, artikel ini mengharuskan Anda menjalankan Azure CLI versi 2.0.68 atau yang lebih baru. Jalankan az --version untuk menemukan versinya. Jika Anda perlu menginstal atau memutakhirkan, lihat Menginstal Azure CLI.

Ringkasan skenario

Tugas contoh membaca informasi masuk Docker Hub yang disimpan dalam Azure Key Vault. Informasi masuk adalah untuk akun Docker Hub dengan izin tulis (pendorongan) ke repositori Docker Hub privat. Untuk membaca informasi masuk, Anda mengonfigurasi tugas dengan identitas terkelola dan menetapkan izin yang sesuai untuknya. Tugas yang terkait dengan identitas membangun citra, dan masuk ke Docker Hub untuk mendorong citra ke repo pribadi.

Contoh ini menunjukkan langkah-langkah cara menggunakan identitas terkelola yang ditetapkan pengguna atau yang ditetapkan sistem. Pilihan identitas Anda tergantung pada kebutuhan organisasi Anda.

Dalam skenario dunia nyata, sebuah perusahaan mungkin menerbitkan citra ke repo pribadi di Docker Hub sebagai bagian dari proses build.

Prasyarat

Anda memerlukan registri kontainer Azure tempat Anda menjalankan tugas. Dalam artikel ini, registri ini bernama myregistry. Ganti dengan nama registri Anda sendiri di langkah selanjutnya.

Jika Anda belum memiliki registri kontainer Azure, lihat Mulai Cepat: Membuat registri kontainer pribadi menggunakan Azure CLI. Anda belum perlu mendorong citra ke registri.

Anda juga memerlukan repositori privat di Docker Hub, dan akun Docker Hub dengan izin untuk menulis ke repo. Dalam contoh ini, repo ini diberi nama hubuser/hubrepo.

Membuat vault key dan menyimpan rahasia

Pertama, buat grup sumber daya bernama myResourceGroup di lokasi eastus dengan perintah buat grup az berikut:

az group create --name myResourceGroup --location eastus

Gunakan perintah buat az keyvault untuk membuat key vault. Pastikan untuk menentukan nama key vault yang unik.

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

Simpan informasi masuk Docker Hub yang diperlukan di key vault menggunakan perintah set rahasia az keyvault. Dalam perintah ini, nilai diteruskan dalam variabel lingkungan:

# 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

Dalam skenario dunia nyata, rahasia kemungkinan akan diatur dan dipelihara dalam proses terpisah.

Menentukan langkah-langkah tugas dalam file YAML

Langkah-langkah untuk contoh tugas ini didefinisikan dalam file YAML. Buat file bernama dockerhubtask.yaml dalam direktori kerja lokal dan tempelkan konten berikut. Pastikan untuk mengganti nama key vault dalam file dengan nama key vault Anda.

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

Langkah-langkah tugas melakukan hal berikut:

  • Mengelola informasi masuk rahasia untuk diautentikasi dengan Docker Hub.
  • Mengautentikasi dengan Docker Hub dengan meneruskan rahasia ke perintah docker login.
  • Membuat citra menggunakan sampel Dockerfile di repo Azure-Samples/acr-tasks.
  • Mendorong citra ke repositori Docker Hub privat.

Opsi 1: Membuat tugas dengan identitas yang ditetapkan pengguna

Langkah-langkah di bagian ini membuat tugas dan mengaktifkan identitas yang ditetapkan pengguna. Jika Anda ingin mengaktifkan identitas yang ditetapkan sistem, lihat Opsi 2: Membuat tugas dengan identitas yang ditetapkan sistem.

Membuat identitas terkelola yang ditetapkan pengguna

Buat identitas di langganan Anda bernama myACRTasksId menggunakan perintah buat identitas az. Anda dapat menggunakan grup sumber daya yang sama dengan yang Anda gunakan sebelumnya untuk membuat registri kontainer atau yang berbeda.

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

Untuk mengonfigurasi identitas yang ditetapkan pengguna dalam langkah-langkah berikut, gunakan perintah az identity show untuk menyimpan ID sumber daya, ID utama, dan ID klien identitas dalam variabel.

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

Membuat tugas

Buat tugas dockerhubtask dengan menjalankan perintah buat tugas az acr berikut. Tugas berjalan tanpa konteks kode sumber, dan perintah mereferensikan file dockerhubtask.yaml dalam direktori kerja. Parameter --assign-identity melewati ID sumber daya identitas yang ditetapkan pengguna.

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

Pada output perintah, bagian identity menunjukkan identitas jenis UserAssigned yang diatur dalam tugas:

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

Memberikan akses identitas ke key vault

Jalankan perintah set kebijakan az keyvault berikut untuk menetapkan kebijakan akses pada key vault. Contoh berikut memungkinkan identitas untuk membaca rahasia dari key vault.

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

Lanjutkan ke Menjalankan tugas secara manual.

Opsi 2: Membuat tugas dengan identitas yang ditetapkan sistem

Langkah-langkah di bagian ini membuat tugas dan mengaktifkan identitas yang ditetapkan sistem. Jika Anda ingin mengaktifkan identitas yang ditetapkan pengguna, lihat Opsi 1: Membuat tugas dengan identitas yang ditetapkan pengguna.

Membuat tugas

Buat tugas dockerhubtask dengan menjalankan perintah buat tugas az acr berikut. Tugas berjalan tanpa konteks kode sumber, dan perintah mereferensikan file dockerhubtask.yaml dalam direktori kerja. Parameter --assign-identity tanpa nilai mengaktifkan identitas yang ditetapkan sistem pada tugas.

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

Pada output perintah, bagian identity menunjukkan identitas jenis SystemAssigned yang diatur dalam tugas. principalId adalah ID utama dari identitas tugas:

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

Menggunakan perintah az acr task show untuk menyimpan Id utama dalam sebuah variabel, untuk digunakan dalam perintah selanjutnya. Mengganti nama tugas Anda dan registri Anda dengan perintah berikut:

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

Memberikan akses identitas ke key vault

Jalankan perintah set kebijakan az keyvault berikut untuk menetapkan kebijakan akses pada key vault. Contoh berikut memungkinkan identitas untuk membaca rahasia dari key vault.

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

Menjalankan tugas secara manual

Untuk memverifikasi bahwa tugas di mana Anda berhasil mengaktifkan identitas terkelola berjalan, picu tugas secara manual dengan perintah jalankan tugas az acr. Parameter --set digunakan untuk meneruskan nama repo privat ke tugas. Dalam contoh ini, nama repo placeholder adalah hubuser/hubrepo.

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

Ketika tugas berhasil berjalan, output menunjukkan autentikasi yang berhasil ke Docker Hub, dan citra berhasil dibuat dan didorong ke repo pribadi:

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

Untuk mengonfirmasi citra didorong, periksa tag (cf24 dalam contoh ini) di repo Docker Hub pribadi.

Langkah berikutnya