マネージド ID に対する API アクセス許可の付与と取り消し

マネージド ID は、Microsoft Entra 認証をサポートするリソースに接続するときにアプリケーションが使用するために、Microsoft Entra ID で自動的にマネージド ID を提供します。 マネージド ID のサービス プリンシパルに API アクセス許可を直接付与できるため、コードまたは構成ファイルに資格情報を格納する必要がなくなります。

この記事では、Microsoft Entra PowerShell を使用して、システム割り当てマネージド ID とユーザー割り当てマネージド ID の両方に対する Microsoft Graph API アクセス許可を付与および取り消す方法について説明します。

前提条件

マネージド ID に API アクセス許可を付与する

マネージド ID に Microsoft Graph API アクセス許可を付与するには、次の手順に従います。

  1. Microsoft Entraに接続する

    マネージド ID に API アクセス許可を付与するには、 Application.ReadWrite.All スコープと AppRoleAssignment.ReadWrite.All スコープに接続します。

    Connect-Entra -Scopes "Application.ReadWrite.All", "AppRoleAssignment.ReadWrite.All"
    

    Caution

    AppRoleAssignment.ReadWrite.Allアクセス許可を使用すると、アプリまたはサービスは、組織内の任意のアプリ、ユーザー、またはグループのアクセス許可付与を管理し、特権を昇格できます。 このアクセス許可は、信頼できる管理者にのみ付与してください。

  2. マネージド ID サービス プリンシパルを識別する

    マネージド ID を表すサービス プリンシパルをMicrosoft Entra IDで見つけます。

    システム割り当てマネージド ID の場合は、Azure リソース名を使用します。

    $managedIdentityName = "MyAzureVM"
    $managedIdentitySP = Get-EntraServicePrincipal -Filter "displayName eq '$managedIdentityName' and servicePrincipalType eq 'ManagedIdentity'"
    
    if (-not $managedIdentitySP) {
        Write-Error "Managed identity service principal '$managedIdentityName' not found." -ErrorAction Stop
    }
    
    Write-Host "Found managed identity service principal:"
    Write-Host "Display Name: $($managedIdentitySP.DisplayName)"
    Write-Host "Object ID: $($managedIdentitySP.Id)"
    

    Note

    フィルターが複数の結果を返す場合 (たとえば、複数のマネージド ID が同じ表示名を共有している場合)、オブジェクト ID を使用して正しいサービス プリンシパル ( Get-EntraServicePrincipal -ServicePrincipalId '<object-id>') を識別します。

    ユーザー割り当てマネージド ID の場合は、マネージド ID 名を使用します。

    $userAssignedMIName = "MyUserAssignedMI"
    $managedIdentitySP = Get-EntraServicePrincipal -Filter "displayName eq '$userAssignedMIName' and servicePrincipalType eq 'ManagedIdentity'"
    
    if (-not $managedIdentitySP) {
        Write-Error "Managed identity service principal '$userAssignedMIName' not found." -ErrorAction Stop
    }
    
  3. Microsoft Graph サービスプリンシパルを取得する

    Microsoft Graph サービス プリンシパルを取得します:

    $graphServicePrincipal = Get-EntraServicePrincipal -Filter "appId eq '00000003-0000-0000-c000-000000000000'"
    
  4. 必要な API アクセス許可を特定する

    マネージド ID に必要な特定のMicrosoft Graphアクセス許可を見つけます。

    $appRole = $graphServicePrincipal.AppRoles | Where-Object { $_.Value -eq "User.Read.All" }
    
  5. マネージド ID に API アクセス許可を付与する

    マネージド ID に API アクセス許可を付与します。

    $params = @{
        ServicePrincipalId = $managedIdentitySP.Id
        PrincipalId = $managedIdentitySP.Id
        ResourceId = $graphServicePrincipal.Id
        AppRoleId = $appRole.Id
    }
    
    $appRoleAssignment = New-EntraServicePrincipalAppRoleAssignment @params
    
  6. 付与されたアクセス許可を確認する

    アクセス許可が正常に付与されたことを確認します。

    $assignments = Get-EntraServicePrincipalAppRoleAssignment -ServicePrincipalId $managedIdentitySP.Id
    Write-Host "Current app role assignments for $($managedIdentitySP.DisplayName):"
    foreach ($assignment in $assignments) {
        $resource = Get-EntraServicePrincipal -ServicePrincipalId $assignment.ResourceId
        $assignedRole = $resource.AppRoles | Where-Object { $_.Id -eq $assignment.AppRoleId }
        Write-Host "- Resource: $($resource.DisplayName)"
        Write-Host "  Permission: $($assignedRole.Value)"
    }
    

マネージド ID から API アクセス許可を取り消す

マネージド ID から Microsoft Graph API アクセス許可を取り消すには、次の手順に従います。

  1. 削除するアクセス許可を特定する

    取り消す対象の特定のアプリ ロール割り当てを見つけます。

    $assignmentToRemove = Get-EntraServicePrincipalAppRoleAssignment -ServicePrincipalId $managedIdentitySP.Id |
        Where-Object { $_.AppRoleId -eq $appRole.Id -and $_.ResourceId -eq $graphServicePrincipal.Id }
    
  2. アプリ ロールの割り当てを削除する

    その ID を使用してアプリ ロールの割り当てを削除します。

    if ($assignmentToRemove) {
        Remove-EntraServicePrincipalAppRoleAssignment -ServicePrincipalId $managedIdentitySP.Id -AppRoleAssignmentId $assignmentToRemove.Id
        Write-Host "Successfully removed permission: $($appRole.Value)"
    }
    
  3. アクセス許可が削除されたことを確認する

    取り消されたアクセス許可に割り当てが残っていないことを確認します。

    $remainingAssignments = Get-EntraServicePrincipalAppRoleAssignment -ServicePrincipalId $managedIdentitySP.Id
    if ($remainingAssignments) {
        Write-Host "Remaining permissions for $($managedIdentitySP.DisplayName):"
        foreach ($assignment in $remainingAssignments) {
            $resource = Get-EntraServicePrincipal -ServicePrincipalId $assignment.ResourceId
            $assignedRole = $resource.AppRoles | Where-Object { $_.Id -eq $assignment.AppRoleId }
            Write-Host "- $($assignedRole.Value) on $($resource.DisplayName)"
        }
    } else {
        Write-Host "No app role assignments remain for $($managedIdentitySP.DisplayName)."
    }