Use uma conta do Azure associada à assinatura do Azure que contém a VM.
Para habilitar a identidade gerenciada atribuída ao sistema, carregue o modelo em um editor, localize o Microsoft.Compute/virtualMachines
recurso de interesse dentro da resources
seção e adicione a "identity"
propriedade no mesmo nível da "type": "Microsoft.Compute/virtualMachines"
propriedade. Utilize a seguinte sintaxe:
"identity": {
"type": "SystemAssigned"
},
O modelo final parece 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 ao sistema para seu CVM, você precisa fornecer a ele acesso ao plano de dados do Cofre de Chaves do Azure onde os objetos de chave são armazenados. Para garantir que apenas nossa máquina virtual confidencial possa executar a operação de liberação, concederemos apenas a permissão específica necessária.
Nota
Você pode encontrar a ID do objeto de identidade gerenciado nas opções de identidade da máquina virtual, no portal do Azure. Como alternativa, você pode recuperá-lo com modelos PowerShell, Azure CLI, Bicep ou ARM.
[Bíceps 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 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 lançamento
As Políticas de Liberação de Chaves Seguras do Key Vault são modeladas de acordo com a Política do Azure, com uma gramática ligeiramente diferente.
A ideia é quando passamos o relatório da plataforma atestada, na forma de um JSON Web Token (JWT), para o Key Vault. Por sua vez, ele analisará o JWT e verificará se as declarações de relatório de plataforma atestadas 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 atestado tiver propriedades como:
- Atestado pelo ponto de extremidade do serviço Microsoft Azure Attestation (MAA) "https://sharedweu.weu.attest.azure.net".
- Esse
authority
valor da política é comparado com a iss
propriedade (emissor), no token.
- E que ele também contém um objeto chamado
x-ms-isolation-tee
com uma propriedade chamada x-ms-attestation-type
, que detém valor sevsnpvm
.
- O MAA como um serviço do Azure atestou que o CVM está sendo executado em um processador genuíno AMD SEV-SNP.
- E que ele também contém um objeto chamado
x-ms-isolation-tee
com uma propriedade chamada x-ms-compliance-status
, que detém o valor azure-compliant-cvm
.
- O MAA como um serviço do Azure tem a capacidade de atestar que o CVM é uma máquina virtual confidencial do Azure compatível.
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 anyOf
condição que contém uma série de autoridades-chave. Uma claim
condição é um objeto JSON que identifica um nome de declaração, uma condição para correspondência e um valor. Os AnyOf
objetos e AllOf
condition permitem a modelagem de um lógico OR
e AND
. Atualmente, só podemos realizar uma equals
comparação em um claim
arquivo . As propriedades de condição são colocadas junto com authority
as propriedades.
Importante
Uma asserçã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, editor, versão) que são comparadas com a Política de Liberação de Chave. A chave de criptografia de chave é uma chave RSA pública de propriedade e protegida pelo ambiente de execução de destino usado para exportação de chaves. Ele deve aparecer na declaração de chaves TEE (x-ms-runtime/keys). Esta declaração é um objeto JSON que representa um conjunto de chaves da Web JSON. Dentro do JWKS, uma das chaves deve atender aos requisitos para uso como uma chave de criptografia (key_use é "enc" ou key_ops contém "criptografar"). 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 atestado seria parecido com:
{
//...
"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 sob o $.x-ms-runtime.keys
caminho. O Cofre da Chave usa a TpmEphemeralEncryptionKey
chave como a chave de criptografia de chave.
Nota
Observe que pode haver uma chave em $.x-ms-isolation-tee.x-ms-runtime.keys
, essa não é a chave que o Cofre de Chaves usará.
Criar uma chave exportável com política de lançamento
Criamos uma política de acesso ao Cofre da Chave que permite que uma Máquina Virtual Confidencial do Azure execute a operação de release
chave. Finalmente, devemos incluir nossa política de lançamento 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.
Nota
As chaves apoiadas por HSM estão disponíveis com o Azure Key Vault Premium e o Azure Key Vault Managed HSM.
[Bíceps 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 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 Cofre da Chave criou uma nova chave apoiada por HSM e se ela contém nossa política de liberação segura de chaves 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á sendo executado no estado operacional pretendido. É o processo pelo qual uma das partes, o verificador, avalia a confiabilidade de um par potencialmente não confiável, o attester. Com atestado de convidado remoto, o ambiente de execução confiável oferece uma plataforma que permite executar um sistema operacional inteiro 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 e também a sua certificação 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 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 atestado como um token Web JSON, que é o que é necessário para a release
operação de chave do Key Vault.
Nota
Um token do serviço de Atestado do Azure é válido por 8 horas.
[Linux]
Inicie sessão na sua VM.
Clone o aplicativo Linux de exemplo.
Instale o pacote build-essential
. Este pacote instala tudo o que é necessário para compilar o aplicativo de exemplo.
sudo apt-get install build-essential
Instale o libcurl4-openssl-dev
e libjsoncpp-dev
pacotes.
sudo apt-get install libcurl4-openssl-dev
sudo apt-get install libjsoncpp-dev
Faça o download do 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
Nota
Se -o
não for especificado como token
, o exe imprime um resultado binário verdadeiro ou falso, dependendo do resultado do atestado e da plataforma que está sendo sevsnp
.
Inicie sessão na sua VM.
Clone o aplicativo de exemplo do Windows.
Navegue dentro da pasta descompactada e execute VC_redist.x64.exe
. VC_redist instalará bibliotecas de tempo de execução Microsoft C e C++ (MSVC) na máquina.
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
Nota
Se -o
não for especificado como token
, o exe imprime um resultado binário verdadeiro ou falso, dependendo do resultado do atestado e da plataforma que está sendo sevsnp
.
Resultado do Atestado de Hóspede
O resultado do cliente Guest Attestation simplesmente é uma cadeia de caracteres codificada em base64. Esse valor de cadeia de caracteres codificada é um JSON Web Token (JWT) assinado, com cabeçalho, corpo e assinatura. Você pode dividir a cadeia de caracteres pelo .
valor (ponto) e base64 decodificar os resultados.
eyJhbGciO...
O cabeçalho contém um jku
, também conhecido como JWK set URI que se vincula a um conjunto de chaves públicas codificadas em JSON. Uma delas corresponde à chave usada para assinar digitalmente as TJ. A 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 de atestado de convidado será validado pelo Cofre de Chaves do Azure como entrada para teste em relação à 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 lista extensa contendo descrições de todas essas declarações relacionadas ao SEV-SNP.
Podemos usar qualquer script ou linguagem de programação para receber um relatório de plataforma atestado 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 o Cofre da Chave do IMDS (serviço de metadados da instância).
Ao configurar o relatório de plataforma atestado como a carga útil do corpo e o token 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 de lançamento chave
A operação de liberação de chave segura retorna apenas uma única propriedade dentro de sua carga 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 este é um certificado válido. Abaixo encontra-se 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 get
operação de chave. No entanto, a release
operação inclui, entre outras coisas, o key_hsm
imóvel.
{
"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 sua base64 decodificar o valor em $.response.key.release_policy.data
, você obterá a representação JSON da política de liberação de chaves do Cofre de Chaves que definimos em uma etapa anterior.
O valor decodificado key_hsm
da propriedade base64 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óximos passos
Exemplosde políticas SKR Saiba como usar a integração do Microsoft Defender for Cloud com VMs confidenciais com atestado de convidado instaladoSaiba mais sobre o recursode atestado de convidado Saiba mais sobre VMs confidenciais do Azure