استخدام هوية مُدارة يعينها المستخدم لحساب Azure Automation

توضح لك هذه المقالة كيفية إضافة الهوية المُدارة التي يعينها المستخدم لحساب Azure Automation، وكيفية استخدامها للوصول إلى الموارد الأخرى. لمزيد من المعلومات حول كيفية عمل الهويات المدارة مع Azure Automation، راجع الهويات المدارة.

إشعار

لا يمكن استخدام هوية مدارة معينة من قبل المستخدم على Hybrid Runbook Worker عند إنشاء هوية مدارة (إما النظام أو المستخدم المعين) لحساب التنفيذ التلقائي. إذا لم يتم تعيين الهوية المدارة إلى حساب التنفيذ التلقائي، فمن الممكن استخدام نظام الجهاز الظاهري أو الهوية المدارة المعينة من قبل المستخدم على Hybrid Runbook Worker وهو جهاز Azure ظاهري مع الهويات المدارة المعينة.

في حال لم يكن لديك اشتراك Azure، فأنشئ حساباً مجانيّاً قبل البدء.

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

  • حساب التنفيذ التلقائي في Azure. للحصول على التعليمات، راجع إنشاء حساب التنفيذ التلقائي في Azure.

  • يمكن أن تكون الهوية المدارة المعينة من قبل المستخدم وموارد Azure المستهدفة التي يديرها دفتر التشغيل الخاص بك باستخدام هذه الهوية في اشتراكات Azure مختلفة.

  • الإصدار الأحدث من وحدات Azure Account. حالياً هو 2.2.8. (راجع Az.Accounts للحصول على تفاصيل عن هذا الإصدار.)

  • مورد Azure الذي تريد الوصول إليه من دفتر التشغيل التنفيذ الخاص بك. يحتاج هذا المورد إلى دور معرف للهوية المُدارة التي يعينها المستخدم، مما يساعد دفتر تشغيل Automation على مصادقة الوصول إلى المورد. لإضافة أدوار، يجب أن تكون مالكا للمورد في مستأجر Microsoft Entra المقابل.

  • لتعيين دور Azure، يجب أن يكون لديك Microsoft.Authorization/roleAssignments/write أذونات، مثل وصول المستخدم مسؤول istrator أو المالك.

بادر بإضافة الهوية المُدارة التي يعينها المستخدم لحساب Azure Automation

يمكنك إضافة الهوية المُدارة التي يعينها المستخدم لحساب Azure Automation باستخدام مدخل Azure أو PowerShell أو واجهة برمجة تطبيقات REST Azure أو قالب ARM. بالنسبة إلى الأمثلة التي تتضمن PowerShell، قم أولاً بتسجيل الدخول إلى Azure بشكل تفاعلي باستخدام الأمر Connect-AzAccount واتبع الإرشادات.

# Sign in to your Azure subscription
$sub = Get-AzSubscription -ErrorAction SilentlyContinue
if(-not($sub))
{
    Connect-AzAccount
}

# If you have multiple subscriptions, set the one to use
# Select-AzSubscription -SubscriptionId "<SUBSCRIPTIONID>"

ثم قم بتهيئة مجموعة من المتغيرات التي سيتم استخدامها في جميع الأمثلة. راجع القيم أدناه ثم بادر بالتنفيذ"

$subscriptionID = "subscriptionID"
$resourceGroup = "resourceGroupName"
$automationAccount = "automationAccountName"
$userAssignedOne = "userAssignedIdentityOne"
$userAssignedTwo = "userAssignedIdentityTwo"

إضافة باستخدام مدخل Azure

قم بإجراء الخطوات التالية:

  1. قم بتسجيل الدخول إلى بوابة Azure.

  2. في مدخل Azure، انتقل إلى حساب Automation خاصتك.

  3. ضمن Account الإعدادات، حدد Identity.

  4. حدد علامة التبويب مُعين بواسطة المستخدم ثم حدد إضافة.

  5. حدد هويتك المُدارة الحالية التي يعينها المستخدم ثم حدد إضافة. ثم سيتم إرجاعك إلى علامة التبويب تعيين المستخدم.

    Output from Portal.

