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 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 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 Cofre de Chaves do Azure
Depois de habilitar uma identidade gerenciada atribuída pelo sistema para seu CVM, você precisará fornecer a ela 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.
Observação
Você pode encontrar a ID do objeto de identidade gerenciada nas opções de identidade da máquina virtual, no portal do Azure. Como alternativa, você pode recuperá-lo com modelos do 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 Lançamento de Chave Segura do Cofre de Chaves 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. Ele, por sua vez, analisará o JWT e verificará se as declarações de relatório de plataforma atestadas correspondem ou não às reivindicações na apólice.
Por exemplo, digamos que queremos liberar uma chave somente quando nosso relatório de plataforma atestado tiver propriedades como:
- Atestado pelo ponto de extremidade de serviço do Microsoft Azure Attestation (MAA) "https://sharedweu.weu.attest.azure.net".
- Esse
authority
valor da política é comparado à 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 contém valor sevsnpvm
.
- O MAA como um serviço do Azure atestou que o CVM está sendo executado em um processador original 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 conté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 condição que contém uma anyOf
matriz 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 condition permitem a modelagem de um lógico OR
e AllOf
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 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 de TEE, editor, versão) que são correspondidas 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 chave. 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 Cofre de Chaves escolhe a primeira chave adequada da propriedade de matriz "" no objeto "keys
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 de Chaves usa a chave como a TpmEphemeralEncryptionKey
chave de criptografia de chave.
Observação
Observe que pode haver uma chave em $.x-ms-isolation-tee.x-ms-runtime.keys
, esta não é a chave que o Cofre de Chaves estará usando.
Criar uma chave exportável com a política de lançamento
Criamos uma política de acesso do Cofre de Chaves 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.
Observação
As chaves com suporte de 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 de Chaves criou uma nova chave 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á 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 certificador. 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 da Web JSON, que é o que é necessário para a operação de chave do Cofre de release
Chaves.
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
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
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 que está sendo sevsnp
.
Entre em sua VM.
Clone o aplicativo do Windows de exemplo.
Navegue dentro da pasta descompactada e execute VC_redist.x64.exe
o . VC_redist instalará bibliotecas de tempo de execução 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 que está sendo sevsnp
.
Resultado do Atestado de Convidado
O resultado do cliente de Atestado de Convidado é simplesmente uma cadeia de caracteres codificada em base64. Esse valor de cadeia de caracteres codificado é 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 , também conhecido como JWK Set URI que se vincula a um jku
conjunto de chaves públicas codificadas por JSON. Um deles corresponde à chave usada para assinar digitalmente o TJS. 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 de atestado de convidado será validado pelo Cofre de Chaves do Azure como entrada para testar em relação à política de liberação de chave. Como observado anteriormente, o Cofre de Chaves do Azure 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 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 Cofre de Chaves do serviço de metadados de instância (IMDS).
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 de chave
A operação de liberação de chave segura retorna apenas uma única propriedade dentro de sua carga JSON útil. 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 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. 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 parece incrivelmente semelhante à resposta que você obtém ao invocar a get
operação de chave. No entanto, a release
operação inclui o key_hsm
imóvel, 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
}
}
}
}
Caso sua base64 decodifice o valor em , você obterá a representação JSON da política de liberação de chave do Cofre de Chaves que definimos em $.response.key.release_policy.data
uma etapa anterior.
O key_hsm
valor decodificado 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óximas etapas
Exemplosde política 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