المصادقة عبر التسجيلات في مهمة ACR باستخدام هوية مُدارة من Azure

في مهمة ACR، يمكنك تمكين هوية موارد Azure. يمكن للمهمة استخدام الهوية للوصول إلى موارد Azure الأخرى، دون الحاجة إلى توفير معلومات تسجيل الدخول أو إدارتها.

في هذه المقالة، ستتعلم كيفية تمكين هوية مُدارة في مهمة ما لسحب صورة من سجل مختلف عن ذلك المستخدم لتشغيل المهمة.

لإنشاء موارد Azure، تتطلب هذه المقالة تشغيل Azure CLI الإصدار 2.0.68 أو إصدار لاحق. شغّل az --version للعثور على الإصدار. إذا كنت بحاجة إلى التثبيت أو الترقية، راجع تثبيت Azure CLI.

نظرة عامة على السيناريو

تسحب مهمة المثال الصورة الأساسية من Azure Container Registry آخر لإنشاء صورة تطبيق ودفعها. لسحب الصورة الأساسية، يمكنك تكوين المهمة بهوية مُدارة وتعيين الأذونات المناسبة لها.

يوضح هذا المثال الخطوات باستخدام هوية مُدارة مُعيَّنة من قِبل المستخدم أو مُعيَّنة من قِبل النظام. يعتمد اختيارك للهوية على احتياجات مؤسستك.

في سيناريو العالم الحقيقي، قد تحتفظ المؤسسة بمجموعة من الصور الأساسية التي تستخدمها جميع فرق التطوير لبناء تطبيقاتها. يتم تخزين هذه الصور الأساسية في سجل الشركة، مع امتلاك كل فريق تطوير حقوق سحب فقط.

المتطلبات الأساسية

لهذه المقالة، أنت بحاجة إلى اثنين من سجلات حاوية Azure:

  • يمكنك استخدام السجل الأول لإنشاء مهام ACR وتنفيذها. في هذه المقالة، يسمى هذا السجل myregistry.
  • يستضيف السجل الثاني صورة أساسية تُستخدم لمهمة إنشاء صورة. في هذه المقالة، تم تسمية السجل الثاني باسم mybaseregistry.

استبدل بأسماء السجل الخاصة بك في خطوات لاحقة.

إذا لم يكن لديك بالفعل سجلات حاوية Azure المطلوبة، فراجع Quickstart: إنشاء سجل حاوية خاص باستخدام Azure CLI. لا تحتاج إلى دفع الصور إلى التسجيل حتى الآن.

إعداد قاعدة التسجيل

لأغراض العرض التوضيحي، كعملية لمرة واحدة، قم بتشغيل [az acr import] [az-acr-import] لاستيراد صورة Node.js عامة من Docker Hub إلى السجل الأساسي. من الناحية العملية، قد يحتفظ فريق أو عملية أخرى في المؤسسة بالصور في السجل الأساسي.

az acr import --name mybaseregistry \
  --source docker.io/library/node:15-alpine \
  --image baseimages/node:15-alpine 

تحديد خطوات المهمة في ملف YAML

تم تحديد خطوات هذا المثال يتم تعريف المهمة متعددة الخطوات في ملف YAML. قم بإنشاء ملف باسم helloworldtask.yaml في دليل العمل المحلي والصق المحتويات التالية. قم بتحديث قيمة REGISTRY_NAME في خطوة الإنشاء باستخدام اسم الخادم الخاص بالسجل الأساسي.

version: v1.1.0
steps:
# Replace mybaseregistry with the name of your registry containing the base image
  - build: -t $Registry/hello-world:$ID  https://github.com/Azure-Samples/acr-build-helloworld-node.git#main -f Dockerfile-app --build-arg REGISTRY_NAME=mybaseregistry.azurecr.io
  - push: ["$Registry/hello-world:$ID"]

تستخدم خطوة الإنشاء ملف Dockerfile-app في Azure-Samples / acr-build-helloworld-node repo لإنشاء صورة. يشير --build-arg إلى السجل الأساسي لسحب الصورة الأساسية. عند الإنشاء بنجاح، يتم دفع الصورة إلى السجل المستخدم لتشغيل المهمة.

الخيار 1: إنشاء مهمة بهوية معينة من قِبل المستخدم

