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

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

Note

アプリケーションが受け取るトークンは、基になるインフラストラクチャによってキャッシュされます。 これは、マネージド ID のロールに対して変更を加える際、処理にかなりの時間がかかる可能性があることを意味します。 詳細については、「認可のためのマネージド ID の使用の制限」を参照してください。

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

前提条件

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

サンプル スクリプトを実行するには、次の 2 つのオプションがあります。

  • Azure Cloud Shell を使用します。これは、コード ブロックの右上隅にある [試してみる] ボタンを使用して開くことができます。
  • 最新版の Microsoft Graph PowerShell SDK をインストールしてスクリプトをローカルで実行します。
  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. 前のステップで作成したアプリケーションにアプリ ロールを追加します。 ロールは、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。前のステップで確認しました。
    • serverServicePrincipalObjectId: サーバー アプリケーションのサービス プリンシパルのオブジェクト ID。ステップ 4 で確認しました。
    • appRoleId: サーバー アプリによって公開されるアプリ ロールの ID。ステップ 5 で生成しました。この例では、アプリ ロール ID は 00000000-0000-0000-0000-000000000000 です。
    • 次の 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

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

  • Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Azure Cloud Shell の Bash のクイックスタート」を参照してください。

  • CLI リファレンス コマンドをローカルで実行する場合、Azure CLI をインストールします。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。

    • ローカル インストールを使用する場合は、az login コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、Azure CLI でのサインインに関するページを参照してください。

    • 初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、Azure CLI で拡張機能を使用する方法に関するページを参照してください。

    • az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。

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

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

    • システム割り当てのマネージド ID の場合は、Azure portal のリソースの [ID] ページでオブジェクト ID を確認できます。
    • 次のスクリプトを使用してオブジェクト ID を調べることもできます。 前のステップで作成したリソースのリソース ID が必要になります。これは、Azure portal のリソースの [プロパティ] ページでわかります。
    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"
    
    • ユーザー割り当てのマネージド ID の場合は、Azure portal のリソースの [概要] ページで、マネージド ID のオブジェクト ID を確認できます。 次のスクリプトを使用してオブジェクト ID を調べることもできます。 ユーザー割り当てのマネージド ID のリソース ID が必要になります。
    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. マネージド ID による要求の送信先であるサービスを表す新しいアプリケーション登録を作成します。

    • マネージド ID に対してアプリ ロールの付与を公開している API またはサービスのサービス プリンシパルが Microsoft Entra テナントに既にある場合は、このステップをスキップします。
  4. サービス アプリケーションのサービス プリンシパルのオブジェクト ID を調べます。 これは、Azure portal を使用して確認できます。

    • Microsoft Entra ID に移動して [エンタープライズ アプリケーション] ページを開き、アプリケーションを見つけて、[オブジェクト ID] を調べます。
    • 次のスクリプトを使用して、サービス プリンシパルのオブジェクト ID を表示名で検索することもできます。
    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"
    

    Note

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

    または、アプリケーション登録用の一意のアプリケーション ID でオブジェクト ID を見つけることができます。

    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 portal または 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. アプリ ロールをマネージド ID に割り当てます。 アプリ ロールを割り当てるには、次の情報が必要です。

    • managedIdentityObjectId: マネージド ID のサービス プリンシパルのオブジェクト ID。ステップ 2 で確認しました。
    • serverServicePrincipalObjectId: サーバー アプリケーションのサービス プリンシパルのオブジェクト ID。ステップ 4 で確認しました。
    • appRoleId: サーバー アプリによって公開されるアプリ ロールの ID。ステップ 5 で生成しました。この例では、アプリ ロール ID は 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\"}"
    

次のステップ