Share via


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

VM's versleutelen of ontsleutelen met een Microsoft Entra-app (vorige release)

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:

Microsoft Antimalware in Azure

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