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

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

Примечание.

Маркеры, получаемые приложением, кэшируются базовой инфраструктурой. Это означает, что любые изменения ролей управляемого удостоверения могут занять значительное время для обработки. Дополнительные сведения см. в разделе Ограничение использования управляемых удостоверений для авторизации.

В этой статье вы узнаете, как назначить управляемое удостоверение роли приложения, предоставляемой другим приложением, с помощью пакета SDK Microsoft Graph PowerShell.

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

Назначение доступа к управляемому удостоверению роли приложения другого приложения с помощью PowerShell

Выполнить примеры скриптов можно двумя приведенными ниже способами.

  • Используйте службу Azure Cloud Shell, которую можно открыть с помощью кнопки Попробовать в правом верхнем углу блоков кода.
  • Запустите скрипты локально, установив последнюю версию пакета SDK Microsoft Graph PowerShell.
  1. Включите управляемое удостоверение для ресурса Azure, например виртуальной машины Azure.

  2. Найдите идентификатор объекта субъекта-службы управляемого удостоверения.

    Идентификатор объекта управляемого удостоверения, назначенного системой, можно найти на портале Azure на странице Удостоверение ресурса. Для поиска идентификатора объекта можно также использовать указанный ниже скрипт PowerShell. Вам потребуется идентификатор ресурса, созданный на шаге 1, который доступен на портале Azure на странице Свойства ресурса.

    $resourceIdWithManagedIdentity = '/subscriptions/{my subscription ID}/resourceGroups/{my resource group name}/providers/Microsoft.Compute/virtualMachines/{my virtual machine name}'
    (Get-AzResource -ResourceId $resourceIdWithManagedIdentity).Identity.PrincipalId
    

    Идентификатор объекта управляемого удостоверения, назначенного пользователем, можно найти на портале Azure на странице Обзор ресурса. Для поиска идентификатора объекта можно также использовать указанный ниже скрипт PowerShell. Вам потребуется идентификатор ресурса управляемого удостоверения, назначаемого пользователем.

    $userManagedIdentityResourceId = '/subscriptions/{my subscription ID}/resourceGroups/{my resource group name}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{my managed identity name}'
    (Get-AzResource -ResourceId $userManagedIdentityResourceId).Properties.PrincipalId
    
  3. Создайте новую регистрацию приложения для представления службы, в которую нужно отправить запрос.

    • Если API или служба, предоставляющая роль приложения управляемому удостоверению, уже имеет субъект-службу в клиенте Microsoft Entra, пропустите этот шаг. Например, в случае предоставления управляемому удостоверению доступа к API Microsoft Graph.
  4. Найдите идентификатор объекта субъекта-службы приложения службы. Его значение можно найти на портале Azure.

    • Например, перейдите к идентификатору Microsoft Entra и откройте страницу корпоративных приложений . Затем найдите приложение и найдите идентификатор объекта.
    • Идентификатор объекта субъекта-службы также можно найти по его отображаемому имени с помощью следующего скрипта PowerShell:
    $serverServicePrincipalObjectId = (Get-MgServicePrincipal -Filter "DisplayName eq '$applicationName'").Id
    

    Примечание.

    Отображаемые имена приложений не являются уникальными, поэтому убедитесь, что получена правильная субъект-служба приложения.

  5. Добавьте роль приложения в приложение, созданное на предыдущем шаге. Затем можно создать роль с помощью портал Azure или с помощью Microsoft Graph.

    • Например, можно добавить роль приложения, выполнив следующий запрос в обозревателе Graph:
    PATCH /applications/{id}/
    
    {
        "appRoles": [
            {
                "allowedMemberTypes": [
                    "User",
                    "Application"
                ],
                "description": "Read reports",
                "id": "1e250995-3081-451e-866c-0f6efef9c638",
                "displayName": "Report reader",
                "isEnabled": true,
                "value": "report.read"
            }
        ]
    }
    
  6. Назначьте роль приложения управляемому удостоверению. Чтобы назначить роль приложения потребуются следующие сведения:

    • managedIdentityObjectId: идентификатор объекта субъекта-службы управляемого удостоверения, который вы нашли на предыдущем шаге.
    • serverServicePrincipalObjectId — идентификатор объекта субъекта-службы серверного приложения, определенный на шаге 4.
    • appRoleId — идентификатор роли приложения, предоставляемый серверным приложением, созданным на шаге 5. В этом примере идентификатор роли приложения имеет значение 00000000-0000-0000-0000-000000000000.
    • Выполните следующую команду PowerShell, чтобы добавить назначение ролей:
    New-MgServicePrincipalAppRoleAssignment `
        -ServicePrincipalId $serverServicePrincipalObjectId `
        -PrincipalId $managedIdentityObjectId `
        -ResourceId $serverServicePrincipalObjectId `
        -AppRoleId $appRoleId
    

