La función Contributor se utiliza comúnmente para habilitar el proceso de registro de la aplicación Horizon Cloud para realizar llamadas de API en la suscripción de Microsoft Azure. Si prefiere evitar el uso de la función Contributor, puede crear una función personalizada con esta finalidad. La función personalizada tiene ciertos permisos obligatorios y opcionales que deben tenerse en cuenta al crear una entidad de servicio.

Para crear una función personalizada, utilice una herramienta, como Azure PowerShell o la CLI de Azure, y cree una definición de función personalizada que, como mínimo, incluya los permisos obligatorios indicados en este tema. Consulte el ejemplo de JSON que aparece a continuación. Para obtener más información sobre los permisos específicos de Microsoft Azure que aparecen en esta página, consulte Operaciones del proveedor de recursos de Azure.

Permisos obligatorios

Tabla 1. Operaciones de recursos de Microsoft Azure que se deben permitir en la función personalizada al asignar permisos en el nivel de suscripción
Operación
Microsoft.Authorization/*/read
Microsoft.Compute/*/read
Microsoft.Compute/availabilitySets/*
Microsoft.Compute/disks/*
Microsoft.Compute/galleries/read
Microsoft.Compute/galleries/write
Microsoft.Compute/galleries/delete
Microsoft.Compute/galleries/images/*
Microsoft.Compute/galleries/images/versions/*
Microsoft.Compute/images/*
Microsoft.Compute/locations/*
Microsoft.Compute/snapshots/*
Microsoft.Compute/virtualMachines/*
Microsoft.Compute/virtualMachineScaleSets/*
Microsoft.ContainerService/managedClusters/delete
Microsoft.ContainerService/managedClusters/read
Microsoft.ContainerService/managedClusters/write
Microsoft.ContainerService/managedClusters/commandResults/read
Microsoft.ContainerService/managedClusters/runcommand/action
Microsoft.ContainerService/managedClusters/upgradeProfiles/read
Microsoft.ManagedIdentity/userAssignedIdentities/*/assign/action
Microsoft.ManagedIdentity/userAssignedIdentities/*/read
Microsoft.MarketplaceOrdering/offertypes/publishers/offers/plans/agreements/read
Microsoft.MarketplaceOrdering/offertypes/publishers/offers/plans/agreements/write
Microsoft.Network/loadBalancers/*
Microsoft.Network/networkInterfaces/*
Microsoft.Network/networkSecurityGroups/*
Microsoft.Network/virtualNetworks/read
Microsoft.Network/virtualNetworks/write
Microsoft.Network/virtualNetworks/checkIpAddressAvailability/read
Microsoft.Network/virtualNetworks/subnets/*
Microsoft.Network/virtualNetworks/virtualNetworkPeerings/read
Microsoft.ResourceGraph/*
Microsoft.Resources/deployments/*
Microsoft.Resources/subscriptions/read
Microsoft.Resources/subscriptions/resourceGroups/*
Microsoft.ResourceHealth/availabilityStatuses/read
Microsoft.Storage/*/read
Microsoft.Storage/storageAccounts/*

Si pretende utilizar App Volumes, asegúrese de haber configurado los permisos que aparecen en la tabla en el nivel de suscripción. Para obtener más información sobre estos permisos, consulte Endpoint privado de Azure para una cuenta de almacenamiento de aplicaciones de App Volumes.

Operación
Microsoft.Network/locations/availablePrivateEndpointTypes/read
Microsoft.Network/privateEndpoints/read
Microsoft.Network/privateEndpoints/write
Microsoft.Network/privateEndpoints/delete
Microsoft.Network/virtualNetworks/read
Microsoft.Network/virtualNetworks/subnets/read
Microsoft.Network/virtualNetworks/subnets/write
Microsoft.Network/virtualNetworks/subnets/join/action
Microsoft.Resources/deployments/*
Microsoft.Resources/subscriptions/read
Microsoft.Resources/subscriptions/resourceGroups/read

Permisos opcionales

Los siguientes permisos no son obligatorios para la implementación de Horizon Edge en Microsoft Azure. Sin embargo, la funcionalidad de Horizon Universal Console que depende de estos permisos opcionales no funciona si no los incluye.

Tabla 2. Operaciones de recursos de Microsoft Azure que son opcionales en la función personalizada al asignar permisos en el nivel de suscripción
Operación
Microsoft.KeyVault/*/read
Microsoft.KeyVault/vaults/*
Microsoft.KeyVault/vaults/secrets/*
Se requieren permisos de almacén de claves para el cifrado de disco de las máquinas virtuales de grupo.
Microsoft.Network/natGateways/join/action
Este permiso es necesario cuando se selecciona el tipo de conectividad Vínculo privado de Azure en el momento en que se crea la instancia de Horizon Edge y la subred de administración tiene una puerta de enlace NAT asociada. Se requiere el permiso para crear los recursos de endpoint privado.
Microsoft.Network/natGateways/read
Este permiso es necesario para validar que la puerta de enlace NAT de la subred de administración está configurada correctamente cuando el tipo de salida de clúster se selecciona como Puerta de enlace NAT para Horizon Edge.
Microsoft.Network/privateEndpoints/write
Microsoft.Network/privateEndpoints/read
Se requieren permisos de endpoint privado para implementar Horizon Edge con Azure Private Link.
Microsoft.Network/publicIPAddresses/* Se requiere permiso de IP pública para implementar una instancia de Horizon Edge con instancias de Unified Access Gateway detrás de un equilibrador de carga con una dirección IP pública. Además, este permiso es obligatorio para implementar y agregar una dirección IP pública a una imagen.
Microsoft.Network/routeTables/join/action
Este permiso es necesario cuando se selecciona el tipo de conectividad Vínculo privado de Azure en el momento en que se crea la instancia de Horizon Edge y la subred de administración tiene una tabla de rutas asociada. Se requiere el permiso para crear los recursos de endpoint privado.
Microsoft.Network/routeTables/read
Este permiso es necesario si el tipo de salida de clúster seleccionado para Horizon Edge es Rutas definidas por el usuario. Es necesario validar la tabla de rutas asociada de la subred de administración para garantizar que la ruta predeterminada esté configurada correctamente.
Nota: Al eliminar un grupo unido a Microsoft Entra ID o una máquina virtual, la entidad de servicio debe tener permisos para eliminar la entrada del dispositivo de Microsoft Entra ID.

Los permisos son de los tipos siguientes:

Ámbito: https://graph.microsoft.com/

Permiso: Device.ReadWrite.All Read and write devices

Consentimiento del administrador: Yes

El permiso se puede conceder accediendo a la siguiente ubicación:

Suscripción > Azure Active Directory > Registros de aplicaciones > Seleccionar la aplicación a la que se debe conceder el permiso > Permiso de API > Seleccionar Microsoft GRAPH > Seleccionar Device.ReadWriteAll

Ejemplo de JSON de función personalizada de Microsoft Azure

El siguiente bloque de código JSON es un ejemplo para ilustrar el aspecto que puede tener una definición de función personalizada denominada Horizon Cloud Custom Role - Titan cuando tiene el conjunto de operaciones obligatorias y opcionales precedentes. El ID es el identificador único del rol personalizado. Cuando se utiliza Azure PowerShell o la CLI de Azure para crear una función personalizada, el proceso genera automáticamente este identificador. Para la variable my_subscription_ID, sustituya los identificadores de las suscripciones en las que se utilizará la función personalizada.

En la sección assignableScopes, puede utilizar varios identificadores de suscripción, "/subscriptions/my_subscription_ID", para permitir que la función personalizada se utilice en varias suscripciones.

Tabla 3. JSON de ejemplo para una función que permite las operaciones requeridas de Horizon Cloud al asignar permisos en el nivel de suscripción
{
    “id”: “uuid”,
    “properties”: {
        “roleName”: “Horizon Cloud Custom Role - Titan”,
        “description”: “All permissions required for deployment and operation of a Horizon Edge in Azure”,
        “assignableScopes”: [
              “/subscriptions/my_subscription_ID”
        ],
        “permissions”: [
            {
                “actions”: [
                    “Microsoft.Authorization/*/read”,
                    “Microsoft.Compute/*/read”,
                    “Microsoft.Compute/availabilitySets/*“,
                    “Microsoft.Compute/disks/*“,
                    “Microsoft.Compute/galleries/read”,
                    “Microsoft.Compute/galleries/write”,
                    “Microsoft.Compute/galleries/delete”,
                    “Microsoft.Compute/galleries/images/*”,
                    “Microsoft.Compute/galleries/images/versions/*”,
                    “Microsoft.Compute/images/*”,
                    “Microsoft.Compute/locations/*”,
                    “Microsoft.Compute/snapshots/*”,
                    “Microsoft.ContainerService/managedClusters/delete”,
                    “Microsoft.ContainerService/managedClusters/read”,
                    “Microsoft.ContainerService/managedClusters/write”,        
                    “Microsoft.ContainerService/managedClusters/commandResults/read”,
                    “Microsoft.ContainerService/managedClusters/runcommand/action”,
                    “Microsoft.ContainerService/managedClusters/upgradeProfiles/read”,
                    “Microsoft.ManagedIdentity/userAssignedIdentities/*/assign/action”,
                    “Microsoft.ManagedIdentity/userAssignedIdentities/*/read”,
                    “Microsoft.Compute/virtualMachines/*”,
                    “Microsoft.Compute/virtualMachineScaleSets/*”,
                    “Microsoft.MarketplaceOrdering/offertypes/publishers/offers/plans/agreements/read”,
                    “Microsoft.MarketplaceOrdering/offertypes/publishers/offers/plans/agreements/write”,
                    “Microsoft.Network/loadBalancers/*”,           
                    “Microsoft.Network/networkInterfaces/*”,
                    “Microsoft.Network/networkSecurityGroups/*”,
                    “Microsoft.Network/virtualNetworks/read”,
                    “Microsoft.Network/virtualNetworks/write”,
                    “Microsoft.Network/virtualNetworks/checkIpAddressAvailability/read”,
                    “Microsoft.Network/virtualNetworks/subnets/*”,
                    “Microsoft.Network/virtualNetworks/virtualNetworkPeerings/read”,
                    “Microsoft.ResourceGraph/*”,
                    “Microsoft.Resources/deployments/*”,
                    “Microsoft.Resources/subscriptions/read”,
                    “Microsoft.Resources/subscriptions/resourceGroups/*”,
                    “Microsoft.ResourceHealth/availabilityStatuses/read”,
                    “Microsoft.Storage/*/read”,
                    “Microsoft.Storage/storageAccounts/*”,
                    “Microsoft.KeyVault/*/read”,
                    “Microsoft.KeyVault/vaults/*”,
                    “Microsoft.KeyVault/vaults/secrets/*”,
                    “Microsoft.Network/natGateways/join/action”,
                    “Microsoft.Network/natGateways/read”,
                    “Microsoft.Network/privateEndpoints/write”,
                    “Microsoft.Network/privateEndpoints/read”,
                    “Microsoft.Network/publicIPAddresses/*”,
                    “Microsoft.Network/routeTables/join/action",
                    "Microsoft.Network/routeTables/read"
                ],
                “notActions”: [],
                “dataActions”: [],
                “notDataActions”: []
            }
        ]
    }
}