A função Contributor é geralmente usada para ativar o processo de registro de aplicativos do Horizon Cloud para fazer chamadas de API na assinatura do Microsoft Azure. Se preferir evitar o uso da função Contributor, você poderá criar uma função personalizada para essa finalidade. A função personalizada tem determinadas permissões necessárias e opcionais das quais você deve estar ciente ao criar uma entidade de serviço.

Para criar uma função personalizada, use uma ferramenta, como o Azure PowerShell ou a interface de linha de comando do Azure, e crie uma definição de função personalizada que, no mínimo, inclua as permissões obrigatórias listadas neste tópico. Consulte o exemplo de JSON a seguir. Para obter detalhes sobre as permissões específicas do Microsoft Azure listadas nessa página, consulte Operações do provedor de recursos do Azure.

Permissões obrigatórias

Tabela 1. As operações de recursos do Microsoft Azure que devem ser permitidas na função personalizada ao atribuir permissões no nível da assinatura
Operação
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/*

Se você pretende usar o App Volumes, certifique-se de ter configurado as permissões, listadas na tabela, no nível da assinatura. Para obter mais informações sobre essas permissões, consulte Endpoint privado do Azure para uma conta de armazenamento de aplicativo do App Volumes.

Operação
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

Permissões opcionais

As seguintes permissões não são obrigatórias para a implantação do Horizon Edge no Microsoft Azure. No entanto, a funcionalidade no Horizon Universal Console que depende dessas permissões opcionais não funcionará se você não as incluir.

Tabela 2. Operações de recursos do Microsoft Azure que são opcionais na função personalizada ao atribuir permissões no nível da assinatura
Operação
Microsoft.KeyVault/*/read
Microsoft.KeyVault/vaults/*
Microsoft.KeyVault/vaults/secrets/*
As permissões do repositório de chaves são necessárias para a criptografia de disco das VMs do pool.
Microsoft.Network/natGateways/join/action
Essa permissão é necessária quando o tipo de conectividade Link Privado do Azure é selecionado no momento em que o Horizon Edge é criado e a sub-rede de gerenciamento tem um gateway NAT associado. A permissão é necessária para criar os recursos do endpoint privado.
Microsoft.Network/natGateways/read
Essa permissão é necessária para validar se o gateway NAT da sub-rede de gerenciamento está, se presente, configurado corretamente quando o tipo de saída do cluster é selecionado como gateway NAT para o Horizon Edge.
Microsoft.Network/privateEndpoints/write
Microsoft.Network/privateEndpoints/read
São necessárias permissões de Endpoint Privado para implementar o Horizon Edge com Link Privado do Azure.
Microsoft.Network/publicIPAddresses/* É necessária permissão de IP público para implantar uma instância do Horizon Edge com instâncias do Unified Access Gateway atrás de um balanceador de carga com um endereço IP público. Além disso, essa permissão é obrigatória. para implantar e para adicionar um endereço IP público a uma imagem.
Microsoft.Network/routeTables/join/action
Essa permissão é necessária quando o tipo de conectividade Link Privado do Azure é selecionado no momento em que o Horizon Edge é criado e a sub-rede de gerenciamento tem uma tabela de caminhos anexada. A permissão é necessária para criar os recursos do endpoint privado.
Microsoft.Network/routeTables/read
Essa permissão será necessária se o tipo de saída do cluster selecionado para o Horizon Edge for Rotas definidas pelo usuário. É necessário validar a tabela de rotas associada da sub-rede de gerenciamento para garantir que a rota padrão esteja configurada corretamente.
Observação: Ao excluir um pool ou uma VM do Microsoft Entra ID, a entidade de serviço deve ter permissões para excluir a entrada do dispositivo do Microsoft Entra ID.

As permissões são das seguintes:

Escopo: https://graph.microsoft.com/

Permissão: Device.ReadWrite.All Read and write devices

Consentimento do Administrador: Yes

A permissão pode ser dada navegando até o seguinte local:

Assinatura > Azure Active Directory > Registros de Aplicativos > Selecione o aplicativo ao qual a permissão precisa ser concedida > Permissão de API > Selecione Microsoft GRAPH > Selecione Device.ReadWriteAll

Exemplo de JSON da função personalizada do Microsoft Azure

O bloco de código JSON a seguir é um exemplo para ilustrar a aparência de uma definição de função personalizada chamada Função Personalizada do Horizon Cloud: Titan quando tem o conjunto de operações obrigatórias e opcionais anteriores. A ID é a ID exclusiva da função personalizada. Quando você usa o Azure PowerShell ou a CLI do Azure para criar uma função personalizada, o processo gera automaticamente essa ID. Para a variável my_subscription_ID, substitua as IDs das assinaturas nas quais a função personalizada será usada.

Na seção assignableScopes, você pode usar várias IDs de assinatura, /subscriptions/my_subscription_ID, para permitir que a função personalizada seja usada em várias assinaturas.

Tabela 3. Exemplo de JSON para uma função que possibilita ao Horizon Cloud realizar as operações necessárias ao atribuir permissões no nível da assinatura
{
    “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”: []
            }
        ]
    }
}