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

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

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

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

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

  • Последняя версия модулей Az PowerShell Az.Accounts, Az.Resources, Az.Automation, Az.KeyVault.

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

  • Если вы хотите выполнить гибридные задания с помощью управляемого удостоверения, обновите гибридную рабочую роль Runbook на основе агента до последней версии. Для гибридной рабочей роли Runbook на основе расширений не требуется минимальная версия, и все версии будут работать. Минимальные необходимые версии для гибридной рабочей роли на основе агента:

    • Гибридная рабочая роль Runbook для Windows: версия 7.3.1125.0
    • Гибридная рабочая роль Runbook для Linux: версия 1.7.4.0

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

    • Гибридная рабочая роль Runbook Windows: перейдите к пути установки, C:\ProgramFiles\Microsoft Monitoring Agent\Agent\AzureAutomation\. а папка служба автоматизации Azure содержит вложенную папку с номером версии в качестве имени вложенной папки.
    • Гибридная рабочая роль Runbook в Linux: перейдите к пути, vi/opt/microsoft/omsconfig/modules/nxOMSAutomationWorker/VERSION. а версия файла имеет номер версии гибридной рабочей роли.
  • Чтобы назначить роль Azure, необходимо иметь Microsoft.Authorization/roleAssignments/write такие разрешения, как доступ пользователей Администратор istrator или владелец.

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

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

Свойство (JSON) Стоимость Description
principalid <ИД субъекта> Глобальный уникальный идентификатор (GUID) объекта субъекта-службы для управляемого удостоверения, назначаемого системой, представляющего учетную запись службы автоматизации в клиенте Microsoft Entra. Этот идентификатор GUID иногда отображается как "идентификатор объекта" или objectID.
tenantid <ИД клиента Azure AD> Глобальный уникальный идентификатор (GUID), представляющий клиент Microsoft Entra, в котором учетная запись службы автоматизации теперь является членом. В клиенте Microsoft Entra субъект-служба имеет то же имя, что и учетная запись службы автоматизации.

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

Важно!

Новое удостоверение уровня учетной записи службы автоматизации переопределяет все предыдущие удостоверения, назначенные системой на уровне виртуальной машины, которые описаны в разделе "Использование проверки подлинности Runbook с управляемыми удостоверениями". При выполнении гибридных заданий на виртуальных машинах Azure, использующих назначенное системой удостоверение виртуальной машины для доступа к ресурсам Runbook, для гибридных заданий будет использоваться удостоверение учетной записи службы автоматизации. Это означает, что на выполнение существующего задания может повлиять использование функции управления ключами клиента (CMK) в вашей учетной записи службы автоматизации.

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

Включение с помощью портала Azure

Выполните следующие шаги:

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

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

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

  4. Установите для параметра Назначается системой значение Вкл. и нажмите кнопку Сохранить. В запросе на подтверждение нажмите кнопку Да.

    Enabling system-assigned identity in Azure portal.

    Теперь ваша учетная запись службы автоматизации может использовать назначаемое системой удостоверение, которое зарегистрировано с идентификатором Microsoft Entra и представлено идентификатором объекта.

    Managed identity object ID.

Включение с помощью PowerShell

Выполните командлет PowerShell Set-AzAutomationAccount, чтобы включить управляемое удостоверение, назначаемое системой.

