Przykładowe skrypty usługi Azure Disk Encryption
Dotyczy: ✔️ maszyny wirtualne z systemem Windows
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 usługi ADE, z wyjątkiem przypadków, w których określono.
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.
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 wymagań wstępnych usługi 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 można znaleźć 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:
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. Jeśli nie istnieje, zostanie utworzony nowy magazyn o tej nazwie. | Prawda |
$location | Lokalizacja usługi KeyVault. Upewnij się, że maszyny wirtualne i keyvault, które mają być szyfrowane, 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 Microsoft Entra, 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 | Wpis tajny klienta utworzonej wcześniej aplikacji Microsoft Entra. | 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 Firmy Microsoft Entra
- Włączanie szyfrowania dysków na istniejącej lub uruchomionej maszynie wirtualnej z systemem Windows
- Wyłączanie szyfrowania na uruchomionej maszynie wirtualnej z systemem Windows
Szyfrowanie lub odszyfrowywanie maszyn wirtualnych przy użyciu aplikacji Microsoft Entra (poprzedniej wersji)
- Włączanie szyfrowania dysków na istniejącej lub uruchomionej maszynie wirtualnej z systemem Windows
- Wyłączanie szyfrowania na uruchomionej maszynie wirtualnej z systemem Windows
- Tworzenie nowego zaszyfrowanego dysku zarządzanego na podstawie wstępnie zaszyfrowanego wirtualnego dysku twardego/magazynu obiektu blob
- Tworzy nowy zaszyfrowany dysk zarządzany z preszyfrowanym dyskiem VHD i odpowiednimi ustawieniami szyfrowania
Przygotowywanie wstępnie 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.
Aktualizowanie zasad grupy w celu zezwolenia na ochronę systemu operacyjnego poza modułem TPM
Skonfiguruj ustawienie Zasad grupy funkcji BitLocker Szyfrowanie dysków funkcją BitLocker, które znajdziesz w obszarze Konfiguracja komputera lokalnego Konfiguracja>komputera>Szablony>administracyjne Składniki systemu Windows. Zmień to ustawienie na Dyski>systemu operacyjnego Wymagaj dodatkowego uwierzytelniania podczas uruchamiania>Zezwalaj na funkcję BitLocker bez zgodnego modułu TPM, jak pokazano na poniższej ilustracji:
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
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.
Przekazywanie zaszyfrowanego wirtualnego dysku twardego do konta 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>]
Przekazywanie wpisu tajnego 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. Aby to zrobić, musisz przyznać ustawione uprawnienie 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 przy użyciu 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 następujące tagi są ustawione podczas tworzenia wpisu tajnego 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 instrukcji $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żesz opcjonalnie zaszyfrować go przy użyciu klucza szyfrowania kluczy. Użyj zawijania interfejsu API , 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 następnie można 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 instrukcji $KeyEncryptionKey
i $secretUrl
w następnym kroku w celu 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ć $secretUrl
polecenie . Adres URL został wygenerowany w sekcji "Klucz tajny szyfrowania dysków, który nie jest zaszyfrowany przy użyciu 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