你当前正在访问 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 CLI 部署机密 VM 模板

可以通过平台管理的密钥部署具有可选 OS 磁盘机密加密的机密 VM 模板。

若要通过 Azure CLI 使用 ARM 模板创建和部署机密 VM:

  1. 在 Azure CLI 中登录到 Azure 帐户。

    az login
    
  2. 设置 Azure 订阅。 将 <subscription-id> 替换为订阅标识符。 确保使用符合先决条件的订阅。

    az account set --subscription <subscription-id>
    
  3. 为机密 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
    
  4. 使用带有自定义参数文件的 ARM 模板将 VM 部署到 Azure。 对于 TDX 部署,下面是一个示例模板:https://aka.ms/TDXtemplate

    az deployment group create `
     -g $resourceGroup `
     -n $deployName `
     -u "https://aka.ms/CVMTemplate" `
     -p "<json-parameter-file-path>" `
     -p vmLocation=$region `
        vmName=$vmName
    

定义自定义参数文件

通过 Azure 命令行接口 (Azure CLI) 创建机密 VM 时,需要定义自定义参数文件。 若要创建自定义 JSON 参数文件:

  1. 通过 Azure CLI 登录到你的 Azure 帐户。

  2. 创建 JSON 参数文件。 例如,azuredeploy.parameters.json

  3. 根据所使用的 OS 映像,将示例 Windows 参数文件示例 Linux 参数文件复制到你的参数文件中。

  4. 根据需要在参数文件中编辑 JSON 代码。 例如,可更新 OS 映像名称 (osImageName) 或管理员用户名 (adminUsername)。

  5. 配置安全类型设置 (securityType)。 选择 VMGuestStateOnly 以便不使用 OS 磁盘机密加密。 或者,选择 DiskWithVMGuestState 以便使用平台管理的密钥进行 OS 磁盘机密加密。 对于 Intel TDX SKU 和基于 Linux 的映像,客户仅可以选择使用临时 vTPM 部署 NonPersistedTPM 安全类型。 对于 NonPersistedTPM 安全类型,请在模板文件中的 Microsoft.Compute/virtualMachines 下使用 "apiVersion": "2023-09-01"。

  6. 保存参数文件。

示例 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 模板

  1. 通过 Azure CLI 登录到你的 Azure 帐户。

    az login
    
  2. 设置 Azure 订阅。 将 <subscription-id> 替换为订阅标识符。 确保使用符合先决条件的订阅。

    az account set --subscription <subscription-id>
    
  3. 向租户授予机密 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"
    
  4. 设置 Azure 密钥保管库。 有关如何改用 Azure 密钥保管库托管 HSM,请参阅下一步。

    1. 为密钥保管库创建资源组。 密钥保管库实例和机密 VM 必须位于同一 Azure 区域中。

      $resourceGroup = <key vault resource group>
      $region = <Azure region>
      az group create --name $resourceGroup --location $region
      
    2. 创建具有高级 SKU 的密钥保管库实例并选择首选区域。 不支持标准 SKU。

      $KeyVault = <name of key vault>
      az keyvault create --name $KeyVault --resource-group $resourceGroup --location $region --sku Premium --enable-purge-protection
      
    3. 确保你在此密钥保管库中拥有所有者角色。

    4. Confidential VM Orchestrator 授予对密钥保管库执行 getrelease 操作的权限。

      $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
      
  5. (可选)如果不想使用 Azure 密钥保管库,可以改为创建 Azure 密钥保管库托管 HSM。

    1. 按照创建 Azure 密钥保管库托管 HSM 的快速入门来预配和激活 Azure 密钥保管库托管 HSM。

    2. 在 Azure 托管 HSM 上启用清除保护。 启用密钥发布需要此步骤。

      az keyvault update-hsm --subscription $subscriptionId -g $resourceGroup --hsm-name $hsm --enable-purge-protection true
      
    3. 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
      
  6. 使用 Azure 密钥保管库创建新密钥。 有关如何改用 Azure 托管 HSM,请参阅下一步。

    1. 准备密钥发布策略并将其下载到本地磁盘。

    2. 创建新密钥。

      $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"
      
    3. 获取有关创建的密钥的信息。

      $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
      
    4. 使用 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
      
    5. 分配对 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
      
  7. (可选)从 Azure 托管 HSM 创建新密钥。

    1. 准备密钥发布策略并将其下载到本地磁盘。

    2. 创建新密钥。

      $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"
      
    3. 获取有关创建的密钥的信息。

      $encryptionKeyURL = ((az keyvault key show --hsm-name $hsm --name $KeyName) | ConvertFrom-Json).key.kid
      
    4. 部署 DES。

      $desName = <name of DES>
      az disk-encryption-set create -n $desName `
       -g $resourceGroup `
       --key-url $encryptionKeyURL
      
    5. 分配对 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
      
  8. 使用客户管理的密钥部署机密 VM。

    1. 获取 DES 的资源 ID。

      $desID = (az disk-encryption-set show -n $desName -g $resourceGroup --query [id] -o tsv)
      
    2. 使用适用于 AMD SEV-SNPIntel 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
      
  9. 连接到机密 VM,以确保创建成功。

后续步骤