Тип безопасности конфиденциальной виртуальной машины с Terraform в Azure
Для школьного проекта мы сейчас пытаемся настроить конфиденциальную виртуальную машину AMD SEV, используя Terraform с Azure. Однако мы не можем найти никакой документации о том, как создать конфиденциальную виртуальную машину в этой среде. Предположительно, мы сможем добиться этого, установив to в коде Terraform. Однако по умолчанию это<NULL>
ценить. Наша цель — найти аргумент, отвечающий за установку этого значения.
Наш файл main.tf выглядит следующим образом:
# Create virtual machine
resource "azurerm_linux_virtual_machine" "my_terraform_vm" {
name = "ccAmdVM"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
network_interface_ids = [azurerm_network_interface.my_terraform_nic.id]
size = "Standard_DC2as_v5"
os_disk {
name = "myOsDisk"
caching = "ReadWrite"
storage_account_type = "StandardSSD_LRS"
}
source_image_reference {
publisher = "Canonical"
offer = "0001-com-ubuntu-confidential-vm-focal"
sku = "20_04-lts-cvm"
version = "latest"
}
Однако когда мы попытались применить этот код с Terraform, мы получили следующую ошибку:
│ Error: creating Linux Virtual Machine: (Name "ccAmdVM" / Resource Group "rg-gorgeous-lynx"): compute.VirtualMachinesClient#CreateOrUpdate: Failure sending request: StatusCode=400 -- Original Error: Code="BadRequest" Message="The VM size 'Standard_DC2as_v5' is not supported for creation of VMs and Virtual Machine Scale Set with '<NULL>' security type."
│
│ with azurerm_linux_virtual_machine.my_terraform_vm,
│ on main.tf line 111, in resource "azurerm_linux_virtual_machine" "my_terraform_vm":
│ 111: resource "azurerm_linux_virtual_machine" "my_terraform_vm" {
│
Несколько источников предложили использоватьsecurity_encryption_type
аргумент со значениемVMGuestStateOnly
подos_disk
блок, но это привело к следующей ошибке:
╷
│ Error: Unsupported argument
│
│ on main.tf line 122, in resource "azurerm_linux_virtual_machine" "my_terraform_vm":
│ 122: security_encryption_type = "VMGuestStateOnly"
│
│ An argument named "security_encryption_type" is not expected here.
Мы попытались создать конфиденциальную виртуальную машину с помощью графического интерфейса Azure, и это удалось. Здесь можно было установитьsecurity type
кStandard
,Trusted Launch Virtual Machines
илиConfidential Virtual Machines
из которых использовалось последнее значение. После успешного создания виртуальной машины мы увидели, что для нее установлено значениеConfidential
во вкладке «Обзор».
Можно было бы подумать, что ожидаемое решение довольно простое, например, используя аргументsecurity_type
со значением, таким какconfidential
. Однако, поскольку конфиденциальные вычисления являются относительно новой концепцией, похоже, нигде нет ответа или документации по этому вопросу.
2 ответа
AFAIK, создание конфиденциальной виртуальной машины еще не поддерживается поставщиком ресурсов Azurerm terraform, поскольку параметр SecurityType: параметр пока недоступен.
Конфигурацияsecurity_encryption_type
Является частью os_disk , и для работы конфиденциальной виртуальной машины необходимо включить шифрование диска.
На данный момент terraform не имеет параметра Security_type: Standard, Confidential Virtual Machines, Trusted Launch Virtual Machines.
В качестве обходного пути вы можете использовать шаблон ARM для создания конфиденциальной виртуальной машины, см. ниже:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"vmName": {
"type": "string",
"metadata": {
"description": "Name of the VM."
}
},
"vmLocation": {
"type": "string",
"allowedValues": [
"West US",
"North Europe"
],
"metadata": {
"description": "Location of the VM."
}
},
"vmSize": {
"type": "string",
"defaultValue": "Standard_DC2as_v5",
"allowedValues": [
"Standard_DC2as_v5",
"Standard_DC4as_v5",
"Standard_DC8as_v5",
"Standard_DC16as_v5",
"Standard_DC32as_v5",
"Standard_DC48as_v5",
"Standard_DC64as_v5",
"Standard_DC96as_v5",
"Standard_DC2ads_v5",
"Standard_DC4ads_v5",
"Standard_DC8ads_v5",
"Standard_DC16ads_v5",
"Standard_DC32ads_v5",
"Standard_DC48ads_v5",
"Standard_DC64ads_v5",
"Standard_DC96ads_v5",
"Standard_EC2as_v5",
"Standard_EC4as_v5",
"Standard_EC8as_v5",
"Standard_EC16as_v5",
"Standard_EC20as_v5",
"Standard_EC32as_v5",
"Standard_EC48as_v5",
"Standard_EC64as_v5",
"Standard_EC96as_v5",
"Standard_EC96ias_v5",
"Standard_EC2ads_v5",
"Standard_EC4ads_v5",
"Standard_EC8ads_v5",
"Standard_EC16ads_v5",
"Standard_EC20ads_v5",
"Standard_EC32ads_v5",
"Standard_EC48ads_v5",
"Standard_EC64ads_v5",
"Standard_EC96ads_v5",
"Standard_EC96iads_v5"
],
"metadata": {
"description": "Size of the VM."
}
},
"osImageName": {
"type": "string",
"defaultValue": "Windows Server 2022 Gen 2",
"allowedValues": [
"Windows Server 2022 Gen 2",
"Windows Server 2019 Gen 2",
"Ubuntu 20.04 LTS Gen 2"
],
"metadata": {
"description": "OS Image for the Virtual Machine"
}
},
"osDiskType": {
"type": "string",
"defaultValue": "Standard_LRS",
"allowedValues": [
"Premium_LRS",
"Standard_LRS",
"StandardSSD_LRS"
],
"metadata": {
"description": "OS disk type of the VM."
}
},
"adminUsername": {
"type": "string",
"metadata": {
"description": "Admin User Name of the VM."
}
},
"authenticationType": {
"type": "string",
"defaultValue": "password",
"allowedValues": [
"password",
"sshPublicKey"
],
"metadata": {
"description": "Type of authentication to use on the Virtual Machine."
}
},
"adminPasswordOrKey": {
"type": "securestring",
"metadata": {
"description": "Password or ssh key for the Virtual Machine."
}
},
"bootDiagnostics": {
"type": "string",
"defaultValue": "false",
"allowedValues": [
"true",
"false"
],
"metadata": {
"description": "Boot diagnostics setting of the VM."
}
},
"securityType": {
"type": "string",
"defaultValue": "DiskWithVMGuestState",
"allowedValues": [
"VMGuestStateOnly",
"DiskWithVMGuestState"
],
"metadata": {
"description": "VM security type."
}
},
"secureBootEnabled": {
"type": "string",
"defaultValue": "true",
"allowedValues": [
"true"
],
"metadata": {
"description": "Secure Boot setting of the VM."
}
}
},
"variables": {
"imageList": {
"Windows Server 2022 Gen 2": {
"publisher": "microsoftwindowsserver",
"offer": "windowsserver",
"sku": "2022-datacenter-smalldisk-g2",
"version": "latest"
},
"Windows Server 2019 Gen 2": {
"publisher": "microsoftwindowsserver",
"offer": "windowsserver",
"sku": "2019-datacenter-smalldisk-g2",
"version": "latest"
},
"Ubuntu 20.04 LTS Gen 2": {
"publisher": "Canonical",
"offer": "0001-com-ubuntu-confidential-vm-focal",
"sku": "20_04-lts-cvm",
"version": "latest"
}
},
"imageReference": "[variables('imageList')[parameters('osImageName')]]",
"networkInterfaceName": "[concat(parameters('vmName'), '-nic')]",
"publicIPAddressName": "[concat(parameters('vmName'), '-ip')]",
"networkSecurityGroupName": "[concat(parameters('vmName'), '-nsg')]",
"networkSecurityGroupId": "[resourceId(resourceGroup().name, 'Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]",
"virtualNetworkName": "[concat(parameters('vmName'), '-vnet')]",
"virtualNetworkId": "[resourceId(resourceGroup().name, 'Microsoft.Network/virtualNetworks', variables('virtualNetworkName'))]",
"addressPrefix": "10.0.0.0/16",
"subnetPrefix": "10.0.0.0/24",
"subnetName": "[concat(parameters('vmName'), 'Subnet')]",
"subnetRef": "[concat(variables('virtualNetworkId'), '/subnets/', variables('subnetName'))]",
"isWindows": "[contains(parameters('osImageName'), 'Windows')]",
"linuxConfiguration": {
"disablePasswordAuthentication": "true",
"ssh": {
"publicKeys": [
{
"keyData": "[parameters('adminPasswordOrKey')]",
"path": "[concat('/home/', parameters('adminUsername'), '/.ssh/authorized_keys')]"
}
]
}
},
"windowsConfiguration": {
"enableAutomaticUpdates": "true",
"provisionVmAgent": "true"
}
},
"resources": [
{
"type": "Microsoft.Network/publicIPAddresses",
"apiVersion": "2019-02-01",
"name": "[variables('publicIPAddressName')]",
"location": "[parameters('vmLocation')]",
"sku": {
"name": "Basic"
},
"properties": {
"publicIpAllocationMethod": "Dynamic"
}
},
{
"type": "Microsoft.Network/networkSecurityGroups",
"apiVersion": "2019-02-01",
"name": "[variables('networkSecurityGroupName')]",
"location": "[parameters('vmLocation')]",
"properties": {
"securityRules": [
{
"name": "[if(variables('isWindows'), 'RDP', 'SSH')]",
"properties": {
"priority": 100,
"protocol": "TCP",
"access": "Allow",
"direction": "Inbound",
"sourceAddressPrefix": "*",
"sourcePortRange": "*",
"destinationAddressPrefix": "*",
"destinationPortRange": "[if(variables('isWindows'), '3389', '22')]"
}
}
]
}
},
{
"type": "Microsoft.Network/virtualNetworks",
"apiVersion": "2019-09-01",
"name": "[variables('virtualNetworkName')]",
"location": "[parameters('vmLocation')]",
"dependsOn": [
"[variables('networkSecurityGroupId')]"
],
"properties": {
"addressSpace": {
"addressPrefixes": [
"[variables('addressPrefix')]"
]
},
"subnets": [
{
"name": "[variables('subnetName')]",
"properties": {
"addressPrefix": "[variables('subnetPrefix')]",
"networkSecurityGroup": {
"id": "[variables('networkSecurityGroupId')]"
}
}
}
]
}
},
{
"type": "Microsoft.Network/networkInterfaces",
"apiVersion": "2019-07-01",
"name": "[variables('networkInterfaceName')]",
"location": "[parameters('vmLocation')]",
"dependsOn": [
"[variables('networkSecurityGroupId')]",
"[concat('Microsoft.Network/virtualNetworks/', variables('virtualNetworkName'))]",
"[concat('Microsoft.Network/publicIpAddresses/', variables('publicIpAddressName'))]"
],
"properties": {
"ipConfigurations": [
{
"name": "ipConfigNode",
"properties": {
"privateIPAllocationMethod": "Dynamic",
"subnet": {
"id": "[variables('subnetRef')]"
},
"publicIpAddress": {
"id": "[resourceId('Microsoft.Network/publicIPAddresses',variables('publicIPAddressName'))]"
}
}
}
],
"networkSecurityGroup": {
"id": "[variables('networkSecurityGroupId')]"
}
}
},
{
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2021-07-01",
"name": "[parameters('vmName')]",
"location": "[parameters('vmLocation')]",
"dependsOn": [
"[concat('Microsoft.Network/networkInterfaces/', variables('networkInterfaceName'))]"
],
"properties": {
"hardwareProfile": {
"vmSize": "[parameters('vmSize')]"
},
"storageProfile": {
"osDisk": {
"createOption": "fromImage",
"managedDisk": {
"storageAccountType": "[parameters('osDiskType')]",
"securityProfile": {
"securityEncryptionType" : "[parameters('securityType')]"
}
}
},
"imageReference": "[variables('imageReference')]"
},
"networkProfile": {
"networkInterfaces": [
{
"id": "[resourceId('Microsoft.Network/networkInterfaces', variables('networkInterfaceName'))]"
}
]
},
"osProfile": {
"computerName": "[parameters('vmName')]",
"adminUsername": "[parameters('adminUsername')]",
"adminPassword": "[parameters('adminPasswordOrKey')]",
"linuxConfiguration": "[if(equals(parameters('authenticationType'), 'password'), json('null'), variables('linuxConfiguration'))]",
"windowsConfiguration": "[if(variables('isWindows'), variables('windowsConfiguration'), json('null'))]"
},
"securityProfile": {
"uefiSettings" : {
"secureBootEnabled": "[parameters('secureBootEnabled')]",
"vTpmEnabled": "true"
},
"securityType" : "ConfidentialVM"
}
}
}
]
}
Полная ссылка на ARM:https://cvmprivatepreviewsa.blob.core.windows.net/cvmpublicpreviewcontainer/deploymentTemplate/deployCPSCVM2.json .
В шаблоне ARM SecurityType: «confidentialVM» доступен, если поставщик ресурсов Azurerm terraform не имеет конфигурации SecurityType. Обратитесь сюда:-
azurerm_virtual_machine | Ресурсы | хашикорп/азурерм | Реестр Терраформ
Чтобы развернуть шаблон ARM :-
Перейдите на свой портал Azure > Все службы > Развертывание пользовательского шаблона:-
Скопируйте приведенный выше шаблон и выберите значение по умолчанию для изображения и размера, необходимого для вашей конфиденциальной виртуальной машины, из разрешенных значений:
Нажмите «Сохранить»: —
Заполните соответствующие параметры и разверните свою конфиденциальную виртуальную машину.
Вчера у меня возникла эта проблема, и прямо сейчас поставщик terraform azurerm (наверняка в версии 3.77.0) поддерживает конфиденциальные виртуальные машины , а также виртуальные машины с Trusted Lunch.
И судя по PR от Azurerm GitHub, он поддерживается начиная с версии 3.8.0.
Параметры, необходимые для создания конфиденциальной виртуальной машины в ресурсе azurerm_linux_virtual_machine:
1. secure_boot_enabled = true
2. vtpm_enabled = true
3. os_disk.security_encryption_type = "VMGuestStateOnly" // if using with encryption_at_host_enabled set to true
Конечно, вам нужно использовать правильное предложение (например, 0001-com-ubuntu-confidential-vm-focal) и артикул (например, 20_04-lts-cvm).