$output = Set-AzAutomationAccount `
    -ResourceGroupName $resourceGroup `
    -Name $automationAccount `
    -AssignSystemIdentity

$output

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

Output from set-azautomationaccount command.

Для получения дополнительных выходных данных измените пример, чтобы указать: $output.identity | ConvertTo-Json

Включение с помощью REST API

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

Синтаксис

Следующий синтаксис включает управляемое удостоверение, назначаемое системой, для существующей учетной записи службы автоматизации с помощью метода HTTP PATCH. Учтите, что этот синтаксис удаляет все существующие управляемые удостоверения, назначаемые системой, которые связаны с учетной записью службы автоматизации.

{ 
 "identity": { 
   "type": "SystemAssigned" 
  } 
}

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

{ 
  "identity" : {
    "type": "SystemAssigned, UserAssigned",
    "userAssignedIdentities": {
        "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/resourceGroupName/providers/Microsoft.ManagedIdentity/userAssignedIdentities/cmkID": {},
        "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/resourceGroupName/providers/Microsoft.ManagedIdentity/userAssignedIdentities/cmkID2": {}
    }
  }
}

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

PATCH 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_sa.json. Сохраните этот файл на локальном компьютере или в учетной записи хранения Azure.

  2. Измените значения переменных, указанных ниже, и выполните файл.

    $file = "path\body_sa.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
    

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

    {
        "PrincipalId":  "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
        "TenantId":  "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb",
        "Type":  0,
        "UserAssignedIdentities":  null
    }
    

Включение с помощью шаблона ARM

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

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

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

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "type": "Microsoft.Automation/automationAccounts",
      "apiVersion": "2020-01-13-preview",
      "name": "yourAutomationAccount",
      "location": "[resourceGroup().location]",
      "identity": {
        "type": "SystemAssigned"
        },
      "properties": {
        "sku": {
          "name": "Basic"
        }
      }
    }
  ]
}

Пример

Выполните следующие шаги.

  1. Измените синтаксис приведенного выше шаблона, чтобы использовалась учетная запись службы автоматизации, и сохраните его в файл с именем template_sa.json.

  2. Измените значения переменных, указанных ниже, и выполните файл.

    $templateFile = "path\template_sa.json"
    
  3. Примените командлет PowerShell New-AzResourceGroupDeployment, чтобы развернуть этот шаблон.

    New-AzResourceGroupDeployment `
        -Name "SystemAssignedDeployment" `
        -ResourceGroupName $resourceGroup `
        -TemplateFile $templateFile
    

    Команда не создает выходные данные, но вы можете убедиться в правильности выполнения с помощью следующего кода:

    (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. Роль участника используется в качестве примера, и в конкретном случае она может быть необязательной.

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

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

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

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

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

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

    Assigning role in system-assigned identity in Azure portal.

  4. В разделе Разрешения нажмите кнопку Назначения ролей Azure.

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

    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. См. раздел Connect-AzAccount в справочнике по PowerShell.

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

# Connect to Azure with system-assigned managed identity
$AzureContext = (Connect-AzAccount -Identity).context

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

Примечание.

Если ваша организация все еще использует устаревшие командлеты AzureRM, можно использовать Connect-AzureRMAccount -Identity.

Создание маркера доступа без использования командлетов Azure

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

  • Заголовок метаданных должен присутствовать и иметь значение true.
  • Ресурс должен передаваться вместе с запросом как параметр запроса GET и как данные формы для запроса POST.
  • Задайте значение переменной среды, IDENTITY_HEADER значение X-IDENTITY-HEADER.
  • Для запроса POST должен использоваться тип содержимого application/x-www-form-urlencoded.

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

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

Использование управляемого удостоверения, назначаемого системой, для доступа к Azure Key Vault в Azure PowerShell

Дополнительные сведения см. в разделе Get-AzKeyVaultSecret.

Write-Output "Connecting to azure via  Connect-AzAccount -Identity" 
Connect-AzAccount -Identity 
Write-Output "Successfully connected with Automation account's Managed Identity" 
Write-Output "Trying to fetch value from key vault using MI. 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  
# printing environment variables 
endPoint = os.getenv('IDENTITY_ENDPOINT')+"?resource=https://management.azure.com/" 
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) 

Использование управляемого удостоверения, назначаемого системой, для доступа к Базе данных SQL

Дополнительные сведения о подготовке доступа к базе данных SQL Azure см. в статье "Подготовка администратора Microsoft Entra" (База данных SQL).

$queryParameter = "?resource=https://database.windows.net/" 
$url = $env:IDENTITY_ENDPOINT + $queryParameter
$Headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" 
$Headers.Add("X-IDENTITY-HEADER", $env:IDENTITY_HEADER) 
$Headers.Add("Metadata", "True") 
$content =[System.Text.Encoding]::Default.GetString((Invoke-WebRequest -UseBasicParsing -Uri $url -Method 'GET' -Headers $Headers).RawContentStream.ToArray()) | ConvertFrom-Json 
$Token = $content.access_token 
echo "The managed identities for Azure resources access token is $Token" 
$SQLServerName = "<ServerName>"    # Azure SQL logical server name  
$DatabaseName = "<DBname>"     # Azure SQL database name 
Write-Host "Create SQL connection string" 
$conn = New-Object System.Data.SqlClient.SQLConnection  
$conn.ConnectionString = "Data Source=$SQLServerName.database.windows.net;Initial Catalog=$DatabaseName;Connect Timeout=30" 
$conn.AccessToken = $Token 
Write-host "Connect to database and execute SQL script" 
$conn.Open()  
$ddlstmt = "CREATE TABLE Person( PersonId INT IDENTITY PRIMARY KEY, FirstName NVARCHAR(128) NOT NULL)" 
Write-host " " 
Write-host "SQL DDL command" 
$ddlstmt 
$command = New-Object -TypeName System.Data.SqlClient.SqlCommand($ddlstmt, $conn) 
Write-host "results" 
$command.ExecuteNonQuery() 
$conn.Close()

Миграция из существующих учетных записей запуска от имени в управляемое удостоверение

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

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

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

  3. Обновите модули Runbook, чтобы пройти проверку подлинности с помощью управляемого удостоверения.

  4. Измените модули Runbook, чтобы использовать управляемое удостоверение. Для поддержки удостоверения используйте командлет Az Connect-AzAccount. См. раздел Connect-AzAccount в справочнике по PowerShell.

    • Если вы используете модули AzureRM, обновите AzureRM.Profile до последней версии и замените командлетом Add-AzureRMAccountConnect-AzureRMAccount –Identity.
    • Если вы используете модули Az, обновите последнюю версию, выполнив действия, описанные в статье об обновлении модулей Azure PowerShell.

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