Concesión y revocación de permisos de API a identidades administradas

Las identidades administradas proporcionan una identidad administrada automáticamente en microsoft Entra ID para que las aplicaciones se usen al conectarse a los recursos que admiten la autenticación de Microsoft Entra. Puede conceder permisos de API directamente a la entidad de servicio de una identidad administrada, lo que elimina la necesidad de almacenar credenciales en archivos de código o configuración.

En este artículo, aprenderá a conceder y revocar permisos de Microsoft Graph API para identidades administradas asignadas por el sistema y asignadas por el usuario mediante Microsoft Entra PowerShell.

Prerequisites

Concesión de permisos de API a una identidad administrada

Siga estos pasos para conceder permisos de Microsoft Graph API a la identidad administrada.

  1. Conexión a Microsoft Entra

    Para conceder permisos de API a identidades administradas, conéctese con los ámbitos Application.ReadWrite.All y AppRoleAssignment.ReadWrite.All:

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

    Cuidado

    El AppRoleAssignment.ReadWrite.All permiso permite a una aplicación o servicio administrar concesiones de permisos y elevar privilegios para cualquier aplicación, usuario o grupo de su organización. Conceda este permiso solo a los administradores de confianza.

  2. Identificar el sujeto de servicio de identidad administrada

    Busque la entidad de servicio que representa su identidad administrada en Microsoft Entra ID.

    En el caso de las identidades administradas asignadas por el sistema, use el nombre del recurso 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

    Si el filtro devuelve varios resultados (por ejemplo, cuando varias identidades administradas comparten el mismo nombre para mostrar), use el identificador de objeto para identificar la entidad de servicio correcta: Get-EntraServicePrincipal -ServicePrincipalId '<object-id>'.

    Para las identidades administradas asignadas por el usuario, use el nombre de la identidad administrada:

    $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. Obtener el sujeto de servicio de Microsoft Graph

    Recuperar el sujeto de servicio de Microsoft Graph:

    $graphServicePrincipal = Get-EntraServicePrincipal -Filter "appId eq '00000003-0000-0000-c000-000000000000'"
    
  4. Identificación de los permisos de API necesarios

    Busque los permisos de Microsoft Graph específicos que requiere la identidad administrada:

    $appRole = $graphServicePrincipal.AppRoles | Where-Object { $_.Value -eq "User.Read.All" }
    
  5. Concesión de permisos de API a la identidad administrada

    Conceda el permiso de API a la identidad administrada:

    $params = @{
        ServicePrincipalId = $managedIdentitySP.Id
        PrincipalId = $managedIdentitySP.Id
        ResourceId = $graphServicePrincipal.Id
        AppRoleId = $appRole.Id
    }
    
    $appRoleAssignment = New-EntraServicePrincipalAppRoleAssignment @params
    
  6. Comprobación de los permisos concedidos

    Confirme que los permisos se han concedido correctamente:

    $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)"
    }
    

Revocar permisos de API de una identidad administrada

Siga estos pasos para revocar los permisos de la API de Microsoft Graph de su identidad administrada.

  1. Identifique el permiso que se debe quitar

    Busque la asignación específica de rol de aplicación que desea revocar:

    $assignmentToRemove = Get-EntraServicePrincipalAppRoleAssignment -ServicePrincipalId $managedIdentitySP.Id |
        Where-Object { $_.AppRoleId -eq $appRole.Id -and $_.ResourceId -eq $graphServicePrincipal.Id }
    
  2. Eliminación de la asignación de roles de aplicación

    Eliminar la asignación de rol de aplicación utilizando su ID:

    if ($assignmentToRemove) {
        Remove-EntraServicePrincipalAppRoleAssignment -ServicePrincipalId $managedIdentitySP.Id -AppRoleAssignmentId $assignmentToRemove.Id
        Write-Host "Successfully removed permission: $($appRole.Value)"
    }
    
  3. Comprobación de que se quitó el permiso

    Confirme que no quedan asignaciones para el permiso revocado:

    $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)."
    }