Полный пример скрипта

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

# Install the module.
# Install-Module Microsoft.Graph -Scope CurrentUser

# Your tenant ID (in the Azure portal, under Azure Active Directory > Overview).
$tenantID = '<tenant-id>'

# The name of your web app, which has a managed identity that should be assigned to the server app's app role.
$webAppName = '<web-app-name>'
$resourceGroupName = '<resource-group-name-containing-web-app>'

# The name of the server app that exposes the app role.
$serverApplicationName = '<server-application-name>' # For example, MyApi

# The name of the app role that the managed identity should be assigned to.
$appRoleName = '<app-role-name>' # For example, MyApi.Read.All

# Look up the web app's managed identity's object ID.
$managedIdentityObjectId = (Get-AzWebApp -ResourceGroupName $resourceGroupName -Name $webAppName).identity.principalid

Connect-MgGraph -TenantId $tenantId -Scopes 'Application.Read.All','Application.ReadWrite.All','AppRoleAssignment.ReadWrite.All','Directory.AccessAsUser.All','Directory.Read.All','Directory.ReadWrite.All'

# Look up the details about the server app's service principal and app role.
$serverServicePrincipal = (Get-MgServicePrincipal -Filter "DisplayName eq '$serverApplicationName'")
$serverServicePrincipalObjectId = $serverServicePrincipal.Id
$appRoleId = ($serverServicePrincipal.AppRoles | Where-Object {$_.Value -eq $appRoleName }).Id

# Assign the managed identity access to the app role.
New-MgServicePrincipalAppRoleAssignment `
    -ServicePrincipalId $serverServicePrincipalObjectId `
    -PrincipalId $managedIdentityObjectId `
    -ResourceId $serverServicePrincipalObjectId `
    -AppRoleId $appRoleId

