Przykładowe skrypty usługi Azure Disk Encryption

Dotyczy: ✔️ Windows maszyn wirtualnych

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

Uwaga

Wszystkie skrypty odnoszą się do najnowszej, innej niż AAD wersji programu ADE, z wyjątkiem przypadków, w których jest to zaznaczone.

Przykładowe skrypty programu PowerShell dla Azure Disk Encryption

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

    Wszystkie maszyny wirtualne zaszyfrowane 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.

    Alternatywnie te polecenia cmdlet będą wyświetlać wszystkie maszyny wirtualne zaszyfrowane 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

    Za pomocą tego skryptu programu PowerShell można znaleźć wszystkie wystąpienia zestawu skalowania maszyn wirtualnych szyfrowane przez usługę ADE i wersję rozszerzenia we wszystkich grupach zasobów znajdujących się w subskrypcji.

  • Wyświetlanie listy wszystkich wpisów tajnych 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 Azure Disk Encryption wymagań wstępnych

Jeśli znasz już wymagania wstępne dotyczące Azure Disk Encryption, możesz użyć skryptu programu PowerShell Azure Disk Encryption wymagań wstępnych. Przykład użycia tego skryptu programu PowerShell można znaleźć w przewodniku Szybki start szyfrowania 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:

Parametr Opis Obowiązkowe?
$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. Prawda
$keyVaultName Nazwa magazynu kluczy, w którym mają zostać umieszczone klucze szyfrowania. Nowy magazyn o tej nazwie zostanie utworzony, jeśli taki magazyn nie istnieje. Prawda
$location Lokalizacja magazynu kluczy. Upewnij się, że magazyn kluczy i maszyny wirtualne do zaszyfrowania znajdują się w tej samej lokalizacji. Pobierz listę lokalizacji za pomocą polecenia Get-AzLocation. Prawda
$subscriptionId Identyfikator subskrypcji platformy Azure, która ma być używana. Możesz pobrać identyfikator subskrypcji za pomocą polecenia Get-AzSubscription. Prawda
$aadAppName Nazwa aplikacji usługi Azure AD, która będzie używana do zapisywania wpisów tajnych w usłudze KeyVault. Jeśli taka aplikacja nie istnieje, zostanie utworzona nowa aplikacja o podanej nazwie. Jeśli ta aplikacja już istnieje, przekaż parametr aadClientSecret do skryptu. Fałsz
$aadClientSecret Klucz tajny klienta aplikacji usługi Azure AD, który został utworzony wcześniej. Fałsz
$keyEncryptionKeyName Nazwa opcjonalnego klucza szyfrowania klucza w usłudze KeyVault. Jeśli ten klucz nie istnieje, zostanie utworzony nowy klucz o tej nazwie. Fałsz

Szablony usługi Resource Manager

Szyfrowanie lub odszyfrowywanie maszyn wirtualnych bez aplikacji usługi Azure AD

Szyfrowanie lub odszyfrowywanie maszyn wirtualnych za pomocą aplikacji usługi Azure AD (poprzednia wersja)

Przygotowywanie wstępnie zaszyfrowanego dysku VHD Windows

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

Aktualizowanie zasad grupy w celu zezwolenia na ochronę systemu operacyjnego poza modułem TPM

Skonfiguruj ustawienie funkcji BitLocker zasady grupy Szyfrowanie dysków funkcją BitLocker, które znajdziesz w obszarze Zasady> komputera lokalneGo konfiguracja>komputeraSzablony> administracyjne Windows Składniki. Zmień to ustawienie na Dyski> systemu operacyjnegoWymagaj dodatkowego uwierzytelniania podczas uruchamianiaAllow>BitLocker bez zgodnego modułu TPM, jak pokazano na poniższej ilustracji:

Microsoft Antimalware in Azure

Instalowanie składników funkcji BitLocker

W przypadku Windows Server 2012 i nowszych użyj następującego polecenia:

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

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

ServerManagerCmd -install BitLockers

Przygotowywanie woluminu systemu operacyjnego dla funkcji BitLocker przy użyciu 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

Uwaga

Przygotuj maszynę wirtualną przy użyciu oddzielnego dysku VHD danych/zasobu, aby uzyskać klucz zewnętrzny przy użyciu funkcji BitLocker.

Upload zaszyfrowany wirtualny dysk twardy na koncie usługi Azure Storage

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

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

Upload wpis tajny dla wstępnie zaszyfrowanej maszyny wirtualnej do magazynu kluczy

Klucz tajny szyfrowania dysku uzyskany wcześniej musi zostać przekazany jako wpis tajny w magazynie kluczy. Wymaga to udzielenia ustawionego uprawnienia wpisu tajnego i uprawnienia zawijania do konta, które przekaże wpisy tajne.

# 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 za pomocą klucza KEK

Aby skonfigurować wpis tajny 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 podczas tworzenia wpisu tajnego w magazynie kluczy są ustawione następujące tagi.


 # 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 elementu $secretUrl w następnym kroku, aby dołączyć dysk systemu operacyjnego bez użycia klucza KEK.

Klucz tajny szyfrowania dysków zaszyfrowany przy użyciu klucza KEK

Przed przekazaniem wpisu tajnego do magazynu kluczy można go opcjonalnie zaszyfrować przy użyciu klucza szyfrowania klucza. Użyj interfejsu API zawijania, aby najpierw zaszyfrować wpis tajny przy użyciu klucza szyfrowania klucza. Dane wyjściowe tej operacji zawijania to ciąg zakodowany w adresie URL base64, który można następnie przekazać jako wpis tajny przy użyciu Set-AzKeyVaultSecret polecenia 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

Użyj polecenia $KeyEncryptionKey i $secretUrl w następnym kroku do dołączenia dysku systemu operacyjnego przy użyciu klucza 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ć $secretUrlpolecenie . Adres URL został wygenerowany w sekcji "Klucz tajny szyfrowania dysków, który nie jest zaszyfrowany za pomocą klucza KEK".

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

Korzystanie z klucza KEK

Po dołączeniu dysku systemu operacyjnego przekaż $KeyEncryptionKey polecenie i $secretUrl. Adres URL został wygenerowany w sekcji "Klucz tajny szyfrowania dysku zaszyfrowany przy użyciu klucza 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