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
- Habilitar criptografia de disco em uma VM do Windows em execução ou existente
- Desabilitar criptografia em uma VM do Windows em execução
Criptografar ou descriptografar VMs com um aplicativo Microsoft Entra (versão anterior)
- Habilitar criptografia de disco em uma VM do Windows em execução ou existente
- Desabilitar criptografia em uma VM do Windows em execução
- Criar um novo disco gerenciado criptografado a partir de um blob de armazenamento/VHD previamente criptografado
- Cria um disco gerenciado criptografado fornecido usando um VHD pré-criptografado e as configurações de criptografia correspondentes
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:
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