Compartilhar via


Azure Disk Encryption scripts de exemplo

Aplica-se a: ✔️ VMs do Windows

Este artigo fornece scripts de exemplo para a preparação de VHDs e outras tarefas previamente criptografados.

Observação

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

Exemplos de scripts do PowerShell para Azure Disk Encryption

  • Listar todas as VMs criptografadas na assinatura

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

    Como alternativa, esses cmdlets mostrarão todas as VMs criptografadas de ADE (mas não a versão de 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 de VMSS criptografadas na assinatura

    Você pode encontrar todas as instâncias de Conjuntos de Dimensionamento de Máquinas Virtuais criptografadas por ADE e a versão de extensão, em todos os grupos de recursos presentes em uma assinatura, usando este 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 do PowerShell de pré-requisitos do Azure Disk Encryption

Se você já estiver familiarizado com os pré-requisitos do Azure Disk Encryption, use o script do PowerShell de pré-requisitos do Azure Disk Encryption. Para obter um exemplo de como usar esse script do PowerShell, confira o Guia de início rápido para 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 de 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 Descrição Obrigatório?
$resourceGroupName Nome do grupo de recursos ao qual o KeyVault pertence. Um grupo de recursos com esse nome será criado caso ele ainda não exista. True
$keyVaultName Nome do KeyVault no qual as chaves de criptografia devem ser colocadas. Um cofre com esse nome será criado caso ele ainda não exista. True
$location Local do KeyVault. Verifique se o KeyVault e as VMs a serem criptografadas estão no mesmo local. Obtenha uma lista de locais com Get-AzLocation. True
$subscriptionId Identificador da assinatura do Azure a ser usada. Você pode obter sua ID de assinatura com Get-AzSubscription. True
$aadAppName O nome do aplicativo do Microsoft Entra que será usado para gravar segredos no KeyVault. Será criado um novo aplicativo com esse nome caso ele não exista. Se esse aplicativo já existir, passe o parâmetro aadClientSecret para o script. Falso
$aadClientSecret Segredo do cliente do aplicativo do Microsoft Entra que foi criado anteriormente. Falso
$keyEncryptionKeyName Nome da chave de criptografia da chave opcional no KeyVault. Uma chave com esse nome será criada caso ela ainda não exista. Falso

Modelos do Gerenciador de Recursos

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 previamente criptografado

As seções a seguir são necessárias para preparar um VHD do Windows previamente criptografado para implantação como um VHD criptografado no Azure IaaS. Use as informações para preparar e inicializar uma nova VHD (VM do Windows) 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 não TPM na proteção do sistema operacional

Configure a política de grupo do BitLocker Criptografia de Unidade de Disco BitLocker, que você encontrará em Política de Computador Local>Configuração do Computador>Modelos Administrativos>Componentes do Windows. Altere essa configuração para: Unidades do Sistema Operacional>Exigir autenticação adicional na inicialização>Permitir BitLocker sem TPM compatível, como mostrado na seguinte figura:

Microsoft Antimalware no Azure

Instalar componentes de recursos do BitLocker

Para o 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 sistema operacional para o BitLocker usando bdehdcfg

Para compactar a partição do SO e preparar o computador para BitLocker, execute o bdehdcfg, se necessário:

bdehdcfg -target c: shrink -quiet

Proteger o volume do sistema operacional usando o BitLocker

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

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

Observação

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

Carregue o VHD criptografado para uma conta de armazenamento do Azure

Depois que a criptografia BitLocker for habilitada, será necessário carregar o VHD criptografado local em sua conta de armazenamento.

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

Carregar o segredo da VM previamente criptografada no cofre de chaves

O segredo de criptografia de disco que você obteve anteriormente deve ser carregado como um segredo no cofre de chaves. Para isso, você deve conceder a permissão Set Secret e a permissão wrapkey 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 uma KEK

Para configurar o segredo no cofre de chaves, use Set-AzKeyVaultSecret. A frase secreta é codificada como uma cadeia de caracteres base64 e carregada para o cofre de chaves. Além disso, verifique se as seguintes marcas estão definidas ao criar 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 $secretUrl na próxima etapa para anexar o disco do sistema operacional sem usar KEK.

Segredo de criptografia de disco criptografado com uma KEK

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

    # 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 anexar o disco do sistema operacional usando KEK.

Especificar uma URL secreta ao anexar um disco do sistema operacional

Sem usar uma KEK

Enquanto você está anexando o disco do sistema operacional, é necessário passar $secretUrl. A URL foi gerada na seção "Segredo de criptografia de disco não criptografado com uma KEK".

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

Usando uma KEK

Ao anexar o disco do sistema operacional, passe $KeyEncryptionKey e $secretUrl. A URL foi gerada na seção "Segredo de criptografia de disco criptografado com 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