Scripts de exemplo do Azure Disk Encryption

Aplica-se a: ✔️ VMs do Windows

Este artigo fornece scripts de exemplo para preparar VHDs pré-criptografados e outras tarefas.

Nota

Todos os scripts referem-se à versão mais recente, não AAD do ADE, exceto onde indicado.

Exemplos de scripts do PowerShell para a Criptografia de Disco do Azure

  • Listar todas as VMs criptografadas em sua assinatura

    Você pode encontrar todas as VMs criptografadas pelo ADE e a versão da extensão, em todos os grupos de recursos presentes em uma assinatura, usando esse script do PowerShell.

    Como alternativa, esses cmdlets mostrarão todas as VMs criptografadas pelo ADE (mas não a versão da extensão):

    $osVolEncrypted = {(Get-AzVMDiskEncryptionStatus -ResourceGroupName $_.ResourceGroupName -VMName $_.Name).OsVolumeEncrypted}
    $dataVolEncrypted= {(Get-AzVMDiskEncryptionStatus -ResourceGroupName $_.ResourceGroupName -VMName $_.Name).DataVolumesEncrypted}
    Get-AzVm | Format-Table @{Label="MachineName"; Expression={$_.Name}}, @{Label="OsVolumeEncrypted"; Expression=$osVolEncrypted}, @{Label="DataVolumesEncrypted"; Expression=$dataVolEncrypted}
    
  • Listar todas as instâncias criptografadas do VMSS em sua assinatura

    Você pode encontrar todas as instâncias de Conjuntos de Escala de Máquina Virtual criptografados pelo ADE e a versão de extensão, em todos os grupos de recursos presentes em uma assinatura, usando esse script do PowerShell.

  • Listar todos os segredos de criptografia de disco usados para criptografar VMs em um cofre de chaves

Get-AzKeyVaultSecret -VaultName $KeyVaultName | where {$_.Tags.ContainsKey('DiskEncryptionKeyFileName')} | format-table @{Label="MachineName"; Expression={$_.Tags['MachineName']}}, @{Label="VolumeLetter"; Expression={$_.Tags['VolumeLetter']}}, @{Label="EncryptionKeyURL"; Expression={$_.Id}}

Usando o script PowerShell de pré-requisitos do Azure Disk Encryption

Se você já estiver familiarizado com os pré-requisitos para a Criptografia de Disco do Azure, poderá usar o script PowerShell de pré-requisitos da Criptografia de Disco do Azure. Para obter um exemplo de como usar esse script do PowerShell, consulte o Guia de início rápido Criptografar uma VM. Você pode remover os comentários de uma seção do script, começando na linha 211, para criptografar todos os discos para VMs existentes em um grupo de recursos existente.

A tabela a seguir mostra quais parâmetros podem ser usados no script do PowerShell:

Parâmetro Description Obrigatório?
$resourceGroupName Nome do grupo de recursos ao qual o KeyVault pertence. Um novo grupo de recursos com esse nome será criado se não existir. True
$keyVaultName Nome do KeyVault no qual as chaves de criptografia devem ser colocadas. Um novo cofre com este nome será criado se não existir. True
$location Localização do KeyVault. Verifique se o KeyVault e as VMs a serem criptografadas estão no mesmo local. Obtenha uma lista de localizações com Get-AzLocation. True
$subscriptionId Identificador da assinatura do Azure a ser usada. Pode obter o seu ID de subscrição com Get-AzSubscription. True
$aadAppName Nome do aplicativo Microsoft Entra que será usado para gravar segredos no KeyVault. Será criada uma nova aplicação com este nome, caso ainda não exista. Se esse aplicativo já existir, passe o parâmetro aadClientSecret para o script. False
$aadClientSecret Segredo do cliente do aplicativo Microsoft Entra que foi criado anteriormente. False
$keyEncryptionKeyName Nome da chave de criptografia de chave opcional no KeyVault. Uma nova chave com este nome será criada se não existir. False

Modelos do Resource Manager

Criptografar ou descriptografar VMs sem um aplicativo Microsoft Entra

Criptografar ou descriptografar VMs com um aplicativo Microsoft Entra (versão anterior)

Preparar um VHD do Windows pré-criptografado

As seções a seguir são necessárias para preparar um VHD do Windows pré-criptografado para implantação como um VHD criptografado na IaaS do Azure. Use as informações para preparar e inicializar uma nova VM do Windows (VHD) no Azure Site Recovery ou no Azure. Para obter mais informações sobre como preparar e carregar um VHD, consulte Carregar um VHD generalizado e usá-lo para criar novas VMs no Azure.

Atualizar a política de grupo para permitir que não TPM para proteção do SO

