Inicio rápido : Creación de una máquina virtual confidencial con la CLI de Azure

Se aplica a: ✔️ Máquinas virtuales Linux ✔️ Máquinas virtuales Windows

En este inicio rápido se muestra cómo usar la interfaz de la línea de comandos de Azure (CLI de Azure) para implementar una máquina virtual confidencial (VM confidencial) en Azure. La CLI de Azure se usa para crear y administrar recursos de Azure mediante la línea de comandos o scripts.

Requisitos previos

Si no tiene una suscripción a Azure, cree una cuenta gratuita de Azure antes de empezar.

Inicio de Azure Cloud Shell

Azure Cloud Shell es un shell interactivo gratuito que puede usar para ejecutar los pasos de este artículo. Tiene las herramientas comunes de Azure preinstaladas y configuradas para usarlas en la cuenta.

Para abrir Cloud Shell, seleccione Pruébelo en la esquina superior derecha de un bloque de código. También puede abrir Cloud Shell en una pestaña independiente acudiendo a https://shell.azure.com/bash. Seleccione Copiar para copiar los bloques de código, péguelos en Cloud Shell y, después, seleccione Entrar para ejecutarlos.

Si prefiere instalar y usar la CLI de forma local, en este inicio rápido se requiere la versión 2.38.0 o posterior de la CLI de Azure. Ejecute az--version para encontrar la versión. Si necesita instalarla o actualizarla, vea Instalación de la CLI de Azure.

Crear un grupo de recursos

Para crear un grupo de recursos, use el comando az group create. Un grupo de recursos de Azure es un contenedor lógico en el que se implementan y se administran los recursos de Azure. En el ejemplo siguiente, se crea un grupo de recursos denominado myResourceGroup en la ubicación northeurope:

Nota:

Las máquinas virtuales confidenciales no están disponibles en todas las ubicaciones. Para las ubicaciones admitidas actualmente, consulte qué productos de máquina virtual están disponibles en la región de Azure.

az group create --name myResourceGroup --location northeurope

Creación de una máquina virtual confidencial mediante una clave administrada por la plataforma

Cree la máquina virtual con el comando az vm create.

En el ejemplo siguiente se crea una máquina virtual llamada myVM y se agrega una cuenta de usuario llamada azureuser. El parámetro --generate-ssh-keys se usa para generar automáticamente una clave SSH y colocarla en la ubicación de la clave predeterminada (~/.ssh). Para utilizar un conjunto de claves concreto, utilice la opción --ssh-key-values. En size, seleccione un tamaño de máquina virtual confidencial. Para más información, consulte las familias de máquinas virtuales confidenciales admitidas.

Elija VMGuestStateOnly para no usar ningún cifrado confidencial de disco del sistema operativo. O bien, elija DiskWithVMGuestState para usar un cifrado confidencial del disco del sistema operativo con una clave administrada por la plataforma. El arranque seguro está habilitado de forma predeterminada, pero es opcional para VMGuestStateOnly. Para obtener más información, consulte arranque seguro y vTPM. Para obtener más información sobre el cifrado de disco y el cifrado en el host, consulte Cifrado de disco del sistema operativo confidencial y Cifrado en el host.

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 \

La creación de la máquina virtual y los recursos auxiliares tarda unos minutos en realizarse. En la salida de ejemplo siguiente se muestra que la operación de creación de la máquina virtual se realizó correctamente.

{
  "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": ""
}

Anote el elemento publicIpAddress que se va a usar más adelante.

Creación de una máquina virtual confidencial mediante una clave administrada por el cliente

Para crear un conjunto de cifrado de disco confidencial tiene dos opciones: usar Azure Key Vault o el Módulo de seguridad de hardware (HSM) administrado por Azure Key Vault. En función de sus necesidades de seguridad y cumplimiento, puede elegir cualquiera de las opciones. Sin embargo, es importante tener en cuenta que no se admite la SKU estándar. En el ejemplo siguiente se usa Azure Key Vault Premium.

  1. Conceda al inquilino la entidad de servicio VM confidencial Confidential VM Orchestrator. Para este paso es preciso ser Administración global o tener el rol RBAC de administrador de acceso de usuario. Instale el SDK de Microsoft Graph para ejecutar los comandos siguientes.
Connect-Graph -Tenant "your tenant ID" Application.ReadWrite.All
New-MgServicePrincipal -AppId bf7b6499-ff71-4aa2-97a4-f372087be7f0 -DisplayName "Confidential VM Orchestrator"
  1. Cree una instancia de Azure Key Vault mediante el comando az keyvault create. En el plan de tarifa, seleccione Premium (incluye compatibilidad con claves respaldadas por HSM). Asegúrese de que tiene un rol de propietario en este almacén de claves.
az keyvault create -n keyVaultName -g myResourceGroup --enabled-for-disk-encryption true --sku premium --enable-purge-protection true
  1. Conceda a Confidential VM Orchestrator permisos para usar get y release con el almacén de claves.
$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. Cree una clave en el almacén de claves mediante az keyvault key create. Para el tipo de clave, use RSA-HSM.
az keyvault key create --name mykey --vault-name keyVaultName --default-cvm-policy --exportable --kty RSA-HSM
  1. Cree el conjunto de cifrado de disco mediante az disk-encryption-set create. Establezca el tipo de cifrado en 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. Conceda al almacén de claves acceso al recurso del conjunto de cifrado de disco mediante 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. Use el identificador del conjunto de cifrado de disco para crear la máquina virtual.
$diskEncryptionSetID=(az disk-encryption-set show -n diskEncryptionSetName -g myResourceGroup --query [id] -o tsv)
  1. Cree la máquina virtual con el comando az vm create. Elija DiskWithVMGuestState para usar un cifrado confidencial del disco del sistema operativo con una clave administrada por el cliente. La habilitación del arranque seguro es opcional, pero se recomienda. Para obtener más información, consulte arranque seguro y vTPM. Para obtener más información sobre el cifrado de disco, consulte Cifrado de disco del sistema operativo confidencial.
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 \

La creación de la máquina virtual y los recursos auxiliares tarda unos minutos en realizarse. En la salida de ejemplo siguiente se muestra que la operación de creación de la máquina virtual se realizó correctamente.

{
  "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": ""
}

Anote el elemento publicIpAddress que se va a usar más adelante.

Conexión y atestación de la CVM con la aplicación de ejemplo de Microsoft Azure Attestation

Para usar una aplicación de ejemplo en C++ con las API de atestación de invitado, siga los siguientes pasos. En este ejemplo se usa una máquina virtual confidencial de Linux. Para Windows, consulte las instrucciones de compilación de Windows.

  1. Inicie sesión en la máquina virtual confidencial con su dirección IP pública.

  2. Clonación de la aplicación Linux de ejemplo.

  3. Instale el paquete build-essential. Este paquete instala todo lo necesario para compilar la aplicación de ejemplo.

sudo apt-get install build-essential
  1. Instale los paquetes siguientes.
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. Descargue el paquete de atestación.

  2. Instale el paquete de atestación. Asegúrese de reemplazar <version> por la versión que ha descargado.

sudo dpkg -i azguestattestation1_<latest-version>_amd64.deb
  1. Una vez instalados los paquetes anteriores, siga estos pasos para compilar y ejecutar la aplicación.
cd confidential-computing-cvm-guest-attestation/cvm-attestation-sample-app
sudo cmake . && make
sudo ./AttestationClient -o token
  1. Para convertir el token web en un JSON, siga estos pasos.
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 .

Pasos siguientes