Назначение доступа к управляемому удостоверению роли приложения другого приложения с помощью интерфейса командной строки

  • Используйте среду Bash в Azure Cloud Shell. Дополнительные сведения см . в кратком руководстве по Bash в Azure Cloud Shell.

  • Если вы предпочитаете выполнять справочные команды CLI локально, установите Azure CLI. Если вы работаете в Windows или macOS, Azure CLI можно запустить в контейнере Docker. Дополнительные сведения см. в статье Как запустить Azure CLI в контейнере Docker.

    • Если вы используете локальную установку, выполните вход в Azure CLI с помощью команды az login. Чтобы выполнить аутентификацию, следуйте инструкциям в окне терминала. Сведения о других возможностях, доступных при входе, см. в статье Вход с помощью Azure CLI.

    • Установите расширение Azure CLI при первом использовании, когда появится соответствующий запрос. Дополнительные сведения о расширениях см. в статье Использование расширений с Azure CLI.

    • Выполните команду az version, чтобы узнать установленную версию и зависимые библиотеки. Чтобы обновиться до последней версии, выполните команду az upgrade.

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

  2. Найдите идентификатор объекта субъекта-службы управляемого удостоверения.

    • Идентификатор объекта управляемого удостоверения, назначенного системой, можно найти на портале Azure на странице Удостоверение ресурса.
    • Для поиска идентификатора объекта можно также использовать указанный ниже скрипт. Вам потребуется идентификатор ресурса, созданного на предыдущем шаге, который доступен в портал Azure на странице свойств ресурса.
    resourceIdWithManagedIdentity="/subscriptions/{my subscription ID}/resourceGroups/{my resource group name}/providers/Microsoft.Compute/virtualMachines/{my virtual machine name}"
    
    oidForMI=$(az resource show --ids $resourceIdWithManagedIdentity --query "identity.principalId" -o tsv | tr -d '[:space:]')
    echo "object id for managed identity is: $oidForMI"
    
    • Идентификатор объекта управляемого удостоверения, назначенного пользователем, можно найти на портале Azure на странице Обзор ресурса. Для поиска идентификатора объекта можно также использовать указанный ниже скрипт. Вам потребуется идентификатор ресурса управляемого удостоверения, назначаемого пользователем.
    userManagedIdentityResourceId="/subscriptions/{my subscription ID}/resourceGroups/{my resource group name}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{my managed identity name}"
    
    oidForMI=$(az resource show --id $userManagedIdentityResourceId --query "properties.principalId" -o tsv | tr -d '[:space:]')
    echo "object id for managed identity is: $oidForMI"
    
  3. Создайте новую регистрацию приложения для представления службы, в которую отправляется управляемое удостоверение.

    • Если API или служба, предоставляющая роль приложения управляемому удостоверению, уже имеет субъект-службу в клиенте Microsoft Entra, пропустите этот шаг.
  4. Найдите идентификатор объекта субъекта-службы приложения службы. Его значение можно найти на портале Azure.

    • Перейдите к идентификатору Microsoft Entra и откройте страницу корпоративных приложений , а затем найдите приложение и найдите идентификатор объекта.
    • Идентификатор объекта субъекта-службы также можно найти по его отображаемому имени с помощью следующего скрипта:
    appName="{name for your application}"
    serverSPOID=$(az ad sp list --filter "displayName eq '$appName'" --query '[0].id' -o tsv | tr -d '[:space:]')
    echo "object id for server service principal is: $serverSPOID"
    

    Примечание.

    Отображаемые имена приложений не являются уникальными, поэтому убедитесь, что получена правильная субъект-служба приложения.

    Или вы можете найти идентификатор объекта по уникальному идентификатору приложения для регистрации приложения:

    appID="{application id for your application}"
    serverSPOID=$(az ad sp list --filter "appId eq '$appID'" --query '[0].id' -o tsv | tr -d '[:space:]')
    echo "object id for server service principal is: $serverSPOID"
    
  5. Добавьте роль приложения в приложение, созданное на предыдущем шаге. Вы можете создать роль с помощью портала Azure или Microsoft Graph. Например, можно добавить роль приложения следующим образом:

    {
        "allowedMemberTypes": [
            "Application"
        ],
        "displayName": "Read data from MyApi",
        "id": "0566419e-bb95-4d9d-a4f8-ed9a0f147fa6",
        "isEnabled": true,
        "description": "Allow the application to read data as itself.",
        "value": "MyApi.Read.All"
    }
    
  6. Назначьте роль приложения управляемому удостоверению. Чтобы назначить роль приложения потребуются следующие сведения:

    • managedIdentityObjectId — идентификатор объекта субъекта-службы управляемого удостоверения, определенный на шаге 2.
    • serverServicePrincipalObjectId — идентификатор объекта субъекта-службы серверного приложения, определенный на шаге 4.
    • appRoleId — идентификатор роли приложения, предоставляемый серверным приложением, созданным на шаге 5. В этом примере идентификатор роли приложения имеет значение 00000000-0000-0000-0000-000000000000.
  7. Выполните указанный ниже скрипт, чтобы добавить назначение ролей. Эта функция не предоставляется напрямую в Azure CLI, а команда REST используется здесь:

    roleguid="00000000-0000-0000-0000-000000000000"
    az rest -m POST -u https://graph.microsoft.com/v1.0/servicePrincipals/$oidForMI/appRoleAssignments -b "{\"principalId\": \"$oidForMI\", \"resourceId\": \"$serverSPOID\",\"appRoleId\": \"$roleguid\"}"
    

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