Поделиться через


Использование управляемой идентичности, назначенной пользователем, для учетной записи автоматизации 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 разрешения, такие как администратор доступа пользователей или владелец.

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

    Выходные данные из портала.

Добавление с помощью 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

Результат должен выглядеть следующим образом:

Выходные данные из команды Set-AzAutomationAccount.

Чтобы получить дополнительные сведения, выполните команду $output.identity | ConvertTo-Json.

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

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

Синтаксис

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

патч

{
  "identity": {
    "type": "SystemAssigned, UserAssigned",
    "userAssignedIdentities": {
      "/subscriptions/00a000aa-00a0-00aa-00aa-0a0aa000aa00/resourceGroups/resource-group-name/providers/Microsoft.ManagedIdentity/userAssignedIdentities/firstIdentity": {},
      "/subscriptions/00a000aa-00a0-00aa-00aa-0a0aa000aa00/resourceGroups/resource-group-name/providers/Microsoft.ManagedIdentity/userAssignedIdentities/secondIdentity": {}
    }
  }
}

Для API используется следующий синтаксис:

https://management.azure.com/subscriptions/00a000aa-00a0-00aa-00aa-0a0aa000aa00/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": "00a000aa-00a0-00aa-00aa-0a0aa000aa00",
    "tenantId": "00a000aa-00a0-00aa-00aa-0a0aa000aa00",
    "userAssignedIdentities":  {
        "/subscriptions/ContosoID/resourcegroups/ContosoLab/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ContosoUAMI1":  {
                "PrincipalId":  "00a000aa-00a0-00aa-00aa-0a0aa000aa00",
                "ClientId":  "00001111-aaaa-2222-bbbb-3333cccc4444"
                    },
        "/subscriptions/ContosoID/resourcegroups/ContosoLab/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ContosoUAMI2":  {
                "PrincipalId":  "00a000aa-00a0-00aa-00aa-0a0aa000aa00",
                "ClientId":  "00001111-aaaa-2222-bbbb-3333cccc4444"
                    }
        }
    }
    

Добавление с помощью шаблона 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. Щелкните назначенное пользователем удостоверение.

    Назначение роли в назначенной пользователем идентичности на портале Azure.

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

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

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

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

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

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

  9. Нажмите кнопку "Сохранить".

    Добавьте назначение ролей на портале Azure.

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

Аутентификация доступа с помощью управляемой идентичности, назначенной пользователем

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

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