マネージド ID は、Microsoft Entra 認証をサポートするリソースに接続するときにアプリケーションが使用するために、Microsoft Entra ID で自動的にマネージド ID を提供します。 マネージド ID のサービス プリンシパルに API アクセス許可を直接付与できるため、コードまたは構成ファイルに資格情報を格納する必要がなくなります。
この記事では、Microsoft Entra PowerShell を使用して、システム割り当てマネージド ID とユーザー割り当てマネージド ID の両方に対する Microsoft Graph API アクセス許可を付与および取り消す方法について説明します。
前提条件
- Microsoft Entra ユーザー アカウント。 まだアカウントがない場合は、無料でアカウントを作成することができます。
- Microsoft Entra PowerShell モジュールをインストールします。
- システム割り当てマネージド ID またはユーザー割り当てマネージド ID が有効になっているAzure リソース。
- マネージド ID に API アクセス許可を付与するには、次のいずれかのロールが必要です。
- 特権ロール管理者 (Microsoft Graphまたはその他のMicrosoftファースト パーティ アプリケーションにアクセス許可を付与する場合に必要)
- アプリケーション管理者
- クラウド アプリケーション管理者
マネージド ID に API アクセス許可を付与する
マネージド ID に Microsoft Graph API アクセス許可を付与するには、次の手順に従います。
Microsoft Entraに接続する
マネージド ID に API アクセス許可を付与するには、
Application.ReadWrite.AllスコープとAppRoleAssignment.ReadWrite.Allスコープに接続します。Connect-Entra -Scopes "Application.ReadWrite.All", "AppRoleAssignment.ReadWrite.All"Caution
AppRoleAssignment.ReadWrite.Allアクセス許可を使用すると、アプリまたはサービスは、組織内の任意のアプリ、ユーザー、またはグループのアクセス許可付与を管理し、特権を昇格できます。 このアクセス許可は、信頼できる管理者にのみ付与してください。マネージド 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 }Microsoft Graph サービスプリンシパルを取得する
Microsoft Graph サービス プリンシパルを取得します:
$graphServicePrincipal = Get-EntraServicePrincipal -Filter "appId eq '00000003-0000-0000-c000-000000000000'"必要な API アクセス許可を特定する
マネージド ID に必要な特定のMicrosoft Graphアクセス許可を見つけます。
$appRole = $graphServicePrincipal.AppRoles | Where-Object { $_.Value -eq "User.Read.All" }マネージド ID に API アクセス許可を付与する
マネージド ID に API アクセス許可を付与します。
$params = @{ ServicePrincipalId = $managedIdentitySP.Id PrincipalId = $managedIdentitySP.Id ResourceId = $graphServicePrincipal.Id AppRoleId = $appRole.Id } $appRoleAssignment = New-EntraServicePrincipalAppRoleAssignment @params付与されたアクセス許可を確認する
アクセス許可が正常に付与されたことを確認します。
$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 アクセス許可を取り消すには、次の手順に従います。
削除するアクセス許可を特定する
取り消す対象の特定のアプリ ロール割り当てを見つけます。
$assignmentToRemove = Get-EntraServicePrincipalAppRoleAssignment -ServicePrincipalId $managedIdentitySP.Id | Where-Object { $_.AppRoleId -eq $appRole.Id -and $_.ResourceId -eq $graphServicePrincipal.Id }アプリ ロールの割り当てを削除する
その ID を使用してアプリ ロールの割り当てを削除します。
if ($assignmentToRemove) { Remove-EntraServicePrincipalAppRoleAssignment -ServicePrincipalId $managedIdentitySP.Id -AppRoleAssignmentId $assignmentToRemove.Id Write-Host "Successfully removed permission: $($appRole.Value)" }アクセス許可が削除されたことを確認する
取り消されたアクセス許可に割り当てが残っていないことを確認します。
$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)." }