Configure a configuração da Política de Grupo BitLocker Criptografia de Unidade de Disco BitLocker, que você encontrará em Modelos>Administrativos de Configuração>do Computador de Diretiva de Computador Local Componentes>do Windows. Altere essa configuração para Unidades>do sistema operacional Exigir autenticação adicional na inicialização>Permitir BitLocker sem um TPM compatível, conforme mostrado na figura a seguir:

Microsoft Antimalware no Azure

Instalar componentes de recursos do BitLocker

Para Windows Server 2012 e versões posteriores, use o seguinte comando:

dism /online /Enable-Feature /all /FeatureName:BitLocker /quiet /norestart

Para o Windows Server 2008 R2, use o seguinte comando:

ServerManagerCmd -install BitLockers

Preparar o volume do SO para o BitLocker utilizando bdehdcfg

Para compactar a partição do sistema operacional e preparar a máquina para o BitLocker, execute o bdehdcfg se necessário:

bdehdcfg -target c: shrink -quiet

Proteger o volume do SO utilizando o BitLocker

Use o manage-bde comando para habilitar a criptografia no volume de inicialização usando um protetor de chave externo. Coloque também a chave externa (arquivo .bek) na unidade externa ou no volume. A criptografia é ativada no volume do sistema/inicialização após a próxima reinicialização.

manage-bde -on %systemdrive% -sk [ExternalDriveOrVolume]
reboot

Nota

Prepare a VM com um VHD de dados/recurso separado para obter a chave externa usando o BitLocker.

Carregar VHD criptografado em uma conta de armazenamento do Azure

Depois que a criptografia BitLocker estiver habilitada, o VHD criptografado local precisará ser carregado em sua conta de armazenamento.

    Add-AzVhd [-Destination] <Uri> [-LocalFilePath] <FileInfo> [[-NumberOfUploaderThreads] <Int32> ] [[-BaseImageUriToPatch] <Uri> ] [[-OverWrite]] [ <CommonParameters>]

Carregue o segredo da VM pré-encriptada para o cofre de chaves

O segredo de criptografia de disco obtido anteriormente deve ser carregado como um segredo no cofre de chaves. Para fazer isso, você deve conceder a permissão de segredo definido e a permissão de chave de encapsulamento para a conta que carregará os segredos.

# Typically, account Id is the user principal name (in user@domain.com format)
$upn = (Get-AzureRmContext).Account.Id
Set-AzKeyVaultAccessPolicy -VaultName $kvname -UserPrincipalName $acctid -PermissionsToKeys wrapKey -PermissionsToSecrets set

# In cloud shell, the account ID is a managed service identity, so specify the username directly
# $upn = "user@domain.com"
# Set-AzKeyVaultAccessPolicy -VaultName $kvname -UserPrincipalName $acctid -PermissionsToKeys wrapKey -PermissionsToSecrets set

# When running as a service principal, retrieve the service principal ID from the account ID, and set access policy to that
# $acctid = (Get-AzureRmContext).Account.Id
# $spoid = (Get-AzureRmADServicePrincipal -ServicePrincipalName $acctid).Id
# Set-AzKeyVaultAccessPolicy -VaultName $kvname -ObjectId $spoid -BypassObjectIdValidation -PermissionsToKeys wrapKey -PermissionsToSecrets set

Segredo de criptografia de disco não criptografado com um KEK

Para configurar o segredo no cofre de chaves, use Set-AzKeyVaultSecret. A frase secreta é codificada como uma cadeia de caracteres base64 e, em seguida, carregada para o cofre de chaves. Além disso, certifique-se de que as seguintes tags estão definidas quando você cria o segredo no cofre de chaves.


 # This is the passphrase that was provided for encryption during the distribution installation
 $passphrase = "contoso-password"

 $tags = @{"DiskEncryptionKeyEncryptionAlgorithm" = "RSA-OAEP"; "DiskEncryptionKeyFileName" = "LinuxPassPhraseFileName"}
 $secretName = [guid]::NewGuid().ToString()
 $secretValue = [Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($passphrase))
 $secureSecretValue = ConvertTo-SecureString $secretValue -AsPlainText -Force

 $secret = Set-AzKeyVaultSecret -VaultName $KeyVaultName -Name $secretName -SecretValue $secureSecretValue -tags $tags
 $secretUrl = $secret.Id

Use o na próxima etapa para conectar o disco do sistema operacional sem usar o $secretUrl KEK.

Segredo de criptografia de disco criptografado com um KEK

