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