إضافة باستخدام PowerShell

استخدام أمر PowerShell cmdlet Set-AzAutomationAccount لإضافة الهويات المُدارة التي يعينها المستخدم. يجب أن تفكر أولاً في ما إذا كان هناك هوية مُدارة حالية يعينها النظام. يضيف المثال أدناه هويتين مُدارتين حاليتين يعينهما المستخدم إلى حساب Automation موجود، وسيعطل الهوية المُدارة التي يعينها النظام إن وجدت.

$output = Set-AzAutomationAccount `
    -ResourceGroupName $resourceGroup `
    -Name $automationAccount `
    -AssignUserIdentity "/subscriptions/$subscriptionID/resourcegroups/$resourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$userAssignedOne", `
        "/subscriptions/$subscriptionID/resourcegroups/$resourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$userAssignedTwo"

$output

للاحتفاظ بهوية مُدارة حالية يعينها النظام، استخدم ما يلي:

$output = Set-AzAutomationAccount `
    -ResourceGroupName $resourceGroup `
    -Name $automationAccount `
    -AssignUserIdentity "/subscriptions/$subscriptionID/resourcegroups/$resourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$userAssignedOne", `
        "/subscriptions/$subscriptionID/resourcegroups/$resourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$userAssignedTwo" `
    -AssignSystemIdentity

$output

يجب أن يبدو الإخراج مشابهًا لما يلي:

Output from Set-AzAutomationAccount command.

لإخراج إضافي، بادر بتنفيذ: $output.identity | ConvertTo-Json.

إضافة باستخدام واجهة برمجة تطبيقات REST

توفير بناء الجملة والخطوات كالمثال أدناه.

بناء الجملة

يمكّن نموذج بناء الجملة للنص الأساسي أدناه الهوية المُدارة التي يعينها النظام في حالة عدم تمكينها بالفعل وتعيين هويتين مُدارتين يعينهما المستخدم لحساب Automation الحالي.

PATCH

{
  "identity": {
    "type": "SystemAssigned, UserAssigned",
    "userAssignedIdentities": {
      "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/resource-group-name/providers/Microsoft.ManagedIdentity/userAssignedIdentities/firstIdentity": {},
      "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/resource-group-name/providers/Microsoft.ManagedIdentity/userAssignedIdentities/secondIdentity": {}
    }
  }
}

بناء جملة API كما يلي:

https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/resource-group-name/providers/Microsoft.Automation/automationAccounts/automation-account-name?api-version=2020-01-13-preview 

مثال

قم بإجراء الخطوات التالية.

  1. راجع بناء الجملة للنص الأساسي أعلاه إلى ملف يُسمى body_ua.json. احفظ الملف على جهازك المحلي أو في حساب تخزين Azure.

  2. راجع قيمة المتغير أدناه ثم نفِّذ.

    $file = "path\body_ua.json"
    
  3. يستخدم هذا المثال أمر PowerShell cmdlet Invoke-RestMethod لإرسال طلب PATCH إلى حساب Automation خاصتك.

    # build URI
    $URI = "https://management.azure.com/subscriptions/$subscriptionID/resourceGroups/$resourceGroup/providers/Microsoft.Automation/automationAccounts/$automationAccount`?api-version=2020-01-13-preview"
    
    # build body
    $body = Get-Content $file
    
    # obtain access token
    $azContext = Get-AzContext
    $azProfile = [Microsoft.Azure.Commands.Common.Authentication.Abstractions.AzureRmProfileProvider]::Instance.Profile
    $profileClient = New-Object -TypeName Microsoft.Azure.Commands.ResourceManager.Common.RMProfileClient -ArgumentList ($azProfile)
    $token = $profileClient.AcquireAccessToken($azContext.Subscription.TenantId)
    $authHeader = @{
        'Content-Type'='application/json'
        'Authorization'='Bearer ' + $token.AccessToken
    }
    
    # Invoke the REST API
    $response = Invoke-RestMethod -Uri $URI -Method PATCH -Headers $authHeader -Body $body
    
    # Review output
    $response.identity | ConvertTo-Json
    

    يجب أن يبدو الإخراج مشابهًا لما يلي:

    {
    "type": "SystemAssigned, UserAssigned",
    "principalId": "00000000-0000-0000-0000-000000000000",
    "tenantId": "00000000-0000-0000-0000-000000000000",
    "userAssignedIdentities":  {
        "/subscriptions/ContosoID/resourcegroups/ContosoLab/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ContosoUAMI1":  {
                "PrincipalId":  "00000000-0000-0000-0000-000000000000",
                "ClientId":  "00000000-0000-0000-0000-000000000000"
                    },
        "/subscriptions/ContosoID/resourcegroups/ContosoLab/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ContosoUAMI2":  {
                "PrincipalId":  "00000000-0000-0000-0000-000000000000",
                "ClientId":  "00000000-0000-0000-0000-000000000000"
                    }
        }
    }
    

