你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

快速入门:使用 Azure CLI 创建机密 VM

适用于:✔️ Linux VM ✔️ Windows VM

本快速入门介绍如何使用 Azure 命令行接口 (Azure CLI) 在 Azure 中部署机密虚拟机(机密 VM)。 Azure CLI 用于从命令行或脚本创建和管理 Azure 资源。

先决条件

如果还没有 Azure 订阅,可以在开始前创建一个免费 Azure 帐户

启动 Azure Cloud Shell

Azure Cloud Shell 是免费的交互式 shell,可以使用它运行本文中的操作步骤。 它预安装有常用 Azure 工具并将其配置与帐户一起使用。

若要打开 Cloud Shell,只需要从代码块的右上角选择“试一试”。 也可以在单独的浏览器标签页中通过转到 https://shell.azure.com/bash 打开 Cloud Shell。 选择“复制”以复制代码块,将其粘贴到 Cloud Shell 中,然后选择 Enter 来运行它。

如果希望在本地安装并使用 CLI,则本快速入门需要 Azure CLI 2.38.0 版或更高版本。 运行 az--version 即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI

创建资源组

使用“az group create”命令创建资源组。 Azure 资源组是在其中部署和管理 Azure 资源的逻辑容器。 以下示例在“northeurope”位置创建名为“myResourceGroup”的资源组:

注意

机密 VM 并非在所有位置都可用。 有关当前支持的位置,请参阅可用的 VM 产品(按 Azure 区域)

az group create --name myResourceGroup --location northeurope

使用平台管理的密钥创建机密虚拟机

使用 az vm create 命令创建 VM。

以下示例创建一个名为 myVM 的 VM 并添加一个名为 azureuser 的用户帐户。 --generate-ssh-keys 参数用于自动生成 SSH 密钥,并将其放置在默认密钥位置 (~/.ssh)。 若要改为使用一组特定的密钥,请使用 --ssh-key-values 选项。 对于 size,请选择机密 VM 大小。 有关详细信息,请参阅支持的机密 VM 系列

选择 VMGuestStateOnly 以便不使用 OS 磁盘机密加密。 或者,选择 DiskWithVMGuestState 以便使用平台管理的密钥进行 OS 磁盘机密加密。 默认情况下,安全启动处于启用状态,但对于 VMGuestStateOnly 是可选的。 有关详细信息,请参阅安全启动和 vTPM。 有关磁盘加密和主机加密的详细信息,请参阅机密 OS 磁盘加密主机加密

az vm create \
  --resource-group myResourceGroup \
  --name myVM \
  --size Standard_DC4es_v5 \
  --admin-username <azure-username> \
  --admin-password <azure-password> \
  --enable-vtpm true \
  --image "Canonical:0001-com-ubuntu-confidential-vm-jammy:22_04-lts-cvm:latest" \
  --public-ip-sku Standard \
  --security-type ConfidentialVM \
  --os-disk-security-encryption-type VMGuestStateOnly \
  --enable-secure-boot true \
  --encryption-at-host \

创建 VM 和支持资源需要几分钟时间。 以下示例输出表明 VM 创建操作已成功。

{
  "fqdns": "",
  "id": "/subscriptions/<guid>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM",
  "location": "northeurope",
  "macAddress": "<MAC-address>",
  "powerState": "VM running",
  "privateIpAddress": "10.20.255.255",
  "publicIpAddress": "192.168.255.255",
  "resourceGroup": "myResourceGroup",
  "zones": ""
}

记下要在以后使用的 publicIpAddress

使用客户管理的密钥创建机密虚拟机

若要创建机密磁盘加密集,你有两种选择:使用 Azure Key VaultAzure Key Vault 托管硬件安全模块 (HSM)。 根据安全性和合规性需求,可以选择任一选项。 但是,请务必注意,标准 SKU 不受支持。 以下示例使用 Azure Key Vault 高级版。

  1. 向租户授予机密 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"
  1. 使用 az keyvault create 命令创建 Azure Key Vault。 对于定价层,选择“高级(支持由 HSM 提供技术支持的密钥)”。 确保你在此密钥保管库中拥有所有者角色。
az keyvault create -n keyVaultName -g myResourceGroup --enabled-for-disk-encryption true --sku premium --enable-purge-protection true
  1. Confidential VM Orchestrator 授予对密钥保管库执行 getrelease 操作的权限。
