Sdílet prostřednictvím


Ukázkové skripty pro službu Azure Disk Encryption

Platí pro: ✔️ Virtuální počítače s Windows

Tento článek obsahuje ukázkové skripty pro přípravu předšifrovaných virtuálních pevných disků a dalších úloh.

Poznámka:

Všechny skripty odkazují na nejnovější verzi ADE bez AAD s výjimkou případů, kdy je uvedeno.

Ukázkové skripty PowerShellu pro Azure Disk Encryption

Get-AzKeyVaultSecret -VaultName $KeyVaultName | where {$_.Tags.ContainsKey('DiskEncryptionKeyFileName')} | format-table @{Label="MachineName"; Expression={$_.Tags['MachineName']}}, @{Label="VolumeLetter"; Expression={$_.Tags['VolumeLetter']}}, @{Label="EncryptionKeyURL"; Expression={$_.Id}}

Použití skriptu PowerShellu pro požadavky služby Azure Disk Encryption

Pokud už znáte požadavky služby Azure Disk Encryption, můžete použít skript PowerShellu s požadavky služby Azure Disk Encryption. Příklad použití tohoto skriptu PowerShellu najdete v rychlém startu Šifrování virtuálního počítače. Komentáře můžete odebrat z oddílu skriptu počínaje řádkem 211 a zašifrovat všechny disky pro existující virtuální počítače v existující skupině prostředků.

Následující tabulka ukazuje, které parametry je možné použít ve skriptu PowerShellu:

Parametr Popis Povinné?
$resourceGroupName Název skupiny prostředků, do které patří služba KeyVault. Pokud neexistuje, vytvoří se nová skupina prostředků s tímto názvem. True
$keyVaultName Název služby KeyVault, do které se mají umístit šifrovací klíče. Pokud neexistuje, vytvoří se nový trezor s tímto názvem. True
$location Umístění služby KeyVault Ujistěte se, že služba KeyVault a virtuální počítače, které se mají šifrovat, jsou ve stejném umístění. Seznam umístění získáte pomocí rutiny Get-AzLocation. True
$subscriptionId Identifikátor předplatného Azure, které se má použít. Své ID předplatného můžete získat pomocí rutiny Get-AzSubscription. True
$aadAppName Název aplikace Microsoft Entra, která se použije k zápisu tajných kódů do služby KeyVault. Pokud aplikace se zadaným názvem neexistuje, vytvoří se nová. Pokud tato aplikace již existuje, předejte do skriptu parametr aadClientSecret. False
$aadClientSecret Tajný klíč klienta aplikace Microsoft Entra, která byla vytvořena dříve. False
$keyEncryptionKeyName Název volitelného šifrovacího klíče ve službě KeyVault Pokud neexistuje, vytvoří se nový klíč s tímto názvem. False

Šablony Resource Manageru

Šifrování nebo dešifrování virtuálních počítačů bez aplikace Microsoft Entra

Šifrování nebo dešifrování virtuálních počítačů pomocí aplikace Microsoft Entra (předchozí verze)

Příprava předšifrovaného virtuálního pevného disku s Windows

Následující části jsou nezbytné k přípravě předšifrovaného virtuálního pevného disku s Windows pro nasazení jako šifrovaného virtuálního pevného disku v Azure IaaS. Informace slouží k přípravě a spuštění nového virtuálního počítače s Windows (VHD) v Azure Site Recovery nebo Azure. Další informace o přípravě a nahrání virtuálního pevného disku najdete v tématu Nahrání generalizovaného virtuálního pevného disku a jeho použití k vytvoření nových virtuálních počítačů v Azure.

Aktualizace zásad skupiny tak, aby umožňovala ochranu operačního systému bez čipu TPM

Nakonfigurujte nastavení zásad skupiny BitLockeru pro nástroj BitLocker Drive Encryption, které najdete v části Součásti>systému Windows Konfigurace počítače s místní>zásadou>počítače. Změňte toto nastavení na Jednotky>operačního systému Vyžadovat další ověřování při spuštění>Povolit BitLocker bez kompatibilního čipu TPM, jak je znázorněno na následujícím obrázku:

Microsoft Antimalware v Azure

Instalace součástí funkcí nástroje BitLocker

Pro Windows Server 2012 a novější použijte následující příkaz:

dism /online /Enable-Feature /all /FeatureName:BitLocker /quiet /norestart

V systému Windows Server 2008 R2 použijte následující příkaz:

ServerManagerCmd -install BitLockers

Příprava svazku operačního systému pro BitLocker pomocí bdehdcfg

Pokud chcete zkomprimovat oddíl operačního systému a připravit počítač pro BitLocker, v případě potřeby spusťte bdehdcfg :

bdehdcfg -target c: shrink -quiet

Ochrana svazku operačního systému pomocí Nástroje BitLocker

manage-bde Pomocí příkazu povolte šifrování spouštěcího svazku pomocí ochrany externím klíčem. Umístěte také externí klíč (soubor .bek) na externí jednotku nebo svazek. Šifrování se povolí na systémovém nebo spouštěcím svazku po dalším restartování.

manage-bde -on %systemdrive% -sk [ExternalDriveOrVolume]
reboot

Poznámka:

Připravte virtuální počítač pomocí samostatného virtuálního pevného disku s daty a prostředky pro získání externího klíče pomocí Nástroje BitLocker.

Nahrání šifrovaného virtuálního pevného disku do účtu úložiště Azure

Po povolení šifrování BitLockeru se místní šifrovaný virtuální pevný disk musí nahrát do vašeho účtu úložiště.

    Add-AzVhd [-Destination] <Uri> [-LocalFilePath] <FileInfo> [[-NumberOfUploaderThreads] <Int32> ] [[-BaseImageUriToPatch] <Uri> ] [[-OverWrite]] [ <CommonParameters>]

Nahrání tajného klíče pro předšifrovaný virtuální počítač do trezoru klíčů

Tajný klíč pro šifrování disku, který jste získali dříve, se musí nahrát jako tajný kód ve vašem trezoru klíčů. K tomu musíte udělit oprávnění k nastavení tajných kódů a oprávnění k klíči wrapkey účtu, který bude tajné kódy nahrávat.

# 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

Tajný klíč šifrování disku není šifrovaný pomocí klíče KEK

K nastavení tajného kódu v trezoru klíčů použijte Set-AzKeyVaultSecret. Heslo se zakóduje jako řetězec base64 a pak se nahraje do trezoru klíčů. Kromě toho se ujistěte, že při vytváření tajného kódu v trezoru klíčů jsou nastavené následující značky.


 # 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

$secretUrl Použijte v dalším kroku pro připojení disku s operačním systémem bez použití klíče KEK.

Tajný kód šifrování disku šifrovaný pomocí klíče KEK

Než tajný klíč nahrajete do trezoru klíčů, můžete ho volitelně zašifrovat pomocí šifrovacího klíče klíče. Pomocí zalamovacího rozhraní API nejprve zašifrujte tajný klíč pomocí šifrovacího klíče. Výstupem této operace zabalení je řetězec kódovaný adresou URL base64, který pak můžete nahrát jako tajný kód pomocí rutiny 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

Použijte $KeyEncryptionKey a $secretUrl v dalším kroku pro připojení disku s operačním systémem pomocí klíče KEK.

Zadání adresy URL tajného kódu při připojení disku s operačním systémem

Bez použití klíče KEK

Při připojování disku s operačním systémem je potřeba předat $secretUrl. Adresa URL se vygenerovala v části Tajný klíč pro šifrování disků, který není šifrovaný pomocí klíče KEK.

    Set-AzVMOSDisk `
            -VM $VirtualMachine `
            -Name $OSDiskName `
            -SourceImageUri $VhdUri `
            -VhdUri $OSDiskUri `
            -Windows `
            -CreateOption FromImage `
            -DiskEncryptionKeyVaultId $KeyVault.ResourceId `
            -DiskEncryptionKeyUrl $SecretUrl

Použití klíče KEK

Když připojíte disk s operačním systémem, předejte $KeyEncryptionKey a $secretUrl. Adresa URL se vygenerovala v části "Tajný kód šifrování disku šifrovaný pomocí klíče 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