Antes de carregar o segredo para o cofre de chaves, você pode, opcionalmente, criptografá-lo usando uma chave de criptografia de chave. Use a API wrap para primeiro criptografar o segredo usando a chave de criptografia de chave. A saída dessa operação de encapsulamento é uma cadeia de caracteres codificada por URL base64, que você pode carregar como um segredo usando o Set-AzKeyVaultSecret cmdlet.

    # This is the passphrase that was provided for encryption during the distribution installation
    $passphrase = "contoso-password"

    Add-AzKeyVaultKey -VaultName $KeyVaultName -Name "keyencryptionkey" -Destination Software
    $KeyEncryptionKey = Get-AzKeyVaultKey -VaultName $KeyVault.OriginalVault.Name -Name "keyencryptionkey"

    $apiversion = "2015-06-01"

    ##############################
    # Get Auth URI
    ##############################

    $uri = $KeyVault.VaultUri + "/keys"
    $headers = @{}

    $response = try { Invoke-RestMethod -Method GET -Uri $uri -Headers $headers } catch { $_.Exception.Response }

    $authHeader = $response.Headers["www-authenticate"]
    $authUri = [regex]::match($authHeader, 'authorization="(.*?)"').Groups[1].Value

    Write-Host "Got Auth URI successfully"

    ##############################
    # Get Auth Token
    ##############################

    $uri = $authUri + "/oauth2/token"
    $body = "grant_type=client_credentials"
    $body += "&client_id=" + $AadClientId
    $body += "&client_secret=" + [Uri]::EscapeDataString($AadClientSecret)
    $body += "&resource=" + [Uri]::EscapeDataString("https://vault.azure.net")
    $headers = @{}

    $response = Invoke-RestMethod -Method POST -Uri $uri -Headers $headers -Body $body

    $access_token = $response.access_token

    Write-Host "Got Auth Token successfully"

    ##############################
    # Get KEK info
    ##############################

    $uri = $KeyEncryptionKey.Id + "?api-version=" + $apiversion
    $headers = @{"Authorization" = "Bearer " + $access_token}

    $response = Invoke-RestMethod -Method GET -Uri $uri -Headers $headers

    $keyid = $response.key.kid

    Write-Host "Got KEK info successfully"

    ##############################
    # Encrypt passphrase using KEK
    ##############################

    $passphraseB64 = [Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($Passphrase))
    $uri = $keyid + "/encrypt?api-version=" + $apiversion
    $headers = @{"Authorization" = "Bearer " + $access_token; "Content-Type" = "application/json"}
    $bodyObj = @{"alg" = "RSA-OAEP"; "value" = $passphraseB64}
    $body = $bodyObj | ConvertTo-Json

    $response = Invoke-RestMethod -Method POST -Uri $uri -Headers $headers -Body $body

    $wrappedSecret = $response.value

    Write-Host "Encrypted passphrase successfully"

    ##############################
    # Store secret
    ##############################

    $secretName = [guid]::NewGuid().ToString()
    $uri = $KeyVault.VaultUri + "/secrets/" + $secretName + "?api-version=" + $apiversion
    $secretAttributes = @{"enabled" = $true}
    $secretTags = @{"DiskEncryptionKeyEncryptionAlgorithm" = "RSA-OAEP"; "DiskEncryptionKeyFileName" = "LinuxPassPhraseFileName"}
    $headers = @{"Authorization" = "Bearer " + $access_token; "Content-Type" = "application/json"}
    $bodyObj = @{"value" = $wrappedSecret; "attributes" = $secretAttributes; "tags" = $secretTags}
    $body = $bodyObj | ConvertTo-Json

    $response = Invoke-RestMethod -Method PUT -Uri $uri -Headers $headers -Body $body

    Write-Host "Stored secret successfully"

    $secretUrl = $response.id

Use $KeyEncryptionKey e $secretUrl na próxima etapa para conectar o disco do sistema operacional usando o KEK.

Especifique um URL secreto ao anexar um disco do SO

Sem usar um KEK

Enquanto você está anexando o disco do sistema operacional, você precisa passar $secretUrl. O URL foi gerado na seção "Segredo de criptografia de disco não criptografado com um KEK".

    Set-AzVMOSDisk `
            -VM $VirtualMachine `
            -Name $OSDiskName `
            -SourceImageUri $VhdUri `
            -VhdUri $OSDiskUri `
            -Windows `
            -CreateOption FromImage `
            -DiskEncryptionKeyVaultId $KeyVault.ResourceId `
            -DiskEncryptionKeyUrl $SecretUrl

Usando um KEK

Quando você anexar o disco do sistema operacional, passe $KeyEncryptionKey e $secretUrl. O URL foi gerado na seção "Segredo de criptografia de disco criptografado com um KEK".

    Set-AzVMOSDisk `
            -VM $VirtualMachine `
            -Name $OSDiskName `
            -SourceImageUri $CopiedTemplateBlobUri `
            -VhdUri $OSDiskUri `
            -Windows `
            -CreateOption FromImage `
            -DiskEncryptionKeyVaultId $KeyVault.ResourceId `
            -DiskEncryptionKeyUrl $SecretUrl `
            -KeyEncryptionKeyVaultId $KeyVault.ResourceId `
            -KeyEncryptionKeyURL $KeyEncryptionKey.Id