تُنشئ الخطوات الواردة في هذا القسم مهمة وتمكين الهوية المعينة من قِبل المستخدم. إذا كنت ترغب في تمكين الهوية المعينة من قِبل النظام بدلاً من ذلك، فراجع الخيار 2: إنشاء مهمة بالهوية المعينة من قِبل النظام.

إنشاء هوية يُعينها المستخدم

قم بإنشاء هوية باسم myACRTasksId في اشتراكك باستخدام الأمر az هوية إنشاء. يمكنك استخدام نفس مجموعة الموارد التي استخدمتها سابقاً لإنشاء سجل حاوية، أو سجل مختلف.

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

لتكوين الهوية المعينة من قِبل المستخدم في الخطوات التالية، استخدم الأمر az identity show لتخزين معرف مورد الهوية والمعرف الكياني ومعرف العميل في المتغيرات.

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

إنشاء مهمة

قم بإنشاء المهمة helloworldtask بتنفيذ الأمر التالي az acr task create. يتم تشغيل المهمة دون سياق التعليمة البرمجية المصدر، ويشير الأمر إلى الملف helloworldtask.yaml في دليل العمل. تمرر المعلمة --assign-identity معرف المورد للهوية المعينة من قِبل المستخدم.

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

في إخراج الأمر، يعرض القسم identity هوية النوع 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"
      }
[...]

امنح أذونات سحب الهوية للتسجيل الأساسي

في هذا القسم، امنح أذونات الهوية المدارة للسحب من السجل الأساسي، mybaseregistry.

استخدم الأمر az acr show للحصول على معرف المورد للتسجيل الأساسي وتخزينه في متغير:

baseregID=$(az acr show --name mybaseregistry --query id --output tsv)

استخدم الأمر إaz role assignment create لتعيين الدور acrpull للهوية إلى السجل الأساسي. هذا الدور له أذونات فقط لسحب الصور من التسجيل.

az role assignment create \
  --assignee $principalID \
  --scope $baseregID \
  --role acrpull

تابع إلى إضافة بيانات اعتماد السجل الهدف إلى المهمة.

الخيار 2: إنشاء مهمة بهوية مخصصة للنظام

تُنشئ الخطوات الواردة في هذا القسم مهمة وتمكين الهوية المعينة من قِبل النظام. إذا كنت ترغب في تمكين هوية معينة من قِبل المستخدم بدلاً من ذلك، فراجع الخيار 1: إنشاء مهمة بهوية معينة من قِبل المستخدم.

إنشاء مهمة

قم بإنشاء المهمة helloworldtask بتنفيذ الأمر التالي az acr task create. يتم تشغيل المهمة دون سياق التعليمة البرمجية المصدر، ويشير الأمر إلى الملف helloworldtask.yaml في دليل العمل. تعمل المعلمة --assign-identity دون قيمة على تمكين الهوية المعينة من قِبل النظام للمهمة.

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

في إخراج الأمر، يعرض القسم identity هوية من نوع SystemAssigned تم تعيينها في المهمة. principalId هو المعرف الرئيسي لهوية المهمة:

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

استخدم الأمر az acr Task show لتخزين principalId في متغير لاستخدامها في الأوامر اللاحقة. استبدل اسم مهمتك والسجل الخاص بك بالأمر التالي:

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

امنح أذونات سحب الهوية للتسجيل الأساسي

في هذا القسم، امنح أذونات الهوية المدارة للسحب من السجل الأساسي، mybaseregistry.

استخدم الأمر az acr show للحصول على معرف المورد للتسجيل الأساسي وتخزينه في متغير:

baseregID=$(az acr show --name mybaseregistry --query id --output tsv)

استخدم الأمر إaz role assignment create لتعيين الدور acrpull للهوية إلى السجل الأساسي. هذا الدور له أذونات فقط لسحب الصور من التسجيل.

az role assignment create \
  --assignee $principalID \
  --scope $baseregID \
  --role acrpull

إضافة أوراق اعتماد التسجيل الهدف إلى المهمة

