你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
快速入门:使用 ARM 模板部署机密 VM
可以使用 Azure 资源管理器模板(ARM 模板)快速创建 Azure 机密 VM。 机密虚拟机在采用 AMD SEV-SNP 的 AMD 处理器和采用 Intel TDX 的 Intel 处理器上运行,以实现虚拟机内存加密和隔离。 有关详细信息,请参阅机密 VM 概述。
本教程介绍如何使用自定义配置部署机密 VM。
先决条件
- Azure 订阅。 免费试用帐户无法访问本教程中使用的 VM。 一种选择是使用即用即付订阅。
- 如果要从 Azure CLI 部署,请安装 PowerShell 并安装 Azure CLI。
使用 Azure CLI 部署机密 VM 模板
可以通过平台管理的密钥部署具有可选 OS 磁盘机密加密的机密 VM 模板。
若要通过 Azure CLI 使用 ARM 模板创建和部署机密 VM:
在 Azure CLI 中登录到 Azure 帐户。
az login
设置 Azure 订阅。 将
<subscription-id>
替换为订阅标识符。 确保使用符合先决条件的订阅。az account set --subscription <subscription-id>
为机密 VM 设置变量。 提供部署名称 (
$deployName
)、资源组 ($resourceGroup
)、VM 名称 ($vmName
) 和 Azure 区域 ($region
)。 将示例值替换为你自己的信息。注意
机密 VM 并非在所有位置都可用。 有关当前支持的位置,请参阅可用的 VM 产品(按 Azure 区域)。
$deployName="<deployment-name>" $resourceGroup="<resource-group-name>" $vmName= "<confidential-vm-name>" $region="<region-name>"
如果指定的资源组不存在,请创建具有该名称的资源组。
az group create -n $resourceGroup -l $region
使用带有自定义参数文件和模板文件的 ARM 模板将 VM 部署到 Azure。
az deployment group create ` -g $resourceGroup ` -n $deployName ` -u "<json-template-file-path>" ` -p "<json-parameter-file-path>" ` -p vmLocation=$region ` vmName=$vmName
定义自定义参数文件
通过 Azure 命令行接口 (Azure CLI) 创建机密 VM 时,需要定义自定义参数文件。 若要创建自定义 JSON 参数文件:
通过 Azure CLI 登录到你的 Azure 帐户。
创建 JSON 参数文件。 例如,
azuredeploy.parameters.json
。根据所使用的 OS 映像,将示例 Windows 参数文件或示例 Linux 参数文件复制到你的参数文件中。
根据需要在参数文件中编辑 JSON 代码。 例如,可更新 OS 映像名称 (
osImageName
) 或管理员用户名 (adminUsername
)。配置安全类型设置 (
securityType
)。 选择VMGuestStateOnly
以便不使用 OS 磁盘机密加密。 或者,选择DiskWithVMGuestState
以便使用平台管理的密钥进行 OS 磁盘机密加密。 对于 Intel TDX SKU 和基于 Linux 的映像,客户仅可以选择使用临时 vTPM 部署NonPersistedTPM
安全类型。 对于NonPersistedTPM
安全类型,请在模板文件中的Microsoft.Compute/virtualMachines
下使用 "apiVersion": "2023-09-01"。保存参数文件。
示例 Windows 参数文件
使用此示例为基于 Windows 的机密 VM 创建自定义参数文件。
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"vmSize": {
"value": "Standard_DC2as_v5"
},
"osImageName": {
"value": "Windows Server 2022 Gen 2"
},
"securityType": {
"value": "DiskWithVMGuestState"
},
"adminUsername": {
"value": "testuser"
},
"adminPasswordOrKey": {
"value": "<your password>"
}
}
}
示例 Linux 参数文件
使用此示例为基于 Linux 的机密 VM 创建自定义参数文件。
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"vmSize": {
"value": "Standard_DC2as_v5"
},
"osImageName": {
"value": "Ubuntu 20.04 LTS Gen 2"
},
"securityType": {
"value": "DiskWithVMGuestState"
},
"adminUsername": {
"value": "testuser"
},
"authenticationType": {
"value": "sshPublicKey"
},
"adminPasswordOrKey": {
"value": <your SSH public key>
}
}
}
注意
相应替换 osImageName 值。
通过客户管理的密钥部署具有 OS 磁盘机密加密的机密 VM 模板
通过 Azure CLI 登录到你的 Azure 帐户。
az login
设置 Azure 订阅。 将
<subscription-id>
替换为订阅标识符。 确保使用符合先决条件的订阅。az account set --subscription <subscription-id>
向租户授予机密 VM 服务主体
Confidential VM Orchestrator
对于此步骤,你需要是全局管理员或需要具有RBAC 角色“用户访问管理员”。 安装 Microsoft Graph SDK 以执行以下命令。
Connect-Graph -Tenant "your tenant ID" Application.ReadWrite.All New-MgServicePrincipal -AppId bf7b6499-ff71-4aa2-97a4-f372087be7f0 -DisplayName "Confidential VM Orchestrator"
设置 Azure 密钥保管库。 有关如何改用 Azure 密钥保管库托管 HSM,请参阅下一步。
为密钥保管库创建资源组。 密钥保管库实例和机密 VM 必须位于同一 Azure 区域中。
$resourceGroup = <key vault resource group> $region = <Azure region> az group create --name $resourceGroup --location $region
创建具有高级 SKU 的密钥保管库实例并选择首选区域。 不支持标准 SKU。
$KeyVault = <name of key vault> az keyvault create --name $KeyVault --resource-group $resourceGroup --location $region --sku Premium --enable-purge-protection
确保你在此密钥保管库中拥有所有者角色。
向
Confidential VM Orchestrator
授予对密钥保管库执行get
和release
操作的权限。$cvmAgent = az ad sp show --id "bf7b6499-ff71-4aa2-97a4-f372087be7f0" | Out-String | ConvertFrom-Json az keyvault set-policy --name $KeyVault --object-id $cvmAgent.Id --key-permissions get release
(可选)如果不想使用 Azure 密钥保管库,可以改为创建 Azure 密钥保管库托管 HSM。
按照创建 Azure 密钥保管库托管 HSM 的快速入门来预配和激活 Azure 密钥保管库托管 HSM。
在 Azure 托管 HSM 上启用清除保护。 启用密钥发布需要此步骤。
az keyvault update-hsm --subscription $subscriptionId -g $resourceGroup --hsm-name $hsm --enable-purge-protection true
向
Confidential VM Orchestrator
授予对托管 HSM 的权限。$cvmAgent = az ad sp show --id "bf7b6499-ff71-4aa2-97a4-f372087be7f0" | Out-String | ConvertFrom-Json az keyvault role assignment create --hsm-name $hsm --assignee $cvmAgent.Id --role "Managed HSM Crypto Service Release User" --scope /keys/$KeyName
使用 Azure 密钥保管库创建新密钥。 有关如何改用 Azure 托管 HSM,请参阅下一步。
准备密钥发布策略并将其下载到本地磁盘。
创建新密钥。
$KeyName = <name of key> $KeySize = 3072 az keyvault key create --vault-name $KeyVault --name $KeyName --ops wrapKey unwrapkey --kty RSA-HSM --size $KeySize --exportable true --policy "@.\skr-policy.json"
获取有关创建的密钥的信息。
$encryptionKeyVaultId = ((az keyvault show -n $KeyVault -g $resourceGroup) | ConvertFrom-Json).id $encryptionKeyURL= ((az keyvault key show --vault-name $KeyVault --name $KeyName) | ConvertFrom-Json).key.kid
使用 DES ARM 模板(
deployDES.json
)部署磁盘加密集 (DES)。$desName = <name of DES> $deployName = <name of deployment> $desArmTemplate = <name of DES ARM template file> az deployment group create ` -g $resourceGroup ` -n $deployName ` -f $desArmTemplate ` -p desName=$desName ` -p encryptionKeyURL=$encryptionKeyURL ` -p encryptionKeyVaultId=$encryptionKeyVaultId ` -p region=$region
分配对 DES 文件的密钥访问权限。
$desIdentity= (az disk-encryption-set show -n $desName -g $resourceGroup --query [identity.principalId] -o tsv) az keyvault set-policy -n $KeyVault ` -g $resourceGroup ` --object-id $desIdentity ` --key-permissions wrapkey unwrapkey get
(可选)从 Azure 托管 HSM 创建新密钥。
准备密钥发布策略并将其下载到本地磁盘。
创建新密钥。
$KeyName = <name of key> $KeySize = 3072 az keyvault key create --hsm-name $hsm --name $KeyName --ops wrapKey unwrapkey --kty RSA-HSM --size $KeySize --exportable true --policy "@.\skr-policy.json"
获取有关创建的密钥的信息。
$encryptionKeyURL = ((az keyvault key show --hsm-name $hsm --name $KeyName) | ConvertFrom-Json).key.kid
部署 DES。
$desName = <name of DES> az disk-encryption-set create -n $desName ` -g $resourceGroup ` --key-url $encryptionKeyURL
分配对 DES 的密钥访问权限。
desIdentity=$(az disk-encryption-set show -n $desName -g $resourceGroup --query [identity.principalId] -o tsv) az keyvault set-policy -n $hsm ` -g $resourceGroup ` --object-id $desIdentity ` --key-permissions wrapkey unwrapkey get
使用客户管理的密钥部署机密 VM。
获取 DES 的资源 ID。
$desID = (az disk-encryption-set show -n $desName -g $resourceGroup --query [id] -o tsv)
使用 Intel TDX 的机密 VM ARM 模板和具有客户管理的密钥(例如,
azuredeploy.parameters.win2022.json
)部署参数文件部署机密 VM。$deployName = <name of deployment> $vmName = <name of confidential VM> $cvmArmTemplate = <name of confidential VM ARM template file> $cvmParameterFile = <name of confidential VM parameter file> az deployment group create ` -g $resourceGroup ` -n $deployName ` -f $cvmArmTemplate ` -p $cvmParameterFile ` -p diskEncryptionSetId=$desID ` -p vmName=$vmName
连接到机密 VM,以确保创建成功。