التوزيع باستخدام قالب ARM

توفير بناء الجملة والخطوات كالمثال أدناه.

بناء جملة القالب

يمكّن نموذج قالب بناء الجملة أدناه الهوية المُدارة التي يعينها النظام في حالة عدم تمكينها بالفعل وتعيين هويتين مُدارتين يعينهما المستخدم لحساب Automation الحالي.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "automationAccountName": {
     "defaultValue": "YourAutomationAccount",
      "type": "String",
      "metadata": {
        "description": "Automation account name"
      }
    },
    "userAssignedOne": {
     "defaultValue": "userAssignedOne",
      "type": "String",
      "metadata": {
        "description": "User-assigned managed identity"
      }
	  },
    "userAssignedTwo": {
     "defaultValue": "userAssignedTwo",
      "type": "String",
      "metadata": {
        "description": "User-assigned managed identity"
      }
	  }
   },
  "resources": [
    {
      "type": "Microsoft.Automation/automationAccounts",
      "apiVersion": "2020-01-13-preview",
      "name": "[parameters('automationAccountName')]",
      "location": "[resourceGroup().location]",
      "identity": {
        "type": "SystemAssigned, UserAssigned",
        "userAssignedIdentities": {
          "[resourceID('Microsoft.ManagedIdentity/userAssignedIdentities/',parameters('userAssignedOne'))]": {},
          "[resourceID('Microsoft.ManagedIdentity/userAssignedIdentities/',parameters('userAssignedTwo'))]": {}
        }
      },
      "properties": {
        "sku": {
          "name": "Basic"
        },
        "encryption": {
          "keySource": "Microsoft.Automation",
          "identity": {}
        }
      }
    }
  ]
}

مثال

قم بإجراء الخطوات التالية.

  1. نسخ القالب ولصقه في ملف يُسمى template_ua.json. احفظ الملف على جهازك المحلي أو في حساب تخزين Azure.

  2. راجع قيمة المتغير أدناه ثم نفِّذ.

    $templateFile = "path\template_ua.json"
    
  3. استخدام PowerShell cmdlet جديد AzResourceGroupDeploymentلتوزيع القالب.

    New-AzResourceGroupDeployment `
        -Name "UserAssignedDeployment" `
        -ResourceGroupName $resourceGroup `
        -TemplateFile $templateFile `
        -automationAccountName $automationAccount `
        -userAssignedOne $userAssignedOne `
        -userAssignedTwo $userAssignedTwo
    

    الأمر لن ينتج إخراجاً ومع ذلك، يمكنك استخدام التعليمة البرمجية أدناه للتحقق:

    (Get-AzAutomationAccount `
    -ResourceGroupName $resourceGroup `
    -Name $automationAccount).Identity | ConvertTo-Json
    

    سيبدو الإخراج مشابهاً للإخراج المُوضَّح لمثال واجهة برمجة تطبيقات REST، أعلاه.

