(미리 보기) 기존 가상 머신 확장 집합에서 신뢰할 수 있는 시작 사용
적용 대상: ✔️ Linux VM ✔️ Windows VM ✔️ Virtual Machine Scale Sets Uniform
Azure Virtual Machine Scale Sets는 신뢰할 수 있는 시작 보안 유형으로 업그레이드하여 기존 Uniform Scale Sets VM에서 신뢰할 수 있는 시작을 사용하도록 지원합니다.
신뢰할 수 있는 시작은 Azure 2세대 가상 머신 및 확장 집합에서 기본 컴퓨팅 보안을 사용하도록 설정하고 부트 키트 및 루트킷과 같은 고급 및 영구 공격 기술로부터 보호합니다. 보안 부팅, vTPM, 부팅 무결성 모니터링과 같은 인프라 기술을 확장 집합에 결합하여 이를 수행합니다.
제한 사항
데이터 디스크가 연결된 기존 가상 머신 확장 집합에서 신뢰할 수 있는 시작을 사용하도록 설정하는 것은 현재 지원되지 않습니다.
- 확장 집합이 데이터 디스크로 구성되어 있는지 확인하려면 확장 집합설정 메뉴에서 확장 집합 - >디스크로 이동하여 > 데이터 디스크 제목 아래에서 확인합니다
기존 가상 머신 확장 집합 Flex에서 신뢰할 수 있는 시작을 사용하도록 설정하는 것은 현재 지원되지 않습니다.
기존 Service Fabric 클러스터 및 Service Fabric 관리형 클러스터에서 신뢰할 수 있는 시작을 사용하도록 설정하는 것은 현재 지원되지 않습니다.
필수 조건
- 확장 집합 구독의
ImageSkuGenUpdateWithVMSS
네임스페이스 아래에 미리 보기 기능Microsoft.Compute
을(를) 등록합니다. 자세한 내용은 Azure 구독에서 미리 보기 기능 설정을 참조하세요. - 확장 집합은 현재 신뢰할 수 있는 시작에서 지원되지 않는 기능에 종속되지 않습니다.
- 확장 집합은 신뢰할 수 있는 시작 지원 크기 패밀리로 구성해야 합니다.
참고 항목
- 가상 머신 크기는 신뢰할 수 있는 시작 업그레이드와 함께 변경할 수 있습니다. 업그레이드 오류를 방지하기 위해 새 VM 크기에 대한 할당량이 있는지 확인합니다. vCPU 할당량 확인을 참조하세요.
- 가상 머신 크기를 변경하면 새 크기로 가상 머신 인스턴스가 다시 만들어지고 개별 가상 머신 인스턴스의 가동 중지 시간이 필요합니다. 확장 집합 가동 중지 시간을 방지하기 위해 롤링 업그레이드 방식으로 수행할 수 있습니다.
- 확장 집합은 신뢰할 수 있는 시작 지원 OS 이미지로 구성해야 합니다. Azure 컴퓨팅 갤러리 OS 이미지의 경우 이미지 정의가 TrustedLaunchSupported로 표시되어 있는지 확인합니다.
기존 확장 집합 Uniform에서 신뢰할 수 있는 시작 사용
이 섹션에서는 ARM 템플릿을 사용하여 기존 가상 머신 확장 집합 균일에서 신뢰할 수 있는 시작을 사용하도록 설정하는 단계를 문서화합니다.
기존 ARM 템플릿 배포 코드를 다음과 같은 수정합니다. 전체 템플릿은 빠른 시작 신뢰할 수 있는 확장 집합 ARM 템플릿을 참조하세요.
Important
신뢰할 수 있는 시작 보안 유형은 확장 집합 apiVersion
2020-12-01
이상에서 사용할 수 있습니다. 업그레이드하기 전에 API 버전이 올바르게 설정되었는지 확인합니다.
OS 이미지: Gen2 신뢰할 수 있는 시작 지원 OS 이미지로 OS 이미지 참조를 업데이트합니다. Azure Compute Gallery OS 이미지를 사용하는 경우 원본 Gen2 이미지에
TrustedLaunchSupported
보안 유형이 있는지 확인합니다."storageProfile": { "osDisk": { "createOption": "FromImage", "caching": "ReadWrite" }, "imageReference": { "publisher": "MicrosoftWindowsServer", "offer": "WindowsServer", "sku": "2022-datacenter-azure-edition", "version": "latest" } }
(선택 사항) 확장 집합 크기: 신뢰할 수 있는 시작 보안 구성에서 현재 크기 패밀리가 지원되지 않는 경우 확장 집합 크기를 수정합니다.
"sku": { "name": "Standard_D2s_v3", "tier": "Standard", "capacity": "[parameters('instanceCount')]" }
보안 프로필:
virtualMachineProfile
아래에securityProfile
블록을 추가하여 신뢰할 수 있는 시작 보안 구성을 사용하도록 설정합니다.참고 항목
권장 설정:
vTPM
:true
및secureBoot
:true
secureBoot
은(는) OS에서 서명되지 않은 사용자 지정 드라이버 또는 커널을 사용하는 경우false
(으)로 설정해야 합니다."securityProfile": { "securityType": "TrustedLaunch", "uefiSettings": { "secureBootEnabled": true, "vTpmEnabled": true } }
(권장) 게스트 증명 확장: 확장 집합 리소스에 대한 GA(게스트 증명) 확장을 추가하여 확장 집합에 대한 부팅 무결성 모니터링을 사용하도록 설정합니다.
Important
게스트 증명 확장에는
secureBoot
과(와)vTPM
을(를)true
(으)로 설정해야 합니다.{ "condition": "[and(parameters('vTPM'), parameters('secureBoot'))]", "type": "Microsoft.Compute/virtualMachineScaleSets/extensions", "apiVersion": "2022-03-01", "name": "[format('{0}/{1}', parameters('vmssName'), GuestAttestation)]", "location": "[parameters('location')]", "properties": { "publisher": "Microsoft.Azure.Security.WindowsAttestation", "type": "GuestAttestation", "typeHandlerVersion": "1.0", "autoUpgradeMinorVersion": true, "enableAutomaticUpgrade": true, "settings": { "AttestationConfig": { "MaaSettings": { "maaEndpoint": "[substring('emptystring', 0, 0)]", "maaTenantName": "GuestAttestation" } } } }, "dependsOn": [ "[resourceId('Microsoft.Compute/virtualMachineScaleSets', parameters('vmssName'))]" ] }
확장 게시자의 이름:
OS 종류 확장 게시자 이름 Windows Microsoft.Azure.Security.WindowsAttestation Linux Microsoft.Azure.Security.LinuxAttestation 템플릿의 변경 내용을 검토합니다.
기존 확장 집합을 신뢰할 수 있는 시작 및 롤백(필요한 경우)으로 업그레이드하는 것을 지원하는 전체 샘플 ARM 템플릿을 보려면 확장합니다.
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "vmSku": { "type": "string", "defaultValue": "Standard_D2s_v3", "metadata": { "description": "Size of VMs in the VM Scale Set." } }, "sku": { "type": "string", "defaultValue": "2022-datacenter-azure-edition", "allowedValues": [ "2022-datacenter-azure-edition" ], "metadata": { "description": "The Windows version for the VM. This will pick a fully patched image of this given Windows version." } }, "vmssName": { "type": "string", "maxLength": 61, "metadata": { "description": "String used as a base for naming resources. Must be 3-61 characters in length and globally unique across Azure. A hash is prepended to this string for some resources, and resource-specific information is appended." } }, "instanceCount": { "type": "int", "defaultValue": 2, "maxValue": 100, "minValue": 1, "metadata": { "description": "Number of VM instances (100 or less)." } }, "adminUsername": { "type": "string", "metadata": { "description": "Admin username on all VMs." } }, "adminPassword": { "type": "securestring", "metadata": { "description": "Admin password on all VMs." } }, "location": { "type": "string", "defaultValue": "[resourceGroup().location]", "metadata": { "description": "Location for all resources." } }, "publicIpName": { "type": "string", "defaultValue": "myPublicIP", "metadata": { "description": "Name for the Public IP used to access the virtual machine Scale set." } }, "publicIPAllocationMethod": { "type": "string", "defaultValue": "Static", "allowedValues": [ "Dynamic", "Static" ], "metadata": { "description": "Allocation method for the Public IP used to access the virtual machine set." } }, "publicIpSku": { "type": "string", "defaultValue": "Standard", "allowedValues": [ "Basic", "Standard" ], "metadata": { "description": "SKU for the Public IP used to access the virtual machine Scale set." } }, "dnsLabelPrefix": { "type": "string", "defaultValue": "[toLower(format('{0}-{1}', parameters('vmssName'), uniqueString(resourceGroup().id)))]", "metadata": { "description": "Unique DNS Name for the Public IP used to access the virtual machine Scale set." } }, "healthExtensionProtocol": { "type": "string", "defaultValue": "TCP", "allowedValues": [ "TCP", "HTTP", "HTTPS" ] }, "healthExtensionPort": { "type": "int", "defaultValue": 3389 }, "healthExtensionRequestPath": { "type": "string", "defaultValue": "/" }, "overprovision": { "type": "bool", "defaultValue": false }, "upgradePolicy": { "type": "string", "defaultValue": "Manual", "allowedValues": [ "Manual", "Rolling", "Automatic" ] }, "maxBatchInstancePercent": { "type": "int", "defaultValue": 20 }, "maxUnhealthyInstancePercent": { "type": "int", "defaultValue": 20 }, "maxUnhealthyUpgradedInstancePercent": { "type": "int", "defaultValue": 20 }, "pauseTimeBetweenBatches": { "type": "string", "defaultValue": "PT5S" }, "securityType": { "type": "string", "defaultValue": "TrustedLaunch", "allowedValues": [ "Standard", "TrustedLaunch" ], "metadata": { "description": "Security Type of the Virtual Machine." } }, "encryptionAtHost": { "type": "bool", "defaultValue": false, "metadata": { "description": "This property can be used by user in the request to enable or disable the Host Encryption for the virtual machine or virtual machine Scale set. This will enable the encryption for all the disks including Resource/Temp disk at host itself. The default behavior is: The Encryption at host will be disabled unless this property is set to true for the resource." } } }, "variables": { "namingInfix": "[toLower(substring(format('{0}{1}', parameters('vmssName'), uniqueString(resourceGroup().id)), 0, 9))]", "addressPrefix": "10.0.0.0/16", "subnetPrefix": "10.0.0.0/24", "virtualNetworkName": "[format('{0}vnet', variables('namingInfix'))]", "subnetName": "[format('{0}subnet', variables('namingInfix'))]", "loadBalancerName": "[format('{0}lb', variables('namingInfix'))]", "natPoolName": "[format('{0}natpool', variables('namingInfix'))]", "bePoolName": "[format('{0}bepool', variables('namingInfix'))]", "natStartPort": 50000, "natEndPort": 50119, "natBackendPort": 3389, "nicName": "[format('{0}nic', variables('namingInfix'))]", "ipConfigName": "[format('{0}ipconfig', variables('namingInfix'))]", "imageReference": { "2022-datacenter-azure-edition": { "publisher": "MicrosoftWindowsServer", "offer": "WindowsServer", "sku": "[parameters('sku')]", "version": "latest" } }, "extensionName": "GuestAttestation", "extensionPublisher": "Microsoft.Azure.Security.WindowsAttestation", "extensionVersion": "1.0", "maaTenantName": "GuestAttestation", "maaEndpoint": "[substring('emptyString', 0, 0)]", "uefiSettingsJson": { "secureBootEnabled": true, "vTpmEnabled": true }, "rollingUpgradeJson": { "maxBatchInstancePercent": "[parameters('maxBatchInstancePercent')]", "maxUnhealthyInstancePercent": "[parameters('maxUnhealthyInstancePercent')]", "maxUnhealthyUpgradedInstancePercent": "[parameters('maxUnhealthyUpgradedInstancePercent')]", "pauseTimeBetweenBatches": "[parameters('pauseTimeBetweenBatches')]" } }, "resources": [ { "type": "Microsoft.Network/virtualNetworks", "apiVersion": "2022-05-01", "name": "[variables('virtualNetworkName')]", "location": "[parameters('location')]", "properties": { "addressSpace": { "addressPrefixes": [ "[variables('addressPrefix')]" ] }, "subnets": [ { "name": "[variables('subnetName')]", "properties": { "addressPrefix": "[variables('subnetPrefix')]" } } ] } }, { "type": "Microsoft.Network/publicIPAddresses", "apiVersion": "2022-05-01", "name": "[parameters('publicIpName')]", "location": "[parameters('location')]", "sku": { "name": "[parameters('publicIpSku')]" }, "properties": { "publicIPAllocationMethod": "[parameters('publicIPAllocationMethod')]", "dnsSettings": { "domainNameLabel": "[parameters('dnsLabelPrefix')]" } } }, { "type": "Microsoft.Network/loadBalancers", "apiVersion": "2022-05-01", "name": "[variables('loadBalancerName')]", "location": "[parameters('location')]", "sku": { "name": "[parameters('publicIpSku')]", "tier": "Regional" }, "properties": { "frontendIPConfigurations": [ { "name": "LoadBalancerFrontEnd", "properties": { "publicIPAddress": { "id": "[resourceId('Microsoft.Network/publicIPAddresses', parameters('publicIpName'))]" } } } ], "backendAddressPools": [ { "name": "[variables('bePoolName')]" } ], "inboundNatPools": [ { "name": "[variables('natPoolName')]", "properties": { "frontendIPConfiguration": { "id": "[resourceId('Microsoft.Network/loadBalancers/frontendIPConfigurations', variables('loadBalancerName'), 'loadBalancerFrontEnd')]" }, "protocol": "Tcp", "frontendPortRangeStart": "[variables('natStartPort')]", "frontendPortRangeEnd": "[variables('natEndPort')]", "backendPort": "[variables('natBackendPort')]" } } ] }, "dependsOn": [ "[resourceId('Microsoft.Network/publicIPAddresses', parameters('publicIpName'))]" ] }, { "type": "Microsoft.Compute/virtualMachineScaleSets", "apiVersion": "2022-03-01", "name": "[parameters('vmssName')]", "location": "[parameters('location')]", "sku": { "name": "[parameters('vmSku')]", "tier": "Standard", "capacity": "[parameters('instanceCount')]" }, "properties": { "virtualMachineProfile": { "storageProfile": { "osDisk": { "createOption": "FromImage", "caching": "ReadWrite" }, "imageReference": "[variables('imageReference')[parameters('sku')]]" }, "osProfile": { "computerNamePrefix": "[variables('namingInfix')]", "adminUsername": "[parameters('adminUsername')]", "adminPassword": "[parameters('adminPassword')]" }, "securityProfile": { "encryptionAtHost": "[parameters('encryptionAtHost')]", "securityType": "[parameters('securityType')]", "uefiSettings": "[if(equals(parameters('securityType'), 'TrustedLaunch'), variables('uefiSettingsJson'), null())]" }, "networkProfile": { "networkInterfaceConfigurations": [ { "name": "[variables('nicName')]", "properties": { "primary": true, "ipConfigurations": [ { "name": "[variables('ipConfigName')]", "properties": { "subnet": { "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('virtualNetworkName'), variables('subnetName'))]" }, "loadBalancerBackendAddressPools": [ { "id": "[resourceId('Microsoft.Network/loadBalancers/backendAddressPools', variables('loadBalancerName'), variables('bePoolName'))]" } ], "loadBalancerInboundNatPools": [ { "id": "[resourceId('Microsoft.Network/loadBalancers/inboundNatPools', variables('loadBalancerName'), variables('natPoolName'))]" } ] } } ] } } ] }, "extensionProfile": { "extensions": [ { "name": "HealthExtension", "properties": { "publisher": "Microsoft.ManagedServices", "type": "ApplicationHealthWindows", "typeHandlerVersion": "1.0", "autoUpgradeMinorVersion": false, "settings": { "protocol": "[parameters('healthExtensionProtocol')]", "port": "[parameters('healthExtensionPort')]", "requestPath": "[if(equals(parameters('healthExtensionProtocol'), 'TCP'), null(), parameters('healthExtensionRequestPath'))]" } } } ] }, "diagnosticsProfile": { "bootDiagnostics": { "enabled": true } } }, "orchestrationMode": "Uniform", "overprovision": "[parameters('overprovision')]", "upgradePolicy": { "mode": "[parameters('upgradePolicy')]", "rollingUpgradePolicy": "[if(equals(parameters('upgradePolicy'), 'Rolling'), variables('rollingUpgradeJson'), null())]", "automaticOSUpgradePolicy": { "enableAutomaticOSUpgrade": true } } }, "dependsOn": [ "[resourceId('Microsoft.Network/loadBalancers', variables('loadBalancerName'))]", "[resourceId('Microsoft.Network/virtualNetworks', variables('virtualNetworkName'))]" ] }, { "condition": "[and(equals(parameters('securityType'), 'TrustedLaunch'), and(equals(variables('uefiSettingsJson').secureBootEnabled, true()), equals(variables('uefiSettingsJson').vTpmEnabled, true())))]", "type": "Microsoft.Compute/virtualMachineScaleSets/extensions", "apiVersion": "2022-03-01", "name": "[format('{0}/{1}', parameters('vmssName'), variables('extensionName'))]", "location": "[parameters('location')]", "properties": { "publisher": "[variables('extensionPublisher')]", "type": "[variables('extensionName')]", "typeHandlerVersion": "[variables('extensionVersion')]", "autoUpgradeMinorVersion": true, "enableAutomaticUpgrade": true, "settings": { "AttestationConfig": { "MaaSettings": { "maaEndpoint": "[variables('maaEndpoint')]", "maaTenantName": "[variables('maaTenantName')]" } } } }, "dependsOn": [ "[resourceId('Microsoft.Compute/virtualMachineScaleSets', parameters('vmssName'))]" ] } ] }
ARM 템플릿 배포를 실행합니다.
$resourceGroupName = "myResourceGroup" $parameterFile = "folderPathToFile\parameters.json" $templateFile = "folderPathToFile\template.json" New-AzResourceGroupDeployment ` -ResourceGroupName $resourceGroupName ` -TemplateFile $templateFile -TemplateParameterFile $parameterFile
배포가 성공했는지 확인합니다. Azure Portal을 사용하여 확장 집합 유니폼의 보안 유형 및 UEFI 설정을 확인합니다. 개요 페이지에서 보안 유형 섹션을 확인합니다.
확장 집합 유니폼 업그레이드 모드가
Manual
(으)로 설정된 경우 VM 인스턴스를 수동으로 업데이트합니다.$resourceGroupName = "myResourceGroup" $vmssName = "VMScaleSet001" Update-AzVmssInstance -ResourceGroupName $resourceGroupName -VMScaleSetName $vmssName -InstanceId "0"
롤백
신뢰할 수 있는 시작에서 이전에 알려진 양호한 구성으로 변경 내용을 롤백하려면 확장 집합의 securityType
을(를) 표준으로 설정해야 합니다.
신뢰할 수 있는 시작에서 이전에 알려진 정상 구성으로 변경 내용을 롤백하려면 표시된 대로 securityProfile
을(를) 표준으로 설정합니다. 필요에 따라 OS 이미지, VM 크기와 같은 다른 매개 변수 변경 내용을 되돌리고 기존 확장 집합에서 신뢰할 수 있는 시작 사용에 설명된 5~8단계를 반복할 수도 있습니다.
"securityProfile": {
"securityType": "Standard",
"uefiSettings": "[null()]"
}
다음 단계
(권장) 업그레이드 후 부팅 무결성 모니터링을 사용하도록 설정하면 클라우드용 Microsoft Defender를 사용하여 VM의 상태를 모니터링할 수 있습니다.
신뢰할 수 있는 시작에 대해 자세히 알아보고 자주 묻는 질문을 검토합니다.