Use una cuenta de Azure asociada a la suscripción de Azure que contiene la máquina virtual.
Para habilitar la identidad administrada asignada por el sistema, cargue la plantilla en un editor, busque el recurso de interés Microsoft.Compute/virtualMachines
en la sección resources
y agregue la propiedad "identity"
en el mismo nivel que la propiedad "type": "Microsoft.Compute/virtualMachines"
. Use la sintaxis siguiente:
"identity": {
"type": "SystemAssigned"
},
La plantilla final tiene el siguiente ejemplo
"resources": [
{
"apiVersion": "2021-11-01",
"type": "Microsoft.Compute/virtualMachines",
"name": "[parameters('vmName')]",
"location": "[parameters('location')]",
"identity": {
"type": "SystemAssigned",
},
//other resource provider properties...
}
]
Adición de la directiva de acceso a Azure Key Vault
Una vez que habilite una identidad administrada asignada por el sistema para el CVM, debe proporcionarla con acceso al plano de datos de Azure Key Vault donde se almacenan los objetos de clave. Para asegurarse de que solo nuestra máquina virtual confidencial pueda ejecutar la operación de versión, solo se concederá el permiso específico necesario.
Nota:
Puede encontrar el identificador de objeto de identidad administrada en las opciones de identidad de máquina virtual, en Azure Portal. Como alternativa, puede recuperarlo con PowerShell, la CLI de Azure, Bicep o plantillas de ARM.
[Bicep 1]
@description('Required. Specifies the object ID of a user, service principal or security group in the Azure Active Directory tenant for the vault. The object ID must be unique for the list of access policies. Get it by using Get-AzADUser or Get-AzADServicePrincipal cmdlets.')
param objectId string
resource keyVaultCvmAccessPolicy 'Microsoft.KeyVault/vaults/accessPolicies@2022-07-01' = {
parent: keyVault
name: 'add'
properties: {
accessPolicies: [
{
objectId: objectId
tenantId: tenantId
permissions: {
keys: [
'release'
]
}
}
]
}
}
[Plantilla de ARM 2]
{
"type": "Microsoft.KeyVault/vaults/accessPolicies",
"apiVersion": "2022-07-01",
"name": "[format('{0}/{1}', 'mykeyvault', 'add')]",
"properties": {
"accessPolicies": [
{
"objectId": "[parameters('objectId')]",
"tenantId": "[parameters('tenantId')]",
"permissions": {
"keys": [
"release"
]
}
}
]
},
"dependsOn": [
"[resourceId('Microsoft.KeyVault/vaults', 'mykeyvault')]"
]
}
Preparación de la directiva de versión
Las directivas de versión de clave segura de Key Vault se modelan después de Azure Policy, con una gramática ligeramente diferente.
La idea es cuando pasamos el informe de plataforma atestiguada, en forma de json Web Token (JWT), a Key Vault. A su vez, examinará el JWT y comprobará si las notificaciones del informe de plataforma atestiguadas coinciden con las notificaciones de la directiva.
Por ejemplo, supongamos que queremos liberar una clave solo cuando nuestro informe de plataforma atestiguado tiene propiedades como:
- Atestiguado por el punto de conexión de servicio de Microsoft Azure Attestation (MAA) "https://sharedweu.weu.attest.azure.net".
- Este
authority
valor de la directiva se compara con la iss
propiedad (emisor) en el token.
- Y que también contiene un objeto llamado
x-ms-isolation-tee
con una propiedad denominada x-ms-attestation-type
, que contiene el valor sevsnpvm
.
- MAA como servicio de Azure ha atestiguado que el CVM se ejecuta en un procesador original AMD SEV-SNP.
- Y que también contiene un objeto llamado
x-ms-isolation-tee
con una propiedad denominada x-ms-compliance-status
, que contiene el valor azure-compliant-cvm
.
- MAA como servicio de Azure tiene la capacidad de atestiguar que CVM es una máquina virtual confidencial de Azure compatible.
Cree una carpeta denominada assets
y agregue el siguiente contenido JSON a un archivo denominado cvm-release-policy.json
:
{
"version": "1.0.0",
"anyOf": [
{
"authority": "https://sharedweu.weu.attest.azure.net",
"allOf": [
{
"claim": "x-ms-isolation-tee.x-ms-attestation-type",
"equals": "sevsnpvm"
},
{
"claim": "x-ms-isolation-tee.x-ms-compliance-status",
"equals": "azure-compliant-cvm"
}
]
}
]
}
La directiva de versión es una anyOf
condición que contiene una matriz de autoridades clave. Una claim
condición es un objeto JSON que identifica un nombre de notificación, una condición para la coincidencia y un valor. Los AnyOf
objetos de condición y AllOf
permiten el modelado de un valor lógico OR
y AND
. Actualmente, solo podemos realizar una equals
comparación en .claim
Las propiedades de condición se colocan junto con authority
las propiedades.
Importante
Una aserción de entorno contiene al menos una clave de cifrado de claves y una o varias notificaciones sobre el entorno de destino (por ejemplo, tipo TEE, publicador, versión) que coinciden con la directiva de versión de clave. La clave de cifrado de claves es una clave RSA pública propiedad y protegida por el entorno de ejecución de destino que se usa para la exportación de claves. Debe aparecer en la notificación de claves TEE (x-ms-runtime/keys). Esta notificación es un objeto JSON que representa un JSON Web Key Set. Dentro de JWKS, una de las claves debe cumplir los requisitos para su uso como clave de cifrado (key_use es «enc» o key_ops contiene «encrypt»). Se elige la primera clave adecuada.
Key Vault elige la primera clave adecuada de la propiedad de matriz "keys
" en el objeto "x-ms-runtime
", busca una clave RSA pública con "key_use": ["enc"]
o "key_ops": ["encrypt"]
. Un ejemplo de un informe de plataforma atestiguado tendría el siguiente aspecto:
{
//...
"x-ms-runtime": {
"client-payload": {
"nonce": "MTIzNA=="
},
"keys": [
{
"e": "AQAB",
"key_ops": [
"encrypt"
],
"kid": "TpmEphemeralEncryptionKey",
"kty": "RSA",
"n": "9v2XQgAA6y18CxV8dSGnh..."
}
]
},
//...
}
En este ejemplo, solo tenemos una clave en la ruta de acceso $.x-ms-runtime.keys
. Key Vault usa la TpmEphemeralEncryptionKey
clave como clave de cifrado de claves.
Nota:
Tenga en cuenta que puede haber una clave en $.x-ms-isolation-tee.x-ms-runtime.keys
, no es la clave que usará Key Vault.
Creación de una clave exportable con la directiva de versión
Creamos una directiva de acceso de Key Vault que permite a una máquina virtual confidencial de Azure realizar la release
operación de clave. Por último, debemos incluir nuestra directiva de versión como una cadena codificada en base64 durante la creación de la clave. La clave debe ser una clave exportable , respaldada por un HSM.
Nota:
Las claves respaldadas por HSM están disponibles con Azure Key Vault Premium y HSM administrado de Azure Key Vault.
[Bicep 2]
@description('The type of the key. For valid values, see JsonWebKeyType. Must be backed by HSM, for secure key release.')
@allowed([
'EC-HSM'
'RSA-HSM'
])
param keyType string = 'RSA-HSM'
@description('Not before date in seconds since 1970-01-01T00:00:00Z.')
param keyNotBefore int = -1
@description('Expiry date in seconds since 1970-01-01T00:00:00Z.')
param keyExpiration int = -1
@description('The elliptic curve name. For valid values, see JsonWebKeyCurveName.')
@allowed([
'P-256'
'P-256K'
'P-384'
'P-521'
])
param curveName string
@description('The key size in bits. For example: 2048, 3072, or 4096 for RSA.')
param keySize int = -1
resource exportableKey 'Microsoft.KeyVault/vaults/keys@2022-07-01' = {
parent: keyVault
name: 'mykey'
properties: {
kty: keyType
attributes: {
exportable: true
enabled: true
nbf: keyNotBefore == -1 ? null : keyNotBefore
exp: keyExpiration == -1 ? null : keyExpiration
}
curveName: curveName // applicable when using key type (kty) 'EC'
keySize: keySize == -1 ? null : keySize
keyOps: ['encrypt','decrypt'] // encrypt and decrypt only work with RSA keys, not EC
release_policy: {
contentType: 'application/json; charset=utf-8'
data: loadFileAsBase64('assets/cvm-release-policy.json')
}
}
}
[Plantilla de ARM 2]
{
"type": "Microsoft.KeyVault/vaults/keys",
"apiVersion": "2022-07-01",
"name": "[format('{0}/{1}', 'mykeyvault', 'mykey')]",
"properties": {
"kty": "RSA-HSM",
"attributes": {
"exportable": true,
"enabled": true,
"nbf": "[if(equals(parameters('keyNotBefore'), -1), null(), parameters('keyNotBefore'))]",
"exp": "[if(equals(parameters('keyExpiration'), -1), null(), parameters('keyExpiration'))]"
},
"curveName": "[parameters('curveName')]",
"keySize": "[if(equals(parameters('keySize'), -1), null(), parameters('keySize'))]",
"keyOps": [
"encrypt",
"decrypt"
],
"release_policy": {
"contentType": "application/json; charset=utf-8",
"data": "[variables('cvmReleasePolicyBase64EncodedString')]"
}
},
"dependsOn": [
"[resourceId('Microsoft.KeyVault/vaults', 'mykeyvault')]"
]
}
Podemos comprobar que Key Vault ha creado una clave nueva, respaldada por HSM y que contiene nuestra directiva de versión de clave segura; para ello, vaya a Azure Portal y seleccione la clave. La clave prevista se marcará como "exportable".
Cliente de atestación de invitado
La atestación nos ayuda a evaluar criptográficamente que algo se está ejecutando en el estado operativo previsto. Es el proceso por el que una parte, el comprobador, evalúa la confiabilidad de un par potencialmente que no es de confianza, el atestador. Con la atestación de invitado remoto, el entorno de ejecución de confianza ofrece una plataforma que le permite ejecutar un sistema operativo completo dentro de él.
Importante
Microsoft ofrece una biblioteca de C/C++, tanto para Windows como para Linux que pueden ayudar a sus esfuerzos de desarrollo. La biblioteca facilita la adquisición de un informe de plataforma SEV-SNP del hardware y también de tenerlo atestiguado por una instancia del servicio Azure Attestation. El servicio Azure Attestation puede ser uno hospedado por Microsoft (compartido) o por su propia instancia privada.
Se puede elegir un archivo binario de cliente de Windows y Linux código abierto que utiliza la biblioteca de atestación de invitado para facilitar el proceso de atestación de invitado con LAS VM. El binario cliente devuelve el informe de plataforma atestiguada como un token web JSON, que es lo que se necesita para la operación de clave de release
Key Vault.
Nota:
Un token del servicio Azure Attestation es válido durante 8 horas.
[Linux]
Inicie sesión en la máquina virtual.
Clonación de la aplicación Linux de ejemplo.
Instale el paquete build-essential
. Este paquete instala todo lo necesario para compilar la aplicación de ejemplo.
sudo apt-get install build-essential
Instale los paquetes libcurl4-openssl-dev
y libjsoncpp-dev
.
sudo apt-get install libcurl4-openssl-dev
sudo apt-get install libjsoncpp-dev
Descargue el paquete de atestación.
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
Para ejecutar el cliente de ejemplo, vaya dentro de la carpeta descomprimida y ejecute el siguiente comando:
sudo ./AttestationClient -a <attestation-url> -n <nonce-value> -o token
Nota:
Si -o
no se especifica como token
, el exe imprime un resultado binario true o false en función del resultado de atestación y de la plataforma que es sevsnp
.
Inicie sesión en la máquina virtual.
Clonación de la aplicación Windows de ejemplo.
Navegue dentro de la carpeta descomprimida y ejecute VC_redist.x64.exe
. VC_redist instalará bibliotecas en tiempo de ejecución de Microsoft C y C++ (MSVC) en la máquina.
Para ejecutar el cliente de ejemplo, vaya dentro de la carpeta descomprimida y ejecute el siguiente comando:
sudo ./AttestationClient -a <attestation-url> -n <nonce-value> -o token
Nota:
Si -o
no se especifica como token
, el exe imprime un resultado binario true o false en función del resultado de atestación y de la plataforma que es sevsnp
.
Resultado de la atestación de invitado
El resultado del cliente de atestación de invitado es simplemente una cadena codificada en base64. Este valor de cadena codificado es un token web JSON (JWT) firmado, con un encabezado, un cuerpo y una firma. Puede dividir la cadena por el .
valor (punto) y base64 descodificar los resultados.
eyJhbGciO...
El encabezado contiene un jku
, también conocido como URI de conjunto de JWK que vincula a un conjunto de claves públicas codificadas en JSON. Uno de los cuales corresponde a la clave usada para firmar digitalmente el JWS. kid
indica qué clave se usó para firmar el JWS.
{
"alg": "RS256",
"jku": "https://sharedweu.weu.attest.azure.net/certs",
"kid": "dRKh+hBcWUfQimSl3Iv6ZhStW3TSOt0ThwiTgUUqZAo=",
"typ": "JWT"
}
El cuerpo de la respuesta de atestación de invitado se validará mediante Azure Key Vault como entrada para probar la directiva de versión de claves. Como se indicó anteriormente, Azure Key Vault usa "TpmEphemeralEncryptionKey
" como clave de cifrado de claves.
{
"exp": 1671865218,
"iat": 1671836418,
"iss": "https://sharedweu.weu.attest.azure.net",
"jti": "ce395e5de9c638d384cd3bd06041e674edee820305596bba3029175af2018da0",
"nbf": 1671836418,
"secureboot": true,
"x-ms-attestation-type": "azurevm",
"x-ms-azurevm-attestation-protocol-ver": "2.0",
"x-ms-azurevm-attested-pcrs": [
0,
1,
2,
3,
4,
5,
6,
7
],
"x-ms-azurevm-bootdebug-enabled": false,
"x-ms-azurevm-dbvalidated": true,
"x-ms-azurevm-dbxvalidated": true,
"x-ms-azurevm-debuggersdisabled": true,
"x-ms-azurevm-default-securebootkeysvalidated": true,
"x-ms-azurevm-elam-enabled": false,
"x-ms-azurevm-flightsigning-enabled": false,
"x-ms-azurevm-hvci-policy": 0,
"x-ms-azurevm-hypervisordebug-enabled": false,
"x-ms-azurevm-is-windows": false,
"x-ms-azurevm-kerneldebug-enabled": false,
"x-ms-azurevm-osbuild": "NotApplication",
"x-ms-azurevm-osdistro": "Ubuntu",
"x-ms-azurevm-ostype": "Linux",
"x-ms-azurevm-osversion-major": 20,
"x-ms-azurevm-osversion-minor": 4,
"x-ms-azurevm-signingdisabled": true,
"x-ms-azurevm-testsigning-enabled": false,
"x-ms-azurevm-vmid": "6506B531-1634-431E-99D2-42B7D3414AD0",
"x-ms-isolation-tee": {
"x-ms-attestation-type": "sevsnpvm",
"x-ms-compliance-status": "azure-compliant-cvm",
"x-ms-runtime": {
"keys": [
{
"e": "AQAB",
"key_ops": [
"encrypt"
],
"kid": "HCLAkPub",
"kty": "RSA",
"n": "tXkRLAABQ7vgX96..1OQ"
}
],
"vm-configuration": {
"console-enabled": true,
"current-time": 1671835548,
"secure-boot": true,
"tpm-enabled": true,
"vmUniqueId": "6506B531-1634-431E-99D2-42B7D3414AD0"
}
},
"x-ms-sevsnpvm-authorkeydigest": "0000000000000..00",
"x-ms-sevsnpvm-bootloader-svn": 3,
"x-ms-sevsnpvm-familyId": "01000000000000000000000000000000",
"x-ms-sevsnpvm-guestsvn": 2,
"x-ms-sevsnpvm-hostdata": "0000000000000000000000000000000000000000000000000000000000000000",
"x-ms-sevsnpvm-idkeydigest": "57486a44..96",
"x-ms-sevsnpvm-imageId": "02000000000000000000000000000000",
"x-ms-sevsnpvm-is-debuggable": false,
"x-ms-sevsnpvm-launchmeasurement": "ad6de16..23",
"x-ms-sevsnpvm-microcode-svn": 115,
"x-ms-sevsnpvm-migration-allowed": false,
"x-ms-sevsnpvm-reportdata": "c6500..0000000",
"x-ms-sevsnpvm-reportid": "cf5ea742f08cb45240e8ad4..7eb7c6c86da6493",
"x-ms-sevsnpvm-smt-allowed": true,
"x-ms-sevsnpvm-snpfw-svn": 8,
"x-ms-sevsnpvm-tee-svn": 0,
"x-ms-sevsnpvm-vmpl": 0
},
"x-ms-policy-hash": "wm9mHlvTU82e8UqoOy1..RSNkfe99-69IYDq9eWs",
"x-ms-runtime": {
"client-payload": {
"nonce": ""
},
"keys": [
{
"e": "AQAB",
"key_ops": [
"encrypt"
],
"kid": "TpmEphemeralEncryptionKey", // key-encryption key candidate!
"kty": "RSA",
"n": "kVTLSwAAQpg..Q"
}
]
},
"x-ms-ver": "1.0"
}
La documentación del servicio Microsoft Azure Attestation tiene una lista extensa que contiene descripciones de todas estas notificaciones relacionadas con SEV-SNP.
Podemos usar cualquier scripting o lenguaje de programación para recibir un informe de plataforma atestiguado mediante el binario AttestationClient. Dado que la máquina virtual implementada en un paso anterior tiene habilitada la identidad administrada, deberíamos obtener un token de Azure AD para Key Vault desde el servicio de metadatos de instancia (IMDS).
Al configurar el informe de plataforma atestiguada como la carga del cuerpo y el token de Microsoft Entra en nuestro encabezado de autorización, tiene todo lo necesario para realizar la operación de clave release
.
#Requires -Version 7
#Requires -RunAsAdministrator
#Requires -PSEdition Core
<#
.SYNOPSIS
Perform Secure Key Release operation in Azure Key Vault, provided this script is running inside an Azure Confidential Virtual Machine.
.DESCRIPTION
Perform Secure Key Release operation in Azure Key Vault, provided this script is running inside an Azure Confidential Virtual Machine.
The release key operation is applicable to all key types. The target key must be marked exportable. This operation requires the keys/release permission.
.PARAMETER -AttestationTenant
Provide the attestation instance base URI, for example https://mytenant.attest.azure.net.
.PARAMETER -VaultBaseUrl
Provide the vault name, for example https://myvault.vault.azure.net.
.PARAMETER -KeyName
Provide the name of the key to get.
.PARAMETER -KeyName
Provide the version parameter to retrieve a specific version of a key.
.INPUTS
None.
.OUTPUTS
System.Management.Automation.PSObject
.EXAMPLE
PS C:\> .\Invoke-SecureKeyRelease.ps1 -AttestationTenant "https://sharedweu.weu.attest.azure.net" -VaultBaseUrl "https://mykeyvault.vault.azure.net/" -KeyName "mykey" -KeyVersion "e473cd4c66224d16870bbe2eb4c58078"
#>
param (
[Parameter(Mandatory = $true)]
[string]
$AttestationTenant,
[Parameter(Mandatory = $true)]
[string]
$VaultBaseUrl,
[Parameter(Mandatory = $true)]
[string]
$KeyName,
[Parameter(Mandatory = $false)]
[string]
$KeyVersion
)
# Check if AttestationClient* exists.
$fileExists = Test-Path -Path "AttestationClient*"
if (!$fileExists) {
throw "AttestationClient binary not found. Please download it from 'https://github.com/Azure/confidential-computing-cvm-guest-attestation'."
}
$cmd = $null
if ($isLinux) {
$cmd = "sudo ./AttestationClient -a $attestationTenant -o token"
}
elseif ($isWindows) {
$cmd = "./AttestationClientApp.exe -a $attestationTenant -o token"
}
$attestedPlatformReportJwt = Invoke-Expression -Command $cmd
if (!$attestedPlatformReportJwt.StartsWith("eyJ")) {
throw "AttestationClient failed to get an attested platform report."
}
## Get access token from IMDS for Key Vault
$imdsUrl = 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://vault.azure.net'
$kvTokenResponse = Invoke-WebRequest -Uri $imdsUrl -Headers @{Metadata = "true" }
if ($kvTokenResponse.StatusCode -ne 200) {
throw "Unable to get access token. Ensure Azure Managed Identity is enabled."
}
$kvAccessToken = ($kvTokenResponse.Content | ConvertFrom-Json).access_token
# Perform release key operation
if ([string]::IsNullOrEmpty($keyVersion)) {
$kvReleaseKeyUrl = "{0}/keys/{1}/release?api-version=7.3" -f $vaultBaseUrl, $keyName
}
else {
$kvReleaseKeyUrl = "{0}/keys/{1}/{2}/release?api-version=7.3" -f $vaultBaseUrl, $keyName, $keyVersion
}
$kvReleaseKeyHeaders = @{
Authorization = "Bearer $kvAccessToken"
'Content-Type' = 'application/json'
}
$kvReleaseKeyBody = @{
target = $attestedPlatformReportJwt
}
$kvReleaseKeyResponse = Invoke-WebRequest -Method POST -Uri $kvReleaseKeyUrl -Headers $kvReleaseKeyHeaders -Body ($kvReleaseKeyBody | ConvertTo-Json)
if ($kvReleaseKeyResponse.StatusCode -ne 200) {
Write-Error -Message "Unable to perform release key operation."
Write-Error -Message $kvReleaseKeyResponse.Content
}
else {
$kvReleaseKeyResponse.Content | ConvertFrom-Json
}
Respuesta de liberación de claves
La operación de liberación de clave segura solo devuelve una sola propiedad dentro de su carga JSON. Sin embargo, el contenido también se ha codificado en base64.
{
"value": "eyJhbGciOiJSUzI1NiIsImtpZCI6Ijg4RUFDM.."
}
Aquí tenemos otro encabezado, aunque este tiene una cadena de certificados X.509 como propiedad.
{
"alg": "RS256",
"kid": "88EAC2DB6BE4E051B0E05AEAF6CB79E675296121",
"x5t": "iOrC22vk4FGw4Frq9st55nUpYSE",
"typ": "JWT",
"x5t#S256": "BO7jbeU3BG0FEjetF8rSisRbkMfcdy0olhcnmYEwApA",
"x5c": [
"MIIIfDCCBmSgA..XQ==",
"MII..8ZZ8m",
"MII..lMrY="
]
}
Puede leer desde la matriz "x5c
" de PowerShell, lo que puede ayudarle a comprobar que se trata de un certificado válido. Aquí tiene un ejemplo:
$certBase64 = "MIIIfDCCBmSgA..XQ=="
$cert = [System.Security.Cryptography.X509Certificates.X509Certificate2]([System.Convert]::FromBase64String($certBase64))
$cert | Format-List *
# NotAfter : 9/18/2023 6:14:06 PM
# NotBefore : 9/23/2022 6:14:06 PM
# ...
# Issuer : CN=Microsoft Azure TLS Issuing CA 06, O=Microsoft Corporation, C=US
# Subject : CN=vault.azure.net, O=Microsoft Corporation, L=Redmond, S=WA, C=US
El cuerpo del token JWT de la respuesta es increíblemente similar a la respuesta que obtiene al invocar la operación de get
clave. Sin embargo, la release
operación incluye la key_hsm
propiedad, entre otras cosas.
{
"request": {
"api-version": "7.3",
"enc": "CKM_RSA_AES_KEY_WRAP",
"kid": "https://mykeyvault.vault.azure.net/keys/mykey"
},
"response": {
"key": {
"key": {
"kid": "https://mykeyvault.vault.azure.net/keys/mykey/e473cd4c66224d16870bbe2eb4c58078",
"kty": "RSA-HSM",
"key_ops": [
"encrypt",
"decrypt"
],
"n": "nwFQ8p..20M",
"e": "AQAB",
"key_hsm": "eyJzY2hlbW..GIifQ"
},
"attributes": {
"enabled": true,
"nbf": 1671577355,
"exp": 1703113355,
"created": 1671577377,
"updated": 1671827011,
"recoveryLevel": "Recoverable+Purgeable",
"recoverableDays": 90,
"exportable": true
},
"tags": {},
"release_policy": {
"data": "eyJ2ZXJzaW9uIjoiMS4wLjAiLCJhbnlPZiI6W3siYXV0aG9yaXR5IjoiaHR0cHM6Ly9zaGFyZWR3ZXUud2V1LmF0dGVzdC5henVyZS5uZXQiLCJhbGxPZiI6W3siY2xhaW0iOiJ4LW1zLWlzb2xhdGlvbi10ZWUueC1tcy1hdHRlc3RhdGlvbi10eXBlIiwiZXF1YWxzIjoic2V2c25wdm0ifSx7ImNsYWltIjoieC1tcy1pc29sYXRpb24tdGVlLngtbXMtY29tcGxpYW5jZS1zdGF0dXMiLCJlcXVhbHMiOiJhenVyZS1jb21wbGlhbnQtY3ZtIn1dfV19",
"immutable": false
}
}
}
}
Si el base64 descodifica el valor en $.response.key.release_policy.data
, obtiene la representación JSON de la directiva de versión de claves de Key Vault que definimos en un paso anterior.
El key_hsm
valor descodificado de la propiedad base64 tiene este aspecto:
{
"schema_version": "1.0",
"header": {
"kid": "TpmEphemeralEncryptionKey", // (key identifier of KEK)
"alg": "dir", // Direct mode, i.e. the referenced 'kid' is used to directly protect the ciphertext
"enc": "CKM_RSA_AES_KEY_WRAP"
},
"ciphertext": "Rftxvr..lb"
}
Pasos siguientes
Ejemplosde directivas de SKR Aprenda a usar la integración de Microsoft Defender for Cloud con máquinas virtuales confidenciales con atestación de invitado instaladaMás información sobre la característicade atestación de invitado Más información sobre las máquinas virtuales confidenciales de Azure