تعيين دور للهوية المُدارة المعينة من قبل المستخدم

يمكن لحساب التنفيذ التلقائي استخدام الهوية المدارة المعينة من قبل المستخدم للحصول على رموز مميزة للوصول إلى الموارد الأخرى المحمية بواسطة معرف Microsoft Entra، مثل Azure Key Vault. لا تمثل هذه الرموز المميزة أي مستخدم محدد للتطبيق. بدلاً من ذلك، تمثل التطبيق الذي يمكنه الوصول إلى المورد. في هذه الحالة، على سبيل المثال، يمثل الرمز المميز حساب Automation.

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

اتبع مبدأ الامتياز الأقل وبادر بتعيين الأذونات المطلوبة بعنايةٍ فقط لتنفيذ دفتر التشغيل. على سبيل المثال، إذا كان حساب Automation مطلوبًا فقط لبدء أو إيقاف Azure VM، فإن الأذونات المعينة لحساب "تشغيل باسم" أو الهوية المُدارة يجب أن تكون فقط لبدء تشغيل الجهاز الظاهري أو إيقافه. وبالمثل، إذا كان دفتر التشغيل يقرأ من تخزين كائن ثنائي كبير الحجم، فقم بتعيين أذونات القراءة فقط.

يستخدم هذا المثال Azure PowerShell لإظهار كيفية تعيين دور المساهم في الاشتراك إلى مورد حساب Azure المستهدف. يُستخدم دور المساهم باعتباره مثالاً، وقد يكون مطلوبًا أو غير مطلوب في حالتك. بدلاً من ذلك، يمكنك أيضاً تعيين الدور إلى مورد Azure المستهدف في مدخل Azure.

