Compartir vía


Asignación de acceso de identidad administrada a un rol de aplicación

Las identidades administradas de los recursos de Azure proporcionan a los servicios de Azure una identidad en Microsoft Entra ID. Funcionan sin necesidad de usar credenciales en el código. Los servicios de Azure usan esta identidad para autenticarse en servicios compatibles con la autenticación de Microsoft Entra. Los roles de aplicación ofrecen una forma de control de acceso basado en roles y permiten que un servicio implemente reglas de autorización.

Nota:

La infraestructura subyacente almacena en caché los tokens que recibe la aplicación. Esto significa que los cambios en los roles de la identidad administrada pueden tardar mucho tiempo en procesarse. Para más información, consulte Limitación del uso de identidades administradas para la autorización.

En este artículo, aprenderá a asignar una identidad administrada a un rol de aplicación mostrado por otra aplicación mediante el SDK de PowerShell de Microsoft Graph.

Requisitos previos

Asignación de acceso de identidad administrada al rol de aplicación de otra aplicación con PowerShell

Para ejecutar los scripts de ejemplo, tiene dos opciones:

  • Use el servicio Azure Cloud Shell, que puede abrir mediante el botón Probar, ubicado en la esquina superior derecha de los bloques de código.
  • Ejecute scripts localmente mediante la instalación de la versión más reciente del SDK de PowerShell de Microsoft Graph.
  1. Habilite la identidad administrada en un recurso de Azure, como una máquina virtual de Azure.

  2. Busque el identificador de objeto de la entidad de servicio de la identidad administrada.

    En el caso de una identidad administrada asignada por el sistema, encontrará el identificador de objeto en la página de identidad del recurso en Azure Portal. También puede usar el siguiente script de PowerShell para buscar el identificador de objeto. Necesitará el identificador del recurso que creó en el paso 1, que está disponible en la página Propiedades del recurso en 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
    

    En el caso de una identidad administrada asignada por el usuario, encontrará el identificador de objeto de la identidad administrada en la página de información general del recurso en Azure Portal. También puede usar el siguiente script de PowerShell para buscar el identificador de objeto. Necesitará el identificador del recurso de la identidad administrada asignada por el usuario.

    $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. Cree un nuevo registro de aplicación para representar el servicio al que desea que la identidad administrada envíe una solicitud.

    • Omita este paso si la API o el servicio que muestran la concesión de rol de aplicación a la identidad administrada ya tiene una entidad de servicio en el inquilino de Microsoft Entra. Por ejemplo, en el caso de que quiera conceder a la identidad administrada acceso a Microsoft Graph API.
  4. Busque el identificador de objeto de la entidad de servicio de la aplicación de servicio. Puede encontrarlo en Azure Portal.

    • Por ejemplo, vaya a Microsoft Entra ID y abra la página aplicaciones Enterprise. A continuación, busque la aplicación y busque el identificador de objeto.
    • También puede buscar el identificador de objeto de la entidad de servicio por su nombre para mostrar. Para ello, use el siguiente script de PowerShell:
    $serverServicePrincipalObjectId = (Get-MgServicePrincipal -Filter "DisplayName eq '$applicationName'").Id
    

    Nota:

    Los nombres para mostrar de las aplicaciones no son únicos, por lo que debe comprobar que obtiene la entidad de servicio de la aplicación correcta.

  5. Agregue un rol de aplicación a la aplicación que creó en el paso anterior. Puede crear el rol mediante Azure Portal o Microsoft Graph.

    • Por ejemplo, puede agregar un rol de aplicación mediante la ejecución de la siguiente consulta en el Probador de 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. Asigne el rol de aplicación a la identidad administrada. Para asignar el rol de aplicación, necesitará la siguiente información:

    • managedIdentityObjectId: el identificador de objeto de la entidad de servicio de la identidad administrada, que encontró en el paso 2 anterior.
    • serverServicePrincipalObjectId: el identificador de objeto de la entidad de servicio de la aplicación de servidor, que encontró en el paso 4.
    • appRoleId: el identificador del rol de aplicación mostrado por la aplicación de servidor, que se generó en el paso 5; en el ejemplo, el identificador del rol de aplicación es 00000000-0000-0000-0000-000000000000.
    • Ejecute el siguiente comando de PowerShell para agregar la asignación de roles:
    New-MgServicePrincipalAppRoleAssignment `
        -ServicePrincipalId $serverServicePrincipalObjectId `
        -PrincipalId $managedIdentityObjectId `
        -ResourceId $serverServicePrincipalObjectId `
        -AppRoleId $appRoleId
    

Script de ejemplo completo

Este script de ejemplo muestra cómo asignar una identidad administrada de una aplicación web de Azure a un rol de aplicación.

# 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

Asignación de acceso de identidad administrada al rol de aplicación de otra aplicación con la CLI

  1. Habilite la identidad administrada en un recurso de Azure, como máquinas virtuales de Azure.

  2. Busque el identificador de objeto de la entidad de servicio de la identidad administrada.

    • En el caso de una identidad administrada asignada por el sistema, encontrará el identificador de objeto en la página de identidad del recurso en Azure Portal.
    • También puede usar el siguiente script para buscar el identificador de objeto. Necesitará el identificador del recurso que creó en el paso 1 anterior, que está disponible en la página Propiedades del recurso en 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"
    
    • En el caso de una identidad administrada asignada por el usuario, encontrará el identificador de objeto de la identidad administrada en la página de información general del recurso en Azure Portal. También puede usar el siguiente script para buscar el identificador de objeto. Necesitará el identificador del recurso de la identidad administrada asignada por el usuario.
    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. Cree un nuevo registro de aplicación que represente el servicio al que la identidad administrada enviará una solicitud.

    • Omita este paso si la API o el servicio que muestran la concesión de rol de aplicación a la identidad administrada ya tiene una entidad de servicio en el inquilino de Microsoft Entra.
  4. Busque el identificador de objeto de la entidad de servicio de la aplicación de servicio. Puede encontrarlo en Azure Portal.

    • Vaya a Microsoft Entra ID y abra la página Aplicaciones empresariales. A continuación, busque la aplicación y el identificador de objeto.
    • También puede buscar el identificador de objeto de la entidad de servicio por su nombre para mostrar. Para ello, use el siguiente script:
    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"
    

    Nota

    Los nombres para mostrar de las aplicaciones no son únicos, por lo que debe comprobar que obtiene la entidad de servicio de la aplicación correcta.

    También puede encontrar el identificador de objeto por el identificador de aplicación único para el registro de la aplicación:

    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. Agregue un rol de aplicación a la aplicación que creó en el paso anterior. Puede crear el rol mediante Azure Portal o Microsoft Graph. Por ejemplo, podría agregar un rol de aplicación como el siguiente:

    {
        "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. Asigne el rol de aplicación a la identidad administrada. Para asignar el rol de aplicación, necesitará la siguiente información:

    • managedIdentityObjectId: el identificador de objeto de la entidad de servicio de la identidad administrada, que encontró en el paso 2.
    • serverServicePrincipalObjectId: el identificador de objeto de la entidad de servicio de la aplicación de servidor, que encontró en el paso 4.
    • appRoleId: el identificador del rol de aplicación mostrado por la aplicación de servidor, que se generó en el paso 5; en el ejemplo, el identificador del rol de aplicación es 00000000-0000-0000-0000-000000000000.
  7. Ejecute el siguiente script para agregar la asignación de roles. Esta funcionalidad no se expone directamente en CLI de Azure y aquí se usa un comando REST en su lugar:

    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\"}"
    

Pasos siguientes