$cvmAgent = az ad sp show --id "bf7b6499-ff71-4aa2-97a4-f372087be7f0" | Out-String | ConvertFrom-Json
az keyvault set-policy --name keyVaultName --object-id $cvmAgent.Id --key-permissions get release
  1. 使用 az keyvault key create 在密钥保管库中创建密钥。 对于密钥类型,请使用 RSA-HSM。
az keyvault key create --name mykey --vault-name keyVaultName --default-cvm-policy --exportable --kty RSA-HSM
  1. 使用 az disk-encryption-set create 创建磁盘加密集。 将加密类型设置为 ConfidentialVmEncryptedWithCustomerKey
$keyVaultKeyUrl=(az keyvault key show --vault-name keyVaultName --name mykey--query [key.kid] -o tsv)

az disk-encryption-set create --resource-group myResourceGroup --name diskEncryptionSetName --key-url $keyVaultKeyUrl  --encryption-type ConfidentialVmEncryptedWithCustomerKey
  1. 使用 az key vault set-policy 授予磁盘加密集资源对密钥保管库的访问权限。
$desIdentity=(az disk-encryption-set show -n diskEncryptionSetName -g myResourceGroup --query [identity.principalId] -o tsv)

az keyvault set-policy -n keyVaultName -g myResourceGroup --object-id $desIdentity --key-permissions wrapkey unwrapkey get
  1. 使用磁盘加密集 ID 创建 VM。
$diskEncryptionSetID=(az disk-encryption-set show -n diskEncryptionSetName -g myResourceGroup --query [id] -o tsv)
  1. 使用 az vm create 命令创建 VM。 选择 DiskWithVMGuestState 使用客户管理的密钥进行 OS 磁盘机密加密。 是否启用安全启动是可选的,但建议启用。 有关详细信息,请参阅安全启动和 vTPM。 有关磁盘加密的详细信息,请参阅机密 OS 磁盘加密
az vm create \
--resource-group myResourceGroup \
--name myVM \
--size Standard_DC4as_v5 \
--admin-username <azure-user> \
--admin-password <azure-password> \
--enable-vtpm true \
--enable-secure-boot true \
--image "Canonical:0001-com-ubuntu-confidential-vm-focal:20_04-lts-cvm:latest" \
--public-ip-sku Standard \
--security-type ConfidentialVM \
--os-disk-security-encryption-type DiskWithVMGuestState \
--os-disk-secure-vm-disk-encryption-set $diskEncryptionSetID \

创建 VM 和支持资源需要几分钟时间。 以下示例输出表明 VM 创建操作已成功。

{
  "fqdns": "",
  "id": "/subscriptions/<guid>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM",
  "location": "eastus",
  "macAddress": "<MAC-address>",
  "powerState": "VM running",
  "privateIpAddress": "10.20.255.255",
  "publicIpAddress": "192.168.255.255",
  "resourceGroup": "myResourceGroup",
  "zones": ""
}

记下要在以后使用的 publicIpAddress

通过 Microsoft Azure 证明示例应用连接并证明基于 AMD 的 CVM

若要将 C++ 中的示例应用程序与来宾证明 API 一起使用,请执行以下步骤。 此示例使用 Linux 机密虚拟机。 对于 Windows,请参阅适用于 Windows 的生成说明

  1. 使用机密 VM 的公共 IP 地址登录到机密 VM。

  2. 克隆示例 Linux 应用程序

  3. 安装 build-essential 包。 此包安装编译示例应用程序所需的所有内容。

sudo apt-get install build-essential
  1. 安装以下包。
sudo apt-get install libcurl4-openssl-dev
sudo apt-get install libjsoncpp-dev
sudo apt-get install libboost-all-dev
sudo apt install nlohmann-json3-dev
  1. 下载证明包

  2. 安装证明包。 确保将 <version> 替换为已下载的版本。

sudo dpkg -i azguestattestation1_<latest-version>_amd64.deb
  1. 安装上述包后,使用以下步骤生成和运行应用。
cd confidential-computing-cvm-guest-attestation/cvm-attestation-sample-app
sudo cmake . && make
sudo ./AttestationClient -o token
  1. 若要将 Web 令牌转换为 JSON,请执行以下步骤。
sudo ./AttestationClient -o token>> /attestation_output

JWT=$(cat /attestation_output)

echo -n $JWT | cut -d "." -f 1 | base64 -d 2>/dev/null | jq .
echo -n $JWT | cut -d "." -f 2 | base64 -d 2>/dev/null | jq .

后续步骤