New-AzRoleAssignment `
    -ObjectId <automation-Identity-object-id> `
    -Scope "/subscriptions/<subscription-id>" `
    -RoleDefinitionName "Contributor"

التحقق من تعيين الدور إلى هوية يديرها المستخدم

للتحقق من دور إلى هوية مدارة معينة من قبل المستخدم لحساب التنفيذ التلقائي، اتبع الخطوات التالية:

  1. قم بتسجيل الدخول إلى بوابة Azure.

  2. انقل حساب التشغيل التلقائي الخاص بك.

  3. ضمن Account الإعدادات، حدد Identity، User assigned.

  4. انقر فوق اسم الهوية المعينة من قبل المستخدم.

    Assigning role in user-assigned identity in Azure portal.

    إذا تم تعيين الأدوار بالفعل إلى الهوية المدارة المحددة المعينة من قبل المستخدم، يمكنك مشاهدة قائمة بتعيينات الأدوار. تتضمن هذه القائمة جميع تعيينات الأدوار التي لديك الإذن بقراءتها.

    View role-assignments that you have permission in Azure portal.

  5. لتغيير الاشتراك، انقر فوق القائمة المنسدلة Subscription وحدد الاشتراك المناسب.

  6. انقر فوق إضافة تعيين دور (معاينة)

  7. في القائمة المنسدلة، حدد مجموعة الموارد التي يطبقها تعيين الدور - الاشتراك ومجموعة الموارد والدور والنطاق.
    إذا لم يكن لديك تعيين الدور، يمكنك عرض أذونات الكتابة للنطاق المحدد كرسالة مضمنة.

  8. في القائمة المنسدلة Role، حدد دورا كمساهم في الجهاز الظاهري.

  9. انقر فوق حفظ.

    Add a role assignment in Azure portal.

بعد بضع دقائق، يتم تعيين الهوية المدارة للدور في النطاق المحدد.

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

بعد أن تمكِّن الهوية المُدارة التي يعينها المستخدم لحساب Automation خاصتك وإعطاء هوية الوصول إلى المورد الهدف، يمكنك تحديد هذه الهوية في دفاتر التشغيل مقابل الموارد التي تدعم الهوية المُدارة. للحصول على دعم الهوية، استخدم الأمر Az cmdlet Connect-AzAccount.

# Ensures you do not inherit an AzContext in your runbook
Disable-AzContextAutosave -Scope Process

# Connect to Azure with user-assigned managed identity
$AzureContext = (Connect-AzAccount -Identity -AccountId <user-assigned-identity-ClientId>).context

# set and store context
$AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription -DefaultProfile $AzureContext

إنشاء الرمز المميز للوصول دون استخدام أوامر Azure cmdlets

بالنسبة إلى HTTP Endpoints، تأكد مما يلي.

  • يجب أن يكون عنوان بيانات التعريف موجودًا ويجب تعيينه إلى "صحيح".
  • ينبغي تمرير مورد مع الطلب كمعلمة استعلام لطلب GET وكبيانات نموذج لطلب POST.
  • تعيين قيمة متغير البيئة IDENTITY_HEADER إلى X-IDENTITY-HEADER.
  • يجب أن يكون نوع المحتوى لطلب Post application/x-www-form-urlencoded.

الحصول على الرمز المميز للوصول للهوية المُدارة التي يعينها المستخدم باستخدام HTTP Get

$resource= "?resource=https://management.azure.com/"
$client_id="&client_id=<ClientId of USI>"
$url = $env:IDENTITY_ENDPOINT + $resource + $client_id 
$Headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"  
$Headers.Add("Metadata", "True")
$headers.Add("X-IDENTITY-HEADER", $env:IDENTITY_HEADER) 
$accessToken = Invoke-RestMethod -Uri $url -Method 'GET' -Headers $Headers
Write-Output $accessToken.access_token 

الحصول على الرمز المميز للوصول للهوية المُدارة التي يعينها المستخدم باستخدام HTTP Post

$url = $env:IDENTITY_ENDPOINT
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("Metadata", "True")
$headers.Add("X-IDENTITY-HEADER", $env:IDENTITY_HEADER) 
$body = @{'resource'='https://management.azure.com/' 
'client_id'='<ClientId of USI>'}
$accessToken = Invoke-RestMethod $url -Method 'POST' -Headers $headers -ContentType 'application/x-www-form-urlencoded' -Body $body
Write-Output $accessToken.access_token 

استخدام الهوية المُدارة التي يعينها المستخدم في Azure PowerShell

Write-Output "Connecting to azure via  Connect-AzAccount -Identity -AccountId <ClientId of USI>"  
Connect-AzAccount -Identity -AccountId <ClientId of USI> 
Write-Output "Successfully connected with Automation account's Managed Identity"  
Write-Output "Trying to fetch value from key vault using User Assigned Managed identity. Make sure you have given correct access to Managed Identity"  
$secret = Get-AzKeyVaultSecret -VaultName '<KVname>' -Name '<KeyName>'  
$ssPtr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secret.SecretValue)  
try {  
  $secretValueText = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($ssPtr)  
    Write-Output $secretValueText  
} finally {  
    [System.Runtime.InteropServices.Marshal]::ZeroFreeBSTR($ssPtr)  
} 

استخدام الهوية المُدارة التي يعينها المستخدم في Python Runbook

#!/usr/bin/env python3  
import os  
import requests   

resource = "?resource=https://management.azure.com/" 
client_id = "&client_id=<ClientId of USI>" 
endPoint = os.getenv('IDENTITY_ENDPOINT')+ resource +client_id 
identityHeader = os.getenv('IDENTITY_HEADER') 
payload={}  
headers = {  
  'X-IDENTITY-HEADER': identityHeader,
  'Metadata': 'True' 
}  
response = requests.request("GET", endPoint, headers=headers, data=payload)  
print(response.text) 

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