Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Important
Azure Disk Encryption is scheduled for retirement on September 15, 2028. Until that date, you can continue to use Azure Disk Encryption without disruption. On September 15, 2028, ADE-enabled workloads will continue to run, but encrypted disks will fail to unlock after VM reboots, resulting in service disruption.
Use encryption at host for new VMs, or consider Confidential VM sizes with OS disk encryption for confidential computing workloads. All ADE-enabled VMs (including backups) must migrate to encryption at host before the retirement date to avoid service disruption. See Migrate from Azure Disk Encryption to encryption at host for details.
Applies to: ✔️ Windows VMs ✔️ Flexible scale sets
Azure Disk Encryption for Windows virtual machines (VMs) uses the BitLocker feature of Windows to provide full disk encryption of the OS disk and data disk. Additionally, it encrypts the temporary disk when the VolumeType parameter is All.
Azure Disk Encryption is integrated with Azure Key Vault to help you control and manage the disk encryption keys and secrets. For an overview of the service, see Azure Disk Encryption for Windows VMs.
Prerequisites
You can apply disk encryption only to virtual machines of supported VM sizes and operating systems. You also must meet the following prerequisites:
Restrictions
If you previously used Azure Disk Encryption with Microsoft Entra ID to encrypt a VM, continue to use this option to encrypt your VM. See Azure Disk Encryption with Microsoft Entra ID (previous release) for details.
Take a snapshot or create a backup before disks are encrypted. Backups ensure that a recovery option is possible if an unexpected failure occurs during encryption. VMs with managed disks require a backup before encryption occurs. Once a backup is made, you can use the Set-AzVMDiskEncryptionExtension cmdlet to encrypt managed disks by specifying the -skipVmBackup parameter. For more information about how to back up and restore encrypted VMs, see Back up and restore encrypted Azure VM.
Encrypting or disabling encryption might cause a VM to reboot.
Azure Disk Encryption doesn’t work for the following scenarios, features, and technology:
- Encrypting basic tier VM or VMs created through the classic VM creation method.
- Encrypting v6 series VMs with temporary disks (Ddsv6, Dldsv6, Edsv6, Dadsv6, Daldsv6, Eadsv6, Dpdsv6, Dpldsv6, Epdsv6, or Endsv6). For more information, see the individual pages for each of these VM sizes listed on Sizes for virtual machines in Azure.
- Encrypting V7 series and newer VM sizes.
- All requirements and restrictions of BitLocker, such as requiring NTFS. For more information, see BitLocker overview.
- Encrypting VMs configured with software-based RAID systems.
- Encrypting VMs configured with Storage Spaces Direct (S2D), or Windows Server versions before 2016 configured with Windows Storage Spaces.
- Integration with an on-premises key management system.
- Azure Files (shared file system).
- Network File System (NFS).
- Dynamic volumes.
- Windows Server containers, which create dynamic volumes for each container.
- Ephemeral OS disks.
- iSCSI disks.
- Encryption of shared/distributed file systems like (but not limited to) DFS, GFS, DRDB, and CephFS.
- Moving an encrypted VM to another subscription or region.
- Creating an image or snapshot of an encrypted VM and using it to deploy more VMs.
- 'L' family storage optimized VM size series.
- M-series VMs with Write Accelerator disks.
- Applying ADE to a VM that has disks encrypted with encryption at host or server-side encryption with customer-managed keys (SSE + CMK). Applying SSE + CMK to a data disk or adding a data disk with SSE + CMK configured to a VM encrypted with ADE is an unsupported scenario as well.
- Migrating a VM that is encrypted with ADE, or has ever been encrypted with ADE, to encryption at host or server-side encryption with customer-managed keys.
- Encrypting VMs in failover clusters.
- Encryption of Azure Ultra Disks.
- Encryption of Premium SSD v2 disks.
- Encryption of VMs in subscriptions that have the
Secrets should have the specified maximum validity periodpolicy enabled with the deny effect. - Encryption of VMs in subscriptions that have the
Key Vault secrets should have an expiration datepolicy enabled with the deny effect.
Install tools and connect to Azure
You can enable and manage Azure Disk Encryption through the Azure CLI and Azure PowerShell. To do so, install the tools locally and connect to your Azure subscription.
Azure CLI
The Azure CLI 2.0 is a command-line tool for managing Azure resources. The CLI is designed to flexibly query data, support long-running operations as non-blocking processes, and make scripting easy. You can install it locally by following the steps in Install the Azure CLI.
To sign in to your Azure account with the Azure CLI, use the az login command.
az login
To select a tenant to sign in under, use:
az login --tenant <tenant>
To specify one of multiple subscriptions, get your subscription list by using az account list, and specify the subscription by using az account set.
az account list
az account set --subscription "<subscription name or ID>"
For more information, see Get started with Azure CLI.
Azure PowerShell
The Azure PowerShell Az module provides a set of cmdlets that use the Azure Resource Manager model for managing your Azure resources. You can use it in your browser with Azure Cloud Shell, or you can install it on your local machine by using the instructions in Install the Azure PowerShell module.
If you already have it installed locally, use the latest Azure PowerShell version to configure Azure Disk Encryption. Download the latest version from Azure PowerShell releases.
To sign in to your Azure account with Azure PowerShell, use the Connect-AzAccount cmdlet.
Connect-AzAccount
To specify one of multiple subscriptions, use the Get-AzSubscription cmdlet to list them, followed by the Set-AzContext cmdlet:
Set-AzContext -Subscription <SubscriptionId>
Run the Get-AzContext cmdlet to verify that the correct subscription is selected.
To confirm the Azure Disk Encryption cmdlets are installed, use the Get-Command cmdlet:
Get-Command *diskencryption*
For more information, see Getting started with Azure PowerShell.
Enable encryption on an existing or running Windows VM
In this scenario, you can enable encryption by using the Resource Manager template, PowerShell cmdlets, or CLI commands. If you need schema information for the virtual machine extension, see the Azure Disk Encryption for Windows extension article.
Enable encryption on existing or running VMs by using Azure PowerShell
Use the Set-AzVMDiskEncryptionExtension cmdlet to enable encryption on a running IaaS virtual machine in Azure.
Encrypt a running VM: The following script initializes your variables and runs the Set-AzVMDiskEncryptionExtension cmdlet. The resource group, VM, and key vault must already exist as prerequisites. Replace MyKeyVaultResourceGroup, MyVirtualMachineResourceGroup, MySecureVM, and MySecureVault with your values.
$KVRGname = 'MyKeyVaultResourceGroup'; $VMRGName = 'MyVirtualMachineResourceGroup'; $vmName = 'MySecureVM'; $KeyVaultName = 'MySecureVault'; $KeyVault = Get-AzKeyVault -VaultName $KeyVaultName -ResourceGroupName $KVRGname; $diskEncryptionKeyVaultUrl = $KeyVault.VaultUri; $KeyVaultResourceId = $KeyVault.ResourceId; Set-AzVMDiskEncryptionExtension -ResourceGroupName $VMRGname -VMName $vmName -DiskEncryptionKeyVaultUrl $diskEncryptionKeyVaultUrl -DiskEncryptionKeyVaultId $KeyVaultResourceId;Encrypt a running VM by using a KEK:
$KVRGname = 'MyKeyVaultResourceGroup'; $VMRGName = 'MyVirtualMachineResourceGroup'; $vmName = 'MyExtraSecureVM'; $KeyVaultName = 'MySecureVault'; $keyEncryptionKeyName = 'MyKeyEncryptionKey'; $KeyVault = Get-AzKeyVault -VaultName $KeyVaultName -ResourceGroupName $KVRGname; $diskEncryptionKeyVaultUrl = $KeyVault.VaultUri; $KeyVaultResourceId = $KeyVault.ResourceId; $keyEncryptionKeyUrl = (Get-AzKeyVaultKey -VaultName $KeyVaultName -Name $keyEncryptionKeyName).Key.kid; Set-AzVMDiskEncryptionExtension -ResourceGroupName $VMRGname -VMName $vmName -DiskEncryptionKeyVaultUrl $diskEncryptionKeyVaultUrl -DiskEncryptionKeyVaultId $KeyVaultResourceId -KeyEncryptionKeyUrl $keyEncryptionKeyUrl -KeyEncryptionKeyVaultId $KeyVaultResourceId;Note
The syntax for the value of disk-encryption-keyvault parameter is the full identifier string: /subscriptions/[subscription-id-guid]/resourceGroups/[resource-group-name]/providers/Microsoft.KeyVault/vaults/[keyvault-name]
The syntax for the value of the key-encryption-key parameter is the full URI to the KEK as in: https://[keyvault-name].vault.azure.net/keys/[kekname]/[kek-unique-id]Verify the disks are encrypted: To check on the encryption status of an IaaS VM, use the Get-AzVmDiskEncryptionStatus cmdlet.
Get-AzVmDiskEncryptionStatus -ResourceGroupName 'MyVirtualMachineResourceGroup' -VMName 'MySecureVM'
To disable the encryption, see Disable encryption and remove the encryption extension.
Enable encryption on existing or running VMs by using the Azure CLI
Use the az vm encryption enable command to enable encryption on a running IaaS virtual machine in Azure.
Encrypt a running VM:
az vm encryption enable --resource-group "MyVirtualMachineResourceGroup" --name "MySecureVM" --disk-encryption-keyvault "MySecureVault" --volume-type [All|OS|Data]Encrypt a running VM by using a KEK:
az vm encryption enable --resource-group "MyVirtualMachineResourceGroup" --name "MySecureVM" --disk-encryption-keyvault "MySecureVault" --key-encryption-key "MyKEK_URI" --key-encryption-keyvault "MySecureVaultContainingTheKEK" --volume-type [All|OS|Data]Note
The syntax for the value of disk-encryption-keyvault parameter is the full identifier string: /subscriptions/[subscription-id-guid]/resourceGroups/[resource-group-name]/providers/Microsoft.KeyVault/vaults/[keyvault-name]
The syntax for the value of the key-encryption-key parameter is the full URI to the KEK as in: https://[keyvault-name].vault.azure.net/keys/[kekname]/[kek-unique-id]Verify the disks are encrypted: To check on the encryption status of an IaaS VM, use the az vm encryption show command.
az vm encryption show --name "MySecureVM" --resource-group "MyVirtualMachineResourceGroup"
To disable the encryption, see Disable encryption and remove the encryption extension.
Use the Resource Manager template
You can enable disk encryption on existing or running IaaS Windows VMs in Azure by using the Resource Manager template to encrypt a running Windows VM.
On the Azure quickstart template, select Deploy to Azure.
Select the subscription, resource group, location, settings, legal terms, and agreement. Select Purchase to enable encryption on the existing or running IaaS VM.
The following table lists the Resource Manager template parameters for existing or running VMs:
| Parameter | Description |
|---|---|
| vmName | Name of the VM to run the encryption operation. |
| keyVaultName | Name of the key vault that the BitLocker key should be uploaded to. You can get it by using the cmdlet (Get-AzKeyVault -ResourceGroupName <MyKeyVaultResourceGroupName>). Vaultname or the Azure CLI command az keyvault list --resource-group "MyKeyVaultResourceGroup" |
| keyVaultResourceGroup | Name of the resource group that contains the key vault |
| keyEncryptionKeyURL | The URL of the key encryption key, in the format https://<keyvault-name>.vault.azure.net/key/<key-name>. If you don’t want to use a KEK, leave this field blank. |
| volumeType | Type of volume that the encryption operation is performed on. Valid values are OS, Data, and All. |
| forceUpdateTag | Pass in a unique value like a GUID every time the operation needs to be force run. |
| resizeOSDisk | Should the OS partition be resized to occupy full OS VHD before splitting system volume. |
| location | Location for all resources. |
New IaaS VMs created from customer-encrypted VHD and encryption keys
In this scenario, you can create a new VM from a pre-encrypted VHD and the associated encryption keys by using PowerShell cmdlets or CLI commands.
Use the instructions in Prepare a pre-encrypted Windows VHD. After the image is created, you can use the steps in the next section to create an encrypted Azure VM.
Encrypt VMs with pre-encrypted VHDs by using Azure PowerShell
You can enable disk encryption on your encrypted VHD with the PowerShell cmdlet Set-AzVMOSDisk. The following example gives you some common parameters.
$VirtualMachine = New-AzVMConfig -VMName "MySecureVM" -VMSize "Standard_A1"
$VirtualMachine = Set-AzVMOSDisk -VM $VirtualMachine -Name "SecureOSDisk" -VhdUri "os.vhd" Caching ReadWrite -Windows -CreateOption "Attach" -DiskEncryptionKeyUrl "https://mytestvault.vault.azure.net/secrets/Test1/514ceb769c984379a7e0230bddaaaaaa" -DiskEncryptionKeyVaultId "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myKVresourcegroup/providers/Microsoft.KeyVault/vaults/mytestvault"
New-AzVM -VM $VirtualMachine -ResourceGroupName "MyVirtualMachineResourceGroup"
Enable encryption on a newly added data disk
You can add a new disk to a Windows VM by using PowerShell, or through the Azure portal.
Note
Newly added data disk encryption must be enabled via PowerShell or the CLI only. Currently, the Azure portal doesn’t support enabling encryption on new disks.
Enable encryption on a newly added disk by using Azure PowerShell
When you use PowerShell to encrypt a new disk for Windows VMs, specify a new sequence version. The sequence version must be unique. The following script generates a GUID for the sequence version. In some cases, a newly added data disk might be encrypted automatically by the Azure Disk Encryption extension. Automatic encryption usually occurs when the VM reboots after the new disk comes online. This behavior typically occurs because "All" was specified for the volume type when disk encryption previously ran on the VM. If automatic encryption occurs on a newly added data disk, we recommend running the Set-AzVmDiskEncryptionExtension cmdlet again with a new sequence version. If your new data disk is automatically encrypted and you don’t want it encrypted, decrypt all drives first and then reencrypt with a new sequence version specifying OS for the volume type.
Encrypt a running VM: The following script initializes your variables and runs the Set-AzVMDiskEncryptionExtension cmdlet. The resource group, VM, and key vault must already exist as prerequisites. Replace MyKeyVaultResourceGroup, MyVirtualMachineResourceGroup, MySecureVM, and MySecureVault with your values. The following example uses "All" for the -VolumeType parameter, which includes both OS and Data volumes. If you only want to encrypt the OS volume, use "OS" for the -VolumeType parameter.
$KVRGname = 'MyKeyVaultResourceGroup'; $VMRGName = 'MyVirtualMachineResourceGroup'; $vmName = 'MySecureVM'; $KeyVaultName = 'MySecureVault'; $KeyVault = Get-AzKeyVault -VaultName $KeyVaultName -ResourceGroupName $KVRGname; $diskEncryptionKeyVaultUrl = $KeyVault.VaultUri; $KeyVaultResourceId = $KeyVault.ResourceId; $sequenceVersion = [Guid]::NewGuid(); Set-AzVMDiskEncryptionExtension -ResourceGroupName $VMRGname -VMName $vmName -DiskEncryptionKeyVaultUrl $diskEncryptionKeyVaultUrl -DiskEncryptionKeyVaultId $KeyVaultResourceId -VolumeType "All" –SequenceVersion $sequenceVersion;Encrypt a running VM by using a KEK: The following example uses "All" for the -VolumeType parameter, which includes both OS and Data volumes. If you only want to encrypt the OS volume, use "OS" for the -VolumeType parameter.
$KVRGname = 'MyKeyVaultResourceGroup'; $VMRGName = 'MyVirtualMachineResourceGroup'; $vmName = 'MyExtraSecureVM'; $KeyVaultName = 'MySecureVault'; $keyEncryptionKeyName = 'MyKeyEncryptionKey'; $KeyVault = Get-AzKeyVault -VaultName $KeyVaultName -ResourceGroupName $KVRGname; $diskEncryptionKeyVaultUrl = $KeyVault.VaultUri; $KeyVaultResourceId = $KeyVault.ResourceId; $keyEncryptionKeyUrl = (Get-AzKeyVaultKey -VaultName $KeyVaultName -Name $keyEncryptionKeyName).Key.kid; $sequenceVersion = [Guid]::NewGuid(); Set-AzVMDiskEncryptionExtension -ResourceGroupName $VMRGname -VMName $vmName -DiskEncryptionKeyVaultUrl $diskEncryptionKeyVaultUrl -DiskEncryptionKeyVaultId $KeyVaultResourceId -KeyEncryptionKeyUrl $keyEncryptionKeyUrl -KeyEncryptionKeyVaultId $KeyVaultResourceId -VolumeType "All" –SequenceVersion $sequenceVersion;Note
The syntax for the value of disk-encryption-keyvault parameter is the full identifier string: /subscriptions/[subscription-id-guid]/resourceGroups/[resource-group-name]/providers/Microsoft.KeyVault/vaults/[keyvault-name]
The syntax for the value of the key-encryption-key parameter is the full URI to the KEK as in: https://[keyvault-name].vault.azure.net/keys/[kekname]/[kek-unique-id]
Enable encryption on a newly added disk by using Azure CLI
The Azure CLI command automatically provides a new sequence version for you when you run the command to enable encryption. The example uses "All" for the volume-type parameter. You might need to change the volume-type parameter to OS if you're only encrypting the OS disk. In contrast to PowerShell syntax, the CLI doesn’t require the user to provide a unique sequence version when enabling encryption. The CLI automatically generates and uses its own unique sequence version value.
Encrypt a running VM:
az vm encryption enable --resource-group "MyVirtualMachineResourceGroup" --name "MySecureVM" --disk-encryption-keyvault "MySecureVault" --volume-type "All"Encrypt a running VM by using a KEK:
az vm encryption enable --resource-group "MyVirtualMachineResourceGroup" --name "MySecureVM" --disk-encryption-keyvault "MySecureVault" --key-encryption-key "MyKEK_URI" --key-encryption-keyvault "MySecureVaultContainingTheKEK" --volume-type "All"
Disable encryption and remove the encryption extension
You can disable the Azure Disk Encryption extension, and you can remove the Azure Disk Encryption extension. These operations are distinct.
To remove ADE, first disable encryption, and then remove the extension. If you remove the encryption extension without disabling it, the disks are still encrypted. If you disable encryption after removing the extension, the extension is reinstalled (to perform the decrypt operation) and you need to remove it a second time.
Disable encryption
You can disable encryption by using Azure PowerShell, the Azure CLI, or by using a Resource Manager template. Disabling encryption does not remove the extension (see Remove the encryption extension).
Warning
Disabling data disk encryption when both the OS and data disks are encrypted might have unexpected results. Disable encryption on all disks instead.
Disabling encryption starts a background process of BitLocker to decrypt the disks. Give this process enough time to complete before attempting to any re-enable encryption.
Disable disk encryption by using Azure PowerShell: To disable the encryption, use the Disable-AzVMDiskEncryption cmdlet.
Disable-AzVMDiskEncryption -ResourceGroupName "MyVirtualMachineResourceGroup" -VMName "MySecureVM" -VolumeType "all"Disable encryption by using the Azure CLI: To disable encryption, use the az vm encryption disable command.
az vm encryption disable --name "MySecureVM" --resource-group "MyVirtualMachineResourceGroup" --volume-type "all"Disable encryption by using a Resource Manager template:
- Select Deploy to Azure from the Disable disk encryption on running Windows VM template.
- Select the subscription, resource group, location, VM, volume type, legal terms, and agreement.
- Select Purchase to disable disk encryption on a running Windows VM.
Remove the encryption extension
If you want to decrypt your disks and remove the encryption extension, disable encryption before removing the extension. For more information, see disable encryption.
You can remove the encryption extension by using Azure PowerShell or the Azure CLI.
Disable disk encryption by using Azure PowerShell: To remove the encryption, use the Remove-AzVMDiskEncryptionExtension cmdlet.
Remove-AzVMDiskEncryptionExtension -ResourceGroupName "MyVirtualMachineResourceGroup" -VMName "MySecureVM"Disable encryption by using the Azure CLI: To remove encryption, use the az vm extension delete command.
az vm extension delete -g "MyVirtualMachineResourceGroup" --vm-name "MySecureVM" -n "AzureDiskEncryption"