Udostępnij przez


Przykładowe skrypty usługi Azure Disk Encryption

Ważne

Usługa Azure Disk Encryption ma zostać wycofana 15 września 2028 r. Do tej pory można nadal korzystać z usługi Azure Disk Encryption bez zakłóceń. 15 września 2028 r. obciążenia z obsługą programu ADE będą nadal działać, ale zaszyfrowane dyski nie będą mogły zostać odblokowane po ponownym uruchomieniu maszyny wirtualnej, co spowoduje przerwy w działaniu usługi.

Użyj szyfrowania na hoście dla nowych maszyn wirtualnych. Wszystkie maszyny wirtualne z obsługą programu ADE (w tym kopie zapasowe) muszą migrować do szyfrowania na hoście przed datą wycofania, aby uniknąć przerw w działaniu usługi. Aby uzyskać szczegółowe informacje, zobacz Migrowanie z usługi Azure Disk Encryption do szyfrowania na hoście .

Dotyczy: ✔️ maszyny wirtualne z systemem Windows

Ten artykuł zawiera przykładowe skrypty do przygotowywania wstępnie zaszyfrowanych dysków VHD i innych zadań.

Note

Wszystkie skrypty odnoszą się do najnowszej wersji programu ADE, która nie jest oparta na AAD, chyba że zaznaczono inaczej.

Przykładowe skrypty programu PowerShell dla usługi Azure Disk Encryption

  • Wyświetlanie listy wszystkich zaszyfrowanych maszyn wirtualnych w ramach subskrypcji

    Za pomocą tego skryptu programu PowerShell można znaleźć wszystkie maszyny wirtualne zaszyfrowane za pomocą programu ADE i wersję rozszerzenia we wszystkich grupach zasobów znajdujących się w subskrypcji.

    Alternatywnie te polecenia cmdlet będą wyświetlać wszystkie maszyny wirtualne szyfrowane za pomocą programu ADE (ale nie wersję rozszerzenia):

    $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}
    
  • Wyświetlanie listy wszystkich zaszyfrowanych wystąpień usługi VMSS w ramach subskrypcji

    Wszystkie wystąpienia zestawów skalowania maszyn wirtualnych szyfrowanych za pomocą programu ADE i wersję rozszerzenia można znaleźć we wszystkich grupach zasobów znajdujących się w subskrypcji przy użyciu tego skryptu programu PowerShell.

  • Lista wszystkich tajnych kluczy szyfrowania dysków używanych do szyfrowania maszyn wirtualnych w magazynie kluczy

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

Korzystanie ze skryptu programu PowerShell dla wymagań wstępnych Azure Disk Encryption

Jeśli znasz już wymagania wstępne dotyczące usługi Azure Disk Encryption, możesz użyć skryptu programu PowerShell wymagań wstępnych usługi Azure Disk Encryption. Przykład użycia tego skryptu programu PowerShell znajdziesz w przewodniku „Szybki start: szyfrowanie maszyny wirtualnej”. Komentarze można usunąć z sekcji skryptu, począwszy od wiersza 211, aby zaszyfrować wszystkie dyski dla istniejących maszyn wirtualnych w istniejącej grupie zasobów.

W poniższej tabeli przedstawiono parametry, których można użyć w skryscie programu PowerShell:

Parameter Description Mandatory?
$resourceGroupName Nazwa grupy zasobów, do której należy usługa KeyVault. Jeśli grupa zasobów nie istnieje, zostanie utworzona nowa grupa zasobów o tej nazwie. True
$keyVaultName Nazwa magazynu kluczy, w którym mają zostać umieszczone klucze szyfrowania. Jeśli nie istnieje magazyn o podanej nazwie, zostanie utworzony nowy. True
$location Lokalizacja usługi KeyVault. Upewnij się, że KeyVault i maszyny wirtualne, które mają być szyfrowane, znajdują się w tej samej lokalizacji. Pobierz listę lokalizacji za pomocą polecenia Get-AzLocation. True
$subscriptionId Identyfikator subskrypcji platformy Azure, która ma być używana. Identyfikator subskrypcji można uzyskać za pomocą polecenia Get-AzSubscription. True
$aadAppName Nazwa aplikacji Microsoft Entra, która będzie używana do zapisywania wpisów tajnych w usłudze KeyVault. Jeśli nie istnieje, zostanie utworzona nowa aplikacja o tej nazwie. Jeśli ta aplikacja już istnieje, przekaż parametr aadClientSecret do skryptu. False
$aadClientSecret Tajny klucz klienta aplikacji Microsoft Entra, która została utworzona wcześniej. False
$keyEncryptionKeyName Nazwa opcjonalnego klucza szyfrowania w usłudze KeyVault. Jeśli ten klucz nie istnieje, zostanie utworzony nowy klucz o tej nazwie. False

Szablony „Resource Manager”

Szyfrowanie lub odszyfrowywanie maszyn wirtualnych bez aplikacji Firmy Microsoft Entra

Szyfrowanie lub odszyfrowywanie maszyn wirtualnych przy użyciu aplikacji Microsoft Entra (poprzedniej wersji)

Przygotowywanie uprzednio zaszyfrowanego wirtualnego dysku twardego systemu Windows

