Voorbeeldscripts voor Azure Disk Encryption
Van toepassing op: ✔️ Windows-VM's
Dit artikel bevat voorbeeldscripts voor het voorbereiden van vooraf versleutelde VHD's en andere taken.
Notitie
Alle scripts verwijzen naar de nieuwste, niet-AAD-versie van ADE, behalve waar vermeld.
PowerShell-voorbeeldscripts voor Azure Disk Encryption
Alle versleutelde VM's in uw abonnement weergeven
U vindt alle met ADE versleutelde VM's en de extensieversie, in alle resourcegroepen die aanwezig zijn in een abonnement, met behulp van dit PowerShell-script.
Deze cmdlets bevatten ook alle met ADE versleutelde VM's (maar niet de extensieversie):
$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}
Alle versleutelde VMSS-exemplaren in uw abonnement weergeven
U vindt alle met ADE versleutelde instanties van virtuele-machineschaalsets en de extensieversie, in alle resourcegroepen die aanwezig zijn in een abonnement, met behulp van dit PowerShell-script.
Een lijst weergeven van alle schijfversleutelingsgeheimen die worden gebruikt voor het versleutelen van VM's in een sleutelkluis
Get-AzKeyVaultSecret -VaultName $KeyVaultName | where {$_.Tags.ContainsKey('DiskEncryptionKeyFileName')} | format-table @{Label="MachineName"; Expression={$_.Tags['MachineName']}}, @{Label="VolumeLetter"; Expression={$_.Tags['VolumeLetter']}}, @{Label="EncryptionKeyURL"; Expression={$_.Id}}
Het PowerShell-script met vereisten voor Azure Disk Encryption gebruiken
Als u al bekend bent met de vereisten voor Azure Disk Encryption, kunt u het PowerShell-script voor Azure Disk Encryption gebruiken. Zie de quickstart Een VM versleutelen voor een voorbeeld van het gebruik van dit PowerShell-script. U kunt de opmerkingen verwijderen uit een sectie van het script, te beginnen bij regel 211, om alle schijven voor bestaande VM's in een bestaande resourcegroep te versleutelen.
In de volgende tabel ziet u welke parameters kunnen worden gebruikt in het PowerShell-script:
Parameter | Description | Verplicht? |
---|---|---|
$resourceGroupName | Naam van de resourcegroep waartoe de KeyVault behoort. Er wordt een nieuwe resourcegroep met deze naam gemaakt als deze niet bestaat. | Waar |
$keyVaultName | Naam van de KeyVault waarin versleutelingssleutels moeten worden geplaatst. Er wordt een nieuwe kluis met deze naam gemaakt als deze niet bestaat. | Waar |
$location | Locatie van de KeyVault. Zorg ervoor dat de KeyVault- en VM's die moeten worden versleuteld zich op dezelfde locatie bevinden. Haal een locatielijst op met Get-AzLocation . |
Waar |
$subscriptionId | Id van het Azure-abonnement dat moet worden gebruikt. U kunt uw abonnements-ID ophalen met Get-AzSubscription . |
Waar |
$aadAppName | De naam van de Microsoft Entra-toepassing die wordt gebruikt om geheimen naar KeyVault te schrijven. Als er nog geen toepassing met deze naam bestaat, wordt deze aangemaakt. Als deze app al bestaat, geeft u de parameter aadClientSecret door aan het script. | Onwaar |
$aadClientSecret | Clientgeheim van de Microsoft Entra-toepassing die eerder is gemaakt. | Onwaar |
$keyEncryptionKeyName | Naam van optionele sleutelversleutelingssleutel in KeyVault. Er wordt een nieuwe sleutel met deze naam gemaakt als deze niet bestaat. | Onwaar |
Resource Manager-sjablonen
VM's versleutelen of ontsleutelen zonder een Microsoft Entra-app
- Schijfversleuteling inschakelen op een bestaande of actieve Windows-VM
- Versleuteling uitschakelen op een actieve Windows-VM
VM's versleutelen of ontsleutelen met een Microsoft Entra-app (vorige release)
- Schijfversleuteling inschakelen op een bestaande of actieve Windows-VM
- Versleuteling uitschakelen op een actieve Windows-VM
- Een nieuwe versleutelde beheerde schijf maken op basis van een vooraf versleutelde VHD-/opslag-blob
- Hiermee maakt u een nieuwe versleutelde beheerde schijf op basis van een vooraf versleutelde VHD en de bijbehorende versleutelingsinstellingen
Een vooraf versleutelde Windows-VHD voorbereiden
De volgende secties zijn nodig om een vooraf versleutelde Windows-VHD voor te bereiden voor implementatie als een versleutelde VHD in Azure IaaS. Gebruik de informatie om een nieuwe Windows-VM (VHD) voor te bereiden en op te starten in Azure Site Recovery of Azure. Zie Een gegeneraliseerde VHD uploaden en gebruiken om nieuwe VM's te maken in Azure voor meer informatie over het voorbereiden en uploaden van een VHD.
Groepsbeleid bijwerken om niet-TPM toe te staan voor besturingssysteembeveiliging
Configureer de BitLocker-groepsbeleidsinstelling BitLocker-stationsversleuteling, die u vindt onder Beheersjablonen beheersjablonen voor lokale computerbeleid>>>, Windows-onderdelen. Wijzig deze instelling in Besturingssysteemstations>vereisen extra verificatie bij het opstarten>van BitLocker toestaan zonder een compatibele TPM, zoals wordt weergegeven in de volgende afbeelding:
Onderdelen van BitLocker-onderdelen installeren
Gebruik voor Windows Server 2012 en hoger de volgende opdracht:
dism /online /Enable-Feature /all /FeatureName:BitLocker /quiet /norestart
Gebruik voor Windows Server 2008 R2 de volgende opdracht:
ServerManagerCmd -install BitLockers
Het besturingssysteemvolume voorbereiden voor BitLocker met behulp van bdehdcfg
Als u de besturingssysteempartitie wilt comprimeren en de machine wilt voorbereiden op BitLocker, voert u de bdehdcfg uit, indien nodig:
bdehdcfg -target c: shrink -quiet
Besturingssysteemvolume beveiligen met BitLocker
Gebruik de manage-bde
opdracht om versleuteling op het opstartvolume in te schakelen met behulp van een externe sleutelbeveiliging. Plaats ook de externe sleutel (.bek-bestand) op het externe station of volume. Versleuteling is ingeschakeld op het systeem-/opstartvolume na de volgende herstart.
manage-bde -on %systemdrive% -sk [ExternalDriveOrVolume]
reboot
Notitie
Bereid de VIRTUELE machine voor met een afzonderlijke gegevens-/resource-VHD voor het ophalen van de externe sleutel met behulp van BitLocker.
Versleutelde VHD uploaden naar een Azure-opslagaccount
Nadat BitLocker-versleuteling is ingeschakeld, moet de lokale versleutelde VHD worden geüpload naar uw opslagaccount.
Add-AzVhd [-Destination] <Uri> [-LocalFilePath] <FileInfo> [[-NumberOfUploaderThreads] <Int32> ] [[-BaseImageUriToPatch] <Uri> ] [[-OverWrite]] [ <CommonParameters>]
Upload het geheim voor de vooraf versleutelde VM naar uw sleutelkluis
Het schijfversleutelingsgeheim dat u eerder hebt verkregen, moet worden geüpload als een geheim in uw sleutelkluis. Hiervoor moet u de setgeheimmachtiging en de wrapkey-machtiging verlenen aan het account waarmee de geheimen worden geüpload.
# 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
Schijfversleutelingsgeheim niet versleuteld met een KEK
Als u het geheim in uw sleutelkluis wilt instellen, gebruikt u Set-AzKeyVaultSecret. De wachtwoordzin wordt gecodeerd als een base64-tekenreeks en vervolgens geüpload naar de sleutelkluis. Zorg er bovendien voor dat de volgende tags zijn ingesteld wanneer u het geheim in de sleutelkluis maakt.
# 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
Gebruik de $secretUrl
volgende stap voor het koppelen van de besturingssysteemschijf zonder KEK.
Schijfversleutelingsgeheim versleuteld met een KEK
Voordat u het geheim uploadt naar de sleutelkluis, kunt u het desgewenst versleutelen met behulp van een sleutelversleutelingssleutel. Gebruik de wrap-API om het geheim eerst te versleutelen met behulp van de sleutelversleutelingssleutel. De uitvoer van deze wrap-bewerking is een met base64 URL gecodeerde tekenreeks, die u vervolgens kunt uploaden als een geheim met behulp van de 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
Gebruik $KeyEncryptionKey
en $secretUrl
in de volgende stap voor het koppelen van de besturingssysteemschijf met behulp van KEK.
Een geheime URL opgeven wanneer u een besturingssysteemschijf koppelt
Zonder een KEK te gebruiken
Terwijl u de besturingssysteemschijf koppelt, moet u doorgeven $secretUrl
. De URL is gegenereerd in de sectie Schijfversleutelingsgeheim niet versleuteld met een KEK.
Set-AzVMOSDisk `
-VM $VirtualMachine `
-Name $OSDiskName `
-SourceImageUri $VhdUri `
-VhdUri $OSDiskUri `
-Windows `
-CreateOption FromImage `
-DiskEncryptionKeyVaultId $KeyVault.ResourceId `
-DiskEncryptionKeyUrl $SecretUrl
Een KEK gebruiken
Wanneer u de besturingssysteemschijf koppelt, geeft u door $KeyEncryptionKey
en $secretUrl
. De URL is gegenereerd in de sectie Schijfversleutelingsgeheim versleuteld met een 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