Использование управляемого удостоверения, назначаемого пользователем, для учетной записи службы автоматизации Azure

В этой статье показано, как добавить управляемое удостоверение, назначаемое пользователем, для учетной записи службы автоматизации Azure и как с его помощью получать доступ к другим ресурсам. Дополнительные сведения о работе управляемых удостоверений со службой автоматизации Azure см. в статье Управляемые удостоверения.

Примечание.

Невозможно использовать управляемое удостоверение, назначаемое пользователем, в гибридной рабочей роли Runbook, если для учетной записи службы автоматизации создано управляемое удостоверение (система или пользователь). Если управляемое удостоверение не назначено учетной записи службы автоматизации, можно использовать управляемое удостоверение виртуальной машины или управляемое удостоверение, назначенное пользователем, в гибридной рабочей роли Runbook, которая является виртуальной машиной Azure с назначенными управляемыми удостоверениями.

Если у вас нет подписки Azure, создайте бесплатную учетную запись, прежде чем приступить к работе.

Необходимые компоненты

  • Учетная запись службы автоматизации Azure. Инструкции см. в статье Создание учетной записи службы автоматизации Azure.

  • Управляемое удостоверение , назначаемое пользователем, и целевые ресурсы Azure, которыми управляет модуль Runbook, с помощью этого удостоверения могут находиться в разных подписках Azure.

  • Последняя версия модулей учетной записи Azure. В настоящее время это 2.2.8. (Дополнительные сведения об этой версии см. в разделе командлеты AZ.Accounts.)

  • Ресурс Azure, к которому нужно получить доступ из модуля Runbook службы автоматизации. В этом ресурсе должна быть определена роль для управляемого удостоверения, назначаемого пользователем, которая помогает модулю Runbook службы автоматизации выполнить проверку подлинности при доступе к ресурсу. Чтобы добавить роли, необходимо быть владельцем ресурса в соответствующем клиенте Microsoft Entra.

  • Чтобы назначить роль Azure, необходимо иметь Microsoft.Authorization/roleAssignments/write разрешения, такие как доступ пользователей Администратор istrator или владелец.

Добавление управляемого удостоверения, назначаемого пользователем, для учетной записи службы автоматизации Azure

Вы можете добавить управляемое удостоверение, назначаемое пользователем, для учетной записи службы автоматизации Azure с помощью портала Azure, PowerShell, REST API 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 перейдите к учетной записи службы автоматизации.

  3. В разделе Параметры учетной записи выберите элемент Удостоверение.

  4. Перейдите на вкладку Назначаемое пользователем и нажмите Добавить.

  5. Выберите существующее управляемое удостоверение, назначаемое пользователем, а затем нажмите Удалить. Затем вы вернетесь обратно на вкладку Назначаемое пользователем.

    Output from Portal.

Добавление с помощью PowerShell

Примените командлет PowerShell Set-AzAutomationAccount, чтобы добавить управляемое удостоверение, назначаемое пользователем. Сначала необходимо определить, доступно ли управляемое удостоверение, назначенное системой. В приведенном ниже примере в существующую учетную запись службы автоматизации добавляются два существующих управляемых удостоверения, назначаемых пользователем, а управляемое удостоверение, назначаемое системой (если есть), будет отключено.

$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 API

Ниже приведен синтаксис и примеры действий.

Синтаксис

Приведенный ниже синтаксис образца текстовой области включает управляемое системное удостоверение, назначаемое системой (если оно еще не включено), и назначает два существующих управляемых удостоверения, назначаемых пользователем, существующей учетной записи службы автоматизации.

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 Invoke-RestMethod для отправки запроса PATCH в учетную запись службы автоматизации.

    # 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

Ниже приведен синтаксис и примеры действий.

Синтаксис шаблона

Приведенный ниже синтаксис образца шаблона включает управляемое системное удостоверение, назначаемое системой (если оно еще не включено), и назначает два существующих управляемых удостоверения, назначаемых пользователем, существующей учетной записи службы автоматизации.

{
  "$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 New-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 API.

Назначение роли для управляемого удостоверения, назначаемого пользователем

Учетная запись службы автоматизации может использовать управляемое удостоверение, назначаемое пользователем, для получения маркеров для доступа к другим ресурсам, защищенным идентификатором Microsoft Entra ID, например Azure Key Vault. Эти токены не представляют конкретного пользователя приложения. Вместо этого они представляют приложение, получающее доступ к ресурсу. Например, в этом случае маркер представляет учетную запись службы автоматизации.

Прежде чем использовать назначенное пользователем управляемое удостоверение для проверки подлинности, настройте для этого удостоверения доступ в ресурсе Azure, в котором планируется использовать удостоверение. Чтобы выполнить эту задачу, назначьте удостоверению соответствующую роль в целевом ресурсе Azure.

Следуйте принципу наименьших прав и тщательно назначайте разрешения, необходимые только для выполнения вашего модуля Runbook. Например, если учетная запись службы автоматизации требуется только для запуска или остановки виртуальной машины Azure, тогда разрешения, назначенные учетной записи запуска от имени или управляемому удостоверению, должны быть только для запуска или остановки виртуальной машины. Точно так же, если модуль Runbook читает из хранилища BLOB-объектов, назначьте разрешения только для чтения.

В этом примере используется Azure PowerShell, чтобы показать, как назначить целевому ресурсу Azure роль участника в подписке. Роль участника используется в качестве примера, и в конкретном случае она может быть необязательной. Кроме того, вы также можете назначить роль целевому ресурсу Azure на портале Azure.

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

Проверка назначения ролей управляемому пользователем удостоверению

Чтобы проверить роль для назначаемого пользователем управляемого удостоверения учетной записи службы автоматизации:

  1. Войдите на портал Azure.

  2. Перейдите к учетной записи службы автоматизации.

  3. В разделе "Учетная запись" Параметры выберите "Удостоверение", "Назначаемый пользователь".

  4. Щелкните имя назначаемого пользователем удостоверения.

    Assigning role in user-assigned identity in Azure portal.

    Если роли уже назначены выбранному управляемому удостоверению, назначаемому пользователем, отобразится список назначений ролей. В этом списке содержатся все назначения ролей, для которых у вас есть разрешение на чтение.

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

  5. Чтобы изменить подписку, щелкните раскрывающийся список подписки и выберите соответствующую подписку.

  6. Нажмите кнопку "Добавить назначение ролей" (предварительная версия)

  7. В раскрывающемся списке выберите набор ресурсов, которые применяет назначение роли: подписка, группа ресурсов, роль и область.
    Если у вас нет назначения роли, можно просмотреть разрешения на запись для выбранного область в виде встроенного сообщения.

  8. В раскрывающемся списке роли выберите роль участника виртуальной машины.

  9. Щелкните Сохранить.

    Add a role assignment in Azure portal.

Через несколько минут управляемое удостоверение назначается роль в выбранной область.

Проверка подлинности для доступа с управляемым удостоверением, назначаемым пользователем

После включения управляемого удостоверения, назначаемого пользователем, для учетной записи службы автоматизации и предоставления удостоверению доступа к целевому ресурсу можно указать это удостоверение в модулях Runbook для ресурсов, поддерживающих управляемое удостоверение. Для поддержки удостоверения используйте командлет Az 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

Для конечных точек HTTP убедитесь в следующем.

  • Заголовок метаданных должен присутствовать и иметь значение true.
  • Ресурс должен передаваться вместе с запросом как параметр запроса 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) 

Следующие шаги