Poniższe sekcje są niezbędne do przygotowania wstępnie zaszyfrowanego wirtualnego dysku twardego systemu Windows do wdrożenia jako zaszyfrowanego wirtualnego dysku twardego w usłudze Azure IaaS. Skorzystaj z informacji, aby przygotować i uruchomić nową maszynę wirtualną z systemem Windows (VHD) w usłudze Azure Site Recovery lub na platformie Azure. Aby uzyskać więcej informacji na temat przygotowywania i przekazywania wirtualnego dysku twardego, zobacz Przekazywanie uogólnionego wirtualnego dysku twardego i używanie go do tworzenia nowych maszyn wirtualnych na platformie Azure.

Zaktualizuj zasady grupy, aby umożliwić ochronę systemu operacyjnego bez TPM

Skonfiguruj ustawienie Zasad grupy Szyfrowanie dysków funkcją BitLocker, które znajdziesz w obszarze Lokalna polityka komputera>Konfiguracja komputera>Szablony administracyjne>Składniki systemu Windows. Zmień to ustawienie na Dyski systemu operacyjnego>, Wymagaj dodatkowego uwierzytelniania podczas uruchamiania, > oraz Zezwalaj na funkcję BitLocker bez zgodnego modułu TPM, jak pokazano na poniższej grafice:

Oprogramowanie microsoft chroniące przed złośliwym kodem na platformie Azure

Instalowanie składników funkcji BitLocker

W przypadku systemu Windows Server 2012 lub nowszego użyj następującego polecenia:

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

W systemie Windows Server 2008 R2 użyj następującego polecenia:

ServerManagerCmd -install BitLockers

Przygotuj wolumin systemu operacyjnego dla funkcji BitLocker, używając polecenia bdehdcfg

Aby skompresować partycję systemu operacyjnego i przygotować maszynę do funkcji BitLocker, w razie potrzeby wykonaj polecenie bdehdcfg :

bdehdcfg -target c: shrink -quiet

Ochrona woluminu systemu operacyjnego przy użyciu funkcji BitLocker

manage-bde Użyj polecenia , aby włączyć szyfrowanie na woluminie rozruchowym przy użyciu funkcji ochrony klucza zewnętrznego. Umieść również klucz zewnętrzny (plik ".bek") na dysku zewnętrznym lub woluminie. Szyfrowanie jest włączone na woluminie systemowym/rozruchowym po następnym ponownym uruchomieniu.

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

Note

Przygotuj maszynę wirtualną z oddzielnym dyskiem VHD na dane/zasoby, aby uzyskać zewnętrzny klucz za pomocą BitLocker.

Przekazywanie zaszyfrowanego wirtualnego dysku twardego do konta usługi Azure Storage

Po włączeniu szyfrowania BitLocker należy przekazać lokalny zaszyfrowany wirtualny dysk twardy do konta magazynu.

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

Prześlij tajemnicę dla wstępnie zaszyfrowanej maszyny wirtualnej do magazynu kluczy

Tajemnica szyfrowania dysku, uzyskana wcześniej, musi zostać przesłana jako sekret do magazynu kluczy. Aby to zrobić, musisz przyznać uprawnienie do ustalania tajemnic i uprawnienie do obwijania kluczy do konta, które przekaże tajemnice.

# 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

Klucz tajny szyfrowania dysków nie jest szyfrowany przy użyciu klucza KEK

Aby skonfigurować tajemnicę w magazynie kluczy, użyj polecenia Set-AzKeyVaultSecret. Hasło jest kodowane jako ciąg base64, a następnie przekazywane do magazynu kluczy. Ponadto upewnij się, że następujące tagi są ustawione podczas tworzenia tajemnicy w magazynie kluczy.


 # 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

Użyj $secretUrl w następnym kroku, aby dołączyć dysk systemu operacyjnego bez użycia KEK.

Tajny klucz szyfrowania dysku zaszyfrowany przy użyciu klucza KEK

Zanim przekażesz sekret do magazynu kluczy, możesz opcjonalnie zaszyfrować go przy użyciu klucza szyfrującego. Użyj zawijania interfejsu API , aby najpierw zaszyfrować wpis tajny przy użyciu klucza szyfrowania klucza. Dane wyjściowe tej operacji wrapowania to ciąg zakodowany w base64 w formacie URL, który następnie można przekazać jako sekret przy użyciu polecenia cmdlet 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

Użyj $KeyEncryptionKey i $secretUrl w następnym kroku do dołączenia dysku systemu operacyjnego przy użyciu KEK.

Określanie tajnego adresu URL podczas dołączania dysku systemu operacyjnego

Bez używania klucza KEK

Podczas dołączania dysku systemu operacyjnego należy przekazać $secretUrl. Adres URL został wygenerowany w sekcji "Sekret szyfrowania dysków niezaszyfrowany kluczem KEK".

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

Korzystanie z KEK

Gdy dołączasz dysk systemu operacyjnego, przekaż $KeyEncryptionKey i $secretUrl. Adres URL został wygenerowany w sekcji "Tajemnica szyfrowania dysku zaszyfrowana przy użyciu 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