Contributor ロールは通常、Horizon Cloud アプリケーション登録プロセスを有効にして Microsoft Azure サブスクリプションで API 呼び出しを行うために使用されます。Contributor ロールの使用を回避する場合は、その目的のためにカスタム ロールを作成できます。カスタム ロールには必須の権限とオプションの権限があり、サービス プリンシパルを作成するときに認識しておく必要があるます。

カスタム ロールを作成するには、Azure PowerShell や Azure CLI などのツールを使用し、少なくともこのトピックに記載されている必須の権限を含むカスタム ロール定義を作成します。以降の JSON の例を参照してください。このページに記載されている特定の Microsoft Azure 権限の詳細については、Azure リソース プロバイダの操作を参照してください。

必須の権限

表 1. サブスクリプション レベルで権限を割り当てるときに、カスタム ロールで許可する必要がある Microsoft Azure リソースの操作
操作
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/*

App Volumes を使用する場合は、表に記載されている権限がサブスクリプション レベルで構成されていることを確認します。これらの権限の詳細については、「App Volumes アプリケーション ストレージ アカウントの Azure プライベート エンドポイント」を参照してください。

操作
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

オプションの権限

Microsoft Azure に Horizon Edge をデプロイする場合、次の権限は必須ではありません。ただし、これらのオプションの権限を含めない場合、それらに依存する Horizon Universal Console の機能は機能しません。

表 2. サブスクリプション レベルで権限を割り当てるときに、カスタム ロールでオプションで実行できる Microsoft Azure リソースの操作
操作
Microsoft.KeyVault/*/read
Microsoft.KeyVault/vaults/*
Microsoft.KeyVault/vaults/secrets/*
プール仮想マシンのディスク暗号化には、キー コンテナの権限が必要です。
Microsoft.Network/natGateways/join/action
この権限は、Horizon Edge の作成時に [Azure Private Link] 接続タイプが選択され、管理サブネットに NAT ゲートウェイが関連付けられている場合に必要です。この権限は、プライベート エンドポイント リソースを作成するために必要です。
Microsoft.Network/natGateways/read
この権限は、クラスタ送信タイプが Horizon Edge の NAT ゲートウェイとして選択されているときに、管理サブネットの NAT ゲートウェイが存在している場合に正しく構成されていることを検証するために必要です。
Microsoft.Network/privateEndpoints/write
Microsoft.Network/privateEndpoints/read
Azure Private Link を使用して Horizon Edge をデプロイするには、プライベート エンドポイント権限が必要です。
Microsoft.Network/publicIPAddresses/* パブリック IP アドレスを持つロード バランサの背後に Unified Access Gateway インスタンスを含む Horizon Edge インスタンスをデプロイするには、パブリック IP アドレスの権限が必要です。また、イメージをデプロイし、イメージにパブリック IP アドレス追加するには、この権限は必須です。
Microsoft.Network/routeTables/join/action
この権限は、Horizon Edge の作成時に [Azure Private Link] 接続タイプが選択され、管理サブネットにルート テーブルが接続されている場合に必要です。この権限は、プライベート エンドポイント リソースを作成するために必要です。
Microsoft.Network/routeTables/read
この権限は、Horizon Edge のために選択されたクラスタ送信タイプがユーザー定義ルートの場合に必要です。デフォルト ルートが正しく構成されていることを確認するには、管理サブネットの関連付けられたルート テーブルを検証することが必要です。
注: Microsoft Entra ID に参加しているプールまたは仮想マシンを削除する場合、サービス プリンシパルには Microsoft Entra ID からデバイス エントリを削除する権限が必要です。

権限は次のとおりです。

範囲:https://graph.microsoft.com/

権限:Device.ReadWrite.All Read and write devices

管理者の同意:Yes

権限を付与するには、次の場所に移動します。

[サブスクリプション] > [Azure Active Directory] > [アプリケーションの登録] > [権限を付与する必要があるアプリケーションを選択] > [API 権限] > [Microsoft GRAPH] > [Device.ReadWriteAll を選択]

Microsoft Azure カスタム ロールの JSON の例

次の JSON コード ブロックは、Horizon Cloud カスタム ロール - Titan という名前のカスタム ロール定義に、前述の一連の必須およびオプションの操作がある場合にどのような状態になるかを示す例です。ID は、カスタム ロールの一意の ID です。Azure PowerShell または Azure CLI を使用してカスタム ロールを作成すると、プロセスによってこの ID が自動的に生成されます。変数 my_subscription_ID の場合は、カスタム ロールが使用されるサブスクリプションの ID を置き換えます。

assignableScopes セクションでは、複数のサブスクリプション ID、「/subscriptions/my_subscription_ID」を使用して、複数のサブスクリプションにわたってカスタム ロールを使用できます。

表 3. サブスクリプション レベルで権限を割り当てるときに Horizon Cloud が必要とする操作を許可するロールの JSON の例
{
    “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”: []
            }
        ]
    }
}