استخدم الآن الأمر az acr task credential add لتمكين المهمة من المصادقة مع التسجيل الأساسي باستخدام بيانات اعتماد الهوية. قم بتشغيل الأمر المطابق لنوع الهوية المدارة التي قمت بتمكينها في المهمة. إذا قمت بتمكين هوية معينة من قِبل المستخدم، فمرر --use-identity بمعرف العميل الخاص بالهوية. إذا قمت بتمكين هوية مخصصة للنظام، فقم بتمرير --use-identity [system].

# Add credentials for user-assigned identity to the task
az acr task credential add \
  --name helloworldtask \
  --registry myregistry \
  --login-server mybaseregistry.azurecr.io \
  --use-identity $clientID

# Add credentials for system-assigned identity to the task
az acr task credential add \
  --name helloworldtask \
  --registry myregistry \
  --login-server mybaseregistry.azurecr.io \
  --use-identity [system]

قم بتشغيل المهمة يدويّاً

للتحقق من أن المهمة التي قمت فيها بتمكين هوية مُدارة تعمل بنجاح، قم بتشغيل المهمة يدويّاً باستخدام الأمر az acr task run.

az acr task run \
  --name helloworldtask \
  --registry myregistry

في حالة تشغيل المهمة بنجاح، يكون الإخراج مشابهاً لما يلي:

Queued a run with ID: cf10
Waiting for an agent...
2019/06/14 22:47:32 Using acb_vol_dbfbe232-fd76-4ca3-bd4a-687e84cb4ce2 as the home volume
2019/06/14 22:47:39 Creating Docker network: acb_default_network, driver: 'bridge'
2019/06/14 22:47:40 Successfully set up Docker network: acb_default_network
2019/06/14 22:47:40 Setting up Docker configuration...
2019/06/14 22:47:41 Successfully set up Docker configuration
2019/06/14 22:47:41 Logging in to registry: myregistry.azurecr.io
2019/06/14 22:47:42 Successfully logged into myregistry.azurecr.io
2019/06/14 22:47:42 Logging in to registry: mybaseregistry.azurecr.io
2019/06/14 22:47:43 Successfully logged into mybaseregistry.azurecr.io
2019/06/14 22:47:43 Executing step ID: acb_step_0. Timeout(sec): 600, Working directory: '', Network: 'acb_default_network'
2019/06/14 22:47:43 Scanning for dependencies...
2019/06/14 22:47:45 Successfully scanned dependencies
2019/06/14 22:47:45 Launching container with name: acb_step_0
Sending build context to Docker daemon   25.6kB
Step 1/6 : ARG REGISTRY_NAME
Step 2/6 : FROM ${REGISTRY_NAME}/baseimages/node:15-alpine
15-alpine: Pulling from baseimages/node
[...]
Successfully built 41b49a112663
Successfully tagged myregistry.azurecr.io/hello-world:cf10
2019/06/14 22:47:56 Successfully executed container: acb_step_0
2019/06/14 22:47:56 Executing step ID: acb_step_1. Timeout(sec): 600, Working directory: '', Network: 'acb_default_network'
2019/06/14 22:47:56 Pushing image: myregistry.azurecr.io/hello-world:cf10, attempt 1
The push refers to repository [myregistry.azurecr.io/hello-world]
[...]
2019/06/14 22:48:00 Step ID: acb_step_1 marked as successful (elapsed time in seconds: 2.517011)
2019/06/14 22:48:00 The following dependencies were found:
2019/06/14 22:48:00
- image:
    registry: myregistry.azurecr.io
    repository: hello-world
    tag: cf10
    digest: sha256:611cf6e3ae3cb99b23fadcd89fa144e18aa1b1c9171ad4a0da4b62b31b4e38d1
  runtime-dependency:
    registry: mybaseregistry.azurecr.io
    repository: baseimages/node
    tag: 15-alpine
    digest: sha256:e8e92cffd464fce3be9a3eefd1b65dc9cbe2484da31c11e813a4effc6105c00f
  git:
    git-head-revision: 0f988779c97fe0bfc7f2f74b88531617f4421643

Run ID: cf10 was successful after 32s

قم بتشغيل الأمر az acr repository show-tags للتحقق من أن الصورة التي تم إنشاؤها قد تم دفعها بنجاح إلى myregistry:

az acr repository show-tags --name myregistry --repository hello-world --output tsv

مثال على الإخراج:

cf10

الخطوات التالية