Use uma conta do Azure que esteja associada a uma assinatura do Azure que contenha a VM.
Para habilitar a identidade gerenciada atribuída ao sistema, carregue o modelo em um editor, localize o recurso Microsoft.Compute/virtualMachines
de interesse dentro da seção resources
e adicione a propriedade "identity"
no mesmo nível que a propriedade "type": "Microsoft.Compute/virtualMachines"
. Use a seguinte sintaxe:
"identity": {
"type": "SystemAssigned"
},
O modelo final se parece com o exemplo abaixo
"resources": [
{
"apiVersion": "2021-11-01",
"type": "Microsoft.Compute/virtualMachines",
"name": "[parameters('vmName')]",
"location": "[parameters('location')]",
"identity": {
"type": "SystemAssigned",
},
//other resource provider properties...
}
]
Adicionar a política de acesso ao Azure Key Vault
Depois de habilitar uma identidade gerenciada atribuída pelo sistema para sua CVM, você precisará fornecer a ela acesso ao plano de dados do Azure Key Vault no qual os objetos de chave são armazenados. Para garantir que somente nossa máquina virtual confidencial possa executar a operação de liberação, concederemos apenas a permissão específica necessária.
Observação
Você pode encontrar a ID do objeto da identidade gerenciada nas opções de identidade da máquina virtual, no portal do Azure. Como alternativa, você pode recuperá-la com o PowerShell, a CLI do Azure, o Bicep e modelos do 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'
]
}
}
]
}
}
[Modelo do 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')]"
]
}
Preparar a política de liberação
As políticas de liberação de chave segura do Key Vault têm como modelo o Azure Policy, com uma gramática ligeiramente diferente.
A ideia é quando passamos o relatório de plataforma atestada, na forma de um Token Web JSON (JWT), para o Key Vault. Ele, por sua vez, examinará o JWT e verificará se as declarações de relatório da plataforma atestada correspondem ou não às declarações na política.
Por exemplo, digamos que queremos liberar uma chave somente quando nosso relatório de plataforma atestada tiver propriedades como:
- Atestado pelo serviço de ponto de extremidade https://sharedweu.weu.attest.azure.net" do Atestado do Microsoft Azure (MAA) ";.
- Esse valor
authority
da política é comparado à propriedade iss
(emissor), no token.
- E que também contenha um objeto chamado
x-ms-isolation-tee
com uma propriedade chamada x-ms-attestation-type
, que contém o valor sevsnpvm
.
- O MAA como um serviço do Azure atestou que a VM Confidencial (CVM) está em execução em um processador AMD SEV-SNP original.
- E que também contenha um objeto chamado
x-ms-isolation-tee
com uma propriedade chamada x-ms-compliance-status
, que contém o valor azure-compliant-cvm
.
- O MAA como um serviço do Azure tem a capacidade de atestar que a CVM é uma máquina virtual confidencial do Azure em conformidade.
Crie uma nova pasta chamada assets
e adicione o seguinte conteúdo JSON a um arquivo chamado 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"
}
]
}
]
}
A política de liberação é uma condição anyOf
que contém uma matriz de autoridades-chave. Uma condição claim
é um objeto JSON que identifica um nome de declaração, uma condição de correspondência e um valor. Os objetos das condições AnyOf
e AllOf
permitem a modelagem de uma lógica OR
e AND
. Atualmente, só podemos executar uma comparação equals
em um claim
. As propriedades de condição são colocadas junto com as propriedades authority
.
Importante
Uma declaração de ambiente contém pelo menos uma chave de criptografia de chave e uma ou mais declarações sobre o ambiente de destino (por exemplo, tipo TEE, distribuidor, versão) que são corresponderes à Política de Liberação de Chaves. A chave de criptografia de chave é uma chave RSA pública protegida e de propriedade do ambiente de execução de destino que é usado para a exportação de chaves. Ela deve aparecer na declaração de chaves TEE (x-ms-runtime/chaves). Essa declaração é um objeto JSON que representa um conjunto de Chaves Web JSON. No JWKS, uma das chaves deve atender aos requisitos para uso como uma chave de criptografia (key_use é "enc" ou key_ops contém "encrypt"). A primeira chave adequada é escolhida.
O Key Vault escolhe a primeira chave adequada da propriedade de matriz "keys
" no objeto "x-ms-runtime
", ele procura uma chave RSA pública com "key_use": ["enc"]
ou "key_ops": ["encrypt"]
. Um exemplo de um relatório de plataforma atestada seria semelhante a:
{
//...
"x-ms-runtime": {
"client-payload": {
"nonce": "MTIzNA=="
},
"keys": [
{
"e": "AQAB",
"key_ops": [
"encrypt"
],
"kid": "TpmEphemeralEncryptionKey",
"kty": "RSA",
"n": "9v2XQgAA6y18CxV8dSGnh..."
}
]
},
//...
}
Neste exemplo, temos apenas uma chave no caminho $.x-ms-runtime.keys
. O Key Vault usa a chave TpmEphemeralEncryptionKey
como a chave de criptografia de chave.
Observação
Observe que pode haver uma chave no caminho $.x-ms-isolation-tee.x-ms-runtime.keys
, essa não é a chave que o Key Vault usará.
Criar uma chave exportável com a política de liberação
Criamos uma política de acesso do Key Vault que permite que uma Máquina Virtual Confidencial do Azure execute a operação de chave release
. Por fim, devemos incluir nossa política de liberação como uma cadeia de caracteres codificada em base64 durante a criação da chave. A chave deve ser uma chave exportável, apoiada por um HSM.
Observação
As chaves com suporte de HSM estão disponíveis com o Azure Key Vault Premium e o HSM Gerenciado do 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')
}
}
}
[Modelo do 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 verificar se o Key Vault criou uma chave nova, com suporte de HSM, e se ela contém nossa política de liberação de chave segura navegando até o portal do Azure e selecionando nossa chave. A chave pretendida será marcada como "exportável".
Cliente de atestado de convidado
O atestado nos ajuda a avaliar criptograficamente que algo está em execução no estado operacional pretendido. É o processo pelo qual uma parte, o verificador, avalia a confiabilidade de um par potencialmente não confiável, o atestador. Com o atestado de convidado remoto, o ambiente de execução confiável oferece uma plataforma que permite executar todo um sistema operacional dentro dele.
Importante
A Microsoft oferece uma biblioteca C/C++ para Windows e Linux que pode ajudar seus esforços de desenvolvimento. A biblioteca facilita a aquisição de um relatório de plataforma SEV-SNP do hardware, que é também atestado por uma instância do serviço de Atestado do Azure. O serviço de Atestado do Azure pode ser hospedado pela Microsoft (compartilhado) ou por sua própria instância privada.
Um binário de cliente Windows e Linux de código aberto que utiliza a biblioteca de atestado de convidado pode ser escolhido para facilitar o processo de atestado de convidado com CVMs. O binário do cliente retorna o relatório de plataforma atestada como um Token Web JSON, que é o que é necessário para a operação de chave release
do Key Vault.
Observação
Um token do serviço de Atestado do Azure é válido por 8 horas.
[Linux]
Entre em sua VM.
Clonar o aplicativo de exemplo Linux.
Instale o pacote build-essential
. Esse pacote instala tudo o que é necessário para compilar o aplicativo de exemplo.
sudo apt-get install build-essential
Instale os pacotes libcurl4-openssl-dev
e libjsoncpp-dev
.
sudo apt-get install libcurl4-openssl-dev
sudo apt-get install libjsoncpp-dev
Baixe o pacote de atestado.
Instale o pacote de atestado. Certifique-se de substituir <version>
pela versão que você baixou.
sudo dpkg -i azguestattestation1_<latest-version>_amd64.deb
Para executar o cliente de exemplo, navegue dentro da pasta descompactada e execute o comando abaixo:
sudo ./AttestationClient -a <attestation-url> -n <nonce-value> -o token
Observação
Se -o
não for especificado como token
, o exe imprimirá um resultado binário verdadeiro ou falso dependendo do resultado do atestado e da plataforma ser sevsnp
.
Entre em sua VM.
Clone o aplicativo do Windows de exemplo.
Navegue dentro da pasta descompactada e execute VC_redist.x64.exe
. VC_redist instalará bibliotecas de runtime do Microsoft C e C++ (MSVC) no computador.
Para executar o cliente de exemplo, navegue dentro da pasta descompactada e execute o comando abaixo:
sudo ./AttestationClient -a <attestation-url> -n <nonce-value> -o token
Observação
Se -o
não for especificado como token
, o exe imprimirá um resultado binário verdadeiro ou falso dependendo do resultado do atestado e da plataforma ser sevsnp
.
Resultado do Atestado de Convidado
O resultado do cliente do Atestado de Convidado simplesmente é uma cadeia de caracteres codificada em base64. Esse valor de cadeia de caracteres codificada é um Token Web JSON (JWT) assinado, com um cabeçalho, corpo e assinatura. Você pode dividir a cadeia de caracteres pelo valor .
(ponto) e decodificar os resultados em base64.
eyJhbGciO...
O cabeçalho contém um jku
, também conhecido como URI de conjunto JWK que é vinculado a um conjunto de chaves públicas codificadas em JSON. Uma das quais corresponde à chave usada para assinar digitalmente o JWS. O kid
indica qual chave foi usada para assinar o JWS.
{
"alg": "RS256",
"jku": "https://sharedweu.weu.attest.azure.net/certs",
"kid": "dRKh+hBcWUfQimSl3Iv6ZhStW3TSOt0ThwiTgUUqZAo=",
"typ": "JWT"
}
O corpo da resposta do atestado de convidado será validado pelo Azure Key Vault como entrada para testar na política de liberação de chave. Como observado anteriormente, o Azure Key Vault usa o "TpmEphemeralEncryptionKey
" como a chave de criptografia de chave.
{
"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"
}
A documentação do serviço de Atestado do Microsoft Azure tem uma extensa lista contendo descrições de todas essas declarações relacionadas ao SEV-SNP.
Podemos usar qualquer linguagem de script ou programação para receber um relatório de plataforma atestada usando o binário AttestationClient. Como a máquina virtual que implantamos em uma etapa anterior tem a identidade gerenciada habilitada, devemos obter um token do Azure AD para Key Vault do serviço de metadados de instância (IMDS).
Ao configurar o relatório de plataforma atestada como o conteúdo do corpo e o token do Microsoft Entra em nosso cabeçalho de autorização, você tem tudo o que é necessário para executar a operação de chave 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
}
Resposta da liberação de chave
A operação de liberação de chave segura retorna apenas uma única propriedade dentro de seu conteúdo JSON. O conteúdo, no entanto, também foi codificado em base64.
{
"value": "eyJhbGciOiJSUzI1NiIsImtpZCI6Ijg4RUFDM.."
}
Aqui temos outro cabeçalho, embora este tenha uma cadeia de certificados X.509 como uma propriedade.
{
"alg": "RS256",
"kid": "88EAC2DB6BE4E051B0E05AEAF6CB79E675296121",
"x5t": "iOrC22vk4FGw4Frq9st55nUpYSE",
"typ": "JWT",
"x5t#S256": "BO7jbeU3BG0FEjetF8rSisRbkMfcdy0olhcnmYEwApA",
"x5c": [
"MIIIfDCCBmSgA..XQ==",
"MII..8ZZ8m",
"MII..lMrY="
]
}
Você pode ler a partir da matriz "x5c
" no PowerShell, isso pode ajudá-lo a verificar se esse é um certificado válido. Veja um exemplo:
$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
O corpo do token JWT da resposta é incrivelmente semelhante à resposta que você obtém ao invocar a operação de chave get
. No entanto, a operação release
inclui a propriedade key_hsm
, entre outras coisas.
{
"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
}
}
}
}
Se seu base64 decodificar o valor abaixo $.response.key.release_policy.data
, você obterá a representação JSON da política de liberação de chave do Key Vault que definimos em uma etapa anterior.
O valor key_hsm
decodificado em base64 da propriedade tem esta aparência:
{
"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"
}
Próximas etapas
Exemplos de política de SKRsaiba como usar a integração do Microsoft Defender para Nuvem com VMs confidenciais com atestado de convidado instaladoSaiba mais sobre o recurso de atestado de convidado Saiba mais sobre VMs confidenciais do Azure