Share via


PowerShell を使用してマネージド ID アクセスをアプリケーション ロールに割り当てる

Azure リソースのマネージド ID により、Microsoft Entra ID の ID が Azure サービスに提供されます。 それらが動作するためにコード内の資格情報は必要ありません。 この ID は、Microsoft Entra 認証をサポートするサービスへの認証を行うために、Azure サービスによって使用されます。 アプリケーション ロールによってロールベースのアクセス制御の形式が提供され、サービスで承認規則を実装できます。

注意

アプリケーションで受け取るトークンは、基になるインフラストラクチャによってキャッシュされます。これは、マネージド ID のロールに何らかの変更があると、それが有効になるまでかなりの時間がかかる場合があることを意味します。 詳細については、認可のためのマネージド ID の使用の制限に関するページを参照してください。

この記事では、Microsoft PowerShell SDK を使用して、別のアプリケーションによって公開されているアプリケーション ロールにマネージド ID を割り当てる方法について説明します。

前提条件

マネージド ID アクセスを別のアプリケーションのアプリ ロールに割り当てる

  1. Azure VM などの Azure リソースでマネージド ID を有効にします。

  2. マネージド ID のサービス プリンシパルのオブジェクト ID を調べます。

    システム割り当てのマネージド ID の場合は、Azure portal のリソースの [ID] ページでオブジェクト ID を確認できます。 次の PowerShell スクリプトを使用して、オブジェクト ID を調べることもできます。 ステップ 1 で作成したリソースのリソース ID が必要になります。これは、Azure portal のリソースの [プロパティ] ページでわかります。

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

    ユーザー割り当てのマネージド ID の場合は、Azure portal のリソースの [概要] ページで、マネージド ID のオブジェクト ID を確認できます。 次の PowerShell スクリプトを使用して、オブジェクト ID を調べることもできます。 ユーザー割り当てのマネージド ID のリソース ID が必要になります。

    $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. マネージド ID による要求の送信先であるサービスを表す新しいアプリケーション登録を作成します。 マネージド ID に対してアプリ ロールの付与を公開している API またはサービスのサービス プリンシパルが Microsoft Entra テナントに既にある場合は、このステップをスキップします。 たとえば、マネージド ID アクセスを Microsoft Graph API に付与する場合は、このステップを省略できます。

  4. サービス アプリケーションのサービス プリンシパルのオブジェクト ID を調べます。 これは、Azure portal を使用して確認できます。 Microsoft Entra ID に移動して [エンタープライズ アプリケーション] ページを開き、アプリケーションを見つけて、[オブジェクト ID] を調べます。 次の PowerShell スクリプトを使用して、サービス プリンシパルのオブジェクト ID を表示名で検索することもできます。

    $serverServicePrincipalObjectId = (Get-MgServicePrincipal -Filter "DisplayName eq '$applicationName'").Id
    

    Note

    アプリケーションの表示名は一意ではないため、取得したサービス プリンシパルが適切なアプリケーションのものであることを確認する必要があります。

  5. ステップ 3 で作成したアプリケーションにアプリ ロールを追加します。 ロールは、Azure portal または 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. アプリ ロールをマネージド ID に割り当てます。 アプリ ロールを割り当てるには、次の情報が必要です。

    • managedIdentityObjectId: マネージド ID のサービス プリンシパルのオブジェクト ID。ステップ 2 で確認しました。
    • serverServicePrincipalObjectId: サーバー アプリケーションのサービス プリンシパルのオブジェクト ID。ステップ 4 で確認しました。
    • appRoleId: サーバー アプリによって公開されるアプリ ロールの ID。ステップ 5 で生成しました。この例では、アプリ ロール ID は 0566419e-bb95-4d9d-a4f8-ed9a0f147fa6 です。

    次の PowerShell コマンドを実行して、ロールの割り当てを追加します。

    New-MgServicePrincipalAppRoleAssignment `
        -ServicePrincipalId $serverServicePrincipalObjectId `
        -PrincipalId $managedIdentityObjectId `
        -ResourceId $serverServicePrincipalObjectId `
        -AppRoleId $appRoleId
    

完全なスクリプト

このスクリプトの例は、Azure Web アプリのマネージド ID をアプリ ロールに割り当てる方法を示したものです。

# 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

次のステップ