Contributor 역할은 일반적으로 Microsoft Azure 구독에서 Horizon Cloud 애플리케이션 등록 프로세스를 통해 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/*

선택적 사용 권한

다음 사용 권한은 Microsoft Azure의 Horizon Edge 배포에 대해 필수가 아닙니다. 그러나 이러한 선택적 사용 권한에 의존하는 Horizon Universal Console의 기능을 포함하지 않으면 해당 기능이 작동하지 않습니다.

표 2. 구독 수준에서 사용 권한을 할당할 때 사용자 지정 역할에서 선택 사항인 Microsoft Azure 리소스 작업
작업
Microsoft.KeyVault/*/read
Microsoft.KeyVault/vaults/*
Microsoft.KeyVault/vaults/secrets/*
풀 VM의 디스크 암호화에는 Key Vault 사용 권한이 필요합니다.
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 가입 풀 또는 VM을 삭제하는 경우 서비스 주체에게 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”: []
            }
        ]
    }
}