Skrip sampel Azure Disk Encryption
Berlaku untuk:✔️ ️ VM Windows
Artikel ini menyediakan skrip sampel untuk menyiapkan VHD pra-enkripsi dan tugas lainnya.
Catatan
Semua skrip mengacu pada ADE versi non-AAD terbaru, kecuali jika disebutkan.
Sampel skrip PowerShell untuk Azure Disk Encryption
Mencantumkan semua komputer virtual terenkripsi di langganan Anda
Anda dapat menemukan semua komputer virtual terenkripsi ADE dan versi ekstensi, di semua grup sumber daya yang ada dalam langganan, menggunakan skrip PowerShell ini.
Atau, cmdlet ini akan menampilkan semua komputer virtual terenkripsi ADE (tetapi bukan versi ekstensi):
$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}
Mencantumkan semua instans VMSS terenskripsi di langganan Anda
Anda dapat menemukan semua instans Set Skala Komputer Virtual terenkripsi ADE dan versi ekstensi, di semua grup sumber daya yang ada dalam langganan, menggunakan skrip PowerShell ini.
Mencantumkan semua rahasia enkripsi disk untuk mengenkripsi komputer virtual dalam brankas kunci
Get-AzKeyVaultSecret -VaultName $KeyVaultName | where {$_.Tags.ContainsKey('DiskEncryptionKeyFileName')} | format-table @{Label="MachineName"; Expression={$_.Tags['MachineName']}}, @{Label="VolumeLetter"; Expression={$_.Tags['VolumeLetter']}}, @{Label="EncryptionKeyURL"; Expression={$_.Id}}
Menggunakan skrip PowerShell prasyarat Azure Disk Encryption
Jika Anda sudah tidak asing dengan prasyarat untuk Azure Disk Encryption, Anda bisa menggunakan skrip PowerShell prasyarat Azure Disk Encryption. Untuk contoh penggunaan PowerShell ini, lihat Enkripsi Mulai Cepat Komputer Virtual. Anda bisa menghapus komentar dari bagian skrip, mulai dari baris 211, untuk mengenkripsi semua disk untuk komputer virtual yang ada di grup sumber daya yang ada.
Tabel berikut ini memperlihatkan parameter mana yang bisa digunakan dalam skrip PowerShell:
Parameter | Deskripsi | Wajib? |
---|---|---|
$resourceGroupName | Nama grup sumber daya tempat KeyVault berada. Grup sumber daya baru dengan nama ini akan dibuat jika tidak ada. | Benar |
$keyVaultName | Nama KeyVault tempat kunci enkripsi diletakkan. Brankas baru dengan nama ini akan dibuat jika belum ada. | Benar |
$location | Lokasi KeyVault. Pastikan Keyvault dan komputer virtual dienkripsi di lokasi yang sama. Dapatkan daftar lokasi dengan Get-AzLocation . |
Benar |
$subscriptionId | Pengidentifikasi langganan Azure yang akan digunakan. Anda bisa mendapatkan ID Langganan Anda dengan Get-AzSubscription . |
Benar |
$aadAppName | Nama aplikasi Microsoft Entra yang akan digunakan untuk menulis rahasia ke KeyVault. Aplikasi baru dengan nama ini akan dibuat jika belum ada. Jika aplikasi ini sudah ada, berikan parameter aadClientSecret ke skrip. | Salah |
$aadClientSecret | Rahasia klien aplikasi Microsoft Entra yang dibuat sebelumnya. | Salah |
$keyEncryptionKeyName | Nama kunci enkripsi utama opsional di KeyVault. Kunci baru dengan nama ini akan dibuat jika belum ada. | Salah |
Templat Resource Manager
Mengenkripsi atau mendekripsi VM tanpa aplikasi Microsoft Entra
- Mengaktifkan enkripsi disk pada Windows VM yang sudah ada atau sedang berjalan
- Menonaktifkan enkripsi pada Windows VM yang sedang berjalan
Mengenkripsi atau mendekripsi VM dengan aplikasi Microsoft Entra (rilis sebelumnya)
- Mengaktifkan enkripsi disk pada Windows VM yang sudah ada atau sedang berjalan
- Menonaktifkan enkripsi pada Windows VM yang sedang berjalan
- Membuat disk terkelola baru yang terenkripsi baru dari blob VHD/ penyimpanan pra-enkripsi
- Membuat disk terkelola baru yang terenkripsi menyediakan VHD pra-enkripsi dan pengaturan enkripsi yang sesuai
Menyiapkan Windows VHD pra-enkripsi
Bagian berikut ini diperlukan untuk menyiapkan Windows VHD pra-enkripsi untuk penyebaran sebagai VHD terenkripsi di Azure IaaS. Gunakan informasi untuk menyiapkan dan mem-boot Windows VM (VHD) segar di Azure Site Recovery atau Azure. Untuk informasi selengkapnya tentang cara menyiapkan dan mengunggah VHD, lihat Mengunggah VHD umum dan menggunakannya untuk membuat VM baru di Azure.
Perbarui kebijakan grup untuk mengizinkan non-TPM untuk perlindungan OS
Konfigurasikan pengaturan Kebijakan Grup BitLocker Enkripsi Drive BitLocker,yang akan Anda temukan di bawah Kebijakan Komputer Lokal>Konfigurasi Komputer>Templat Administratif>Komponen Windows. Ubah pengaturan ini ke Drive Sistem Operasi> Memerlukan autentikasi tambahan saat memulai>Izinkan BitLocker tanpa TPM yang kompatibel, seperti yang ditunjukkan pada gambar berikut ini:
Instal komponen fitur BitLocker
Untuk Windows Server 2012 dan yang lebih baru, gunakan perintah berikut ini:
dism /online /Enable-Feature /all /FeatureName:BitLocker /quiet /norestart
Untuk Windows Server 2008 R2 dan yang lebih baru, gunakan perintah berikut ini:
ServerManagerCmd -install BitLockers
Menyiapkan volume OS untuk BitLocker dengan menggunakan bdehdcfg
Untuk mengompres partisi OS dan menyiapkan komputer untuk BitLocker, jalankan bdehdcfg jika diperlukan:
bdehdcfg -target c: shrink -quiet
Melindungi volume OS dengan menggunakan BitLocker
Gunakan perintah manage-bde
untuk mengaktifkan enkripsi pada volume boot yang menggunakan pelindung kunci eksternal. Juga tempatkan kunci eksternal (file .bek) pada drive atau volume eksternal. Enkripsi diaktifkan pada volume sistem/boot setelah reboot berikutnya.
manage-bde -on %systemdrive% -sk [ExternalDriveOrVolume]
reboot
Catatan
Siapkan VM dengan data/sumber daya VHD terpisah untuk mendapat kunci eksternal dengan menggunakan BitLocker.
Unggah VHD terenkripsi ke akun penyimpanan Azure
Setelah enkripsi BitLocker diaktifkan, VHD terenkripsi lokal perlu diunggah ke akun penyimpanan Anda.
Add-AzVhd [-Destination] <Uri> [-LocalFilePath] <FileInfo> [[-NumberOfUploaderThreads] <Int32> ] [[-BaseImageUriToPatch] <Uri> ] [[-OverWrite]] [ <CommonParameters>]
Mengunggah rahasia untuk komputer virtual pra-enkripsi ke brankas kunci Anda
Rahasia enkripsi disk yang Anda peroleh sebelumnya harus diunggah sebagai rahasia di brankas kunci Anda. Untuk melakukannya, Anda harus memberikan izin rahasia yang ditetapkan dan izin wrapkey ke akun yang akan mengunggah rahasia.
# 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
Rahasia enkripsi disk tidak dienkripsi dengan KEK
Untuk menyiapkan rahasia dalam brankas kunci Anda, gunakan Set-AzKeyVaultSecret. Frasa sandi dikodekan sebagai string base64 lalu diunggah ke brankas kunci. Selain itu, pastikan tag berikut diatur saat Anda membuat rahasia di brankas kunci.
# 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
Gunakan $secretUrl
di langkah berikutnya agar melampirkan disk OS tanpa menggunakan KEK.
Rahasia enkripsi disk yang dienkripsi dengan KEK
Sebelum Anda mengunggah rahasia ke brankas kunci, Anda bisa mengenkripsinya secara opsional dengan menggunakan kunci enkripsi utama. Gunakan API terbungkus untuk mengenkripsi rahasia dulu menggunakan kunci enkripsi utama. Output operasi terbungkus ini adalah string yang dikodekan URL base64, yang kemudian bisa Anda unggah sebagai rahasia dengan menggunakan 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
Gunakan $KeyEncryptionKey
dan $secretUrl
dalam langkah berikutnya untuk melampirkan disk OS menggunakan KEK.
Tentukan URL rahasia saat Anda melampirkan disk OS
Tanpa menggunakan KEK
Saat Anda melampirkan disk OS, Anda harus lolos $secretUrl
. URL dihasilkan di bagian "Rahasia enkripsi disk tidak dienkripsi dengan KEK".
Set-AzVMOSDisk `
-VM $VirtualMachine `
-Name $OSDiskName `
-SourceImageUri $VhdUri `
-VhdUri $OSDiskUri `
-Windows `
-CreateOption FromImage `
-DiskEncryptionKeyVaultId $KeyVault.ResourceId `
-DiskEncryptionKeyUrl $SecretUrl
Menggunakan KEK
Ketika Anda melampirkan disk OS, lalui $KeyEncryptionKey
dan $secretUrl
. URL dihasilkan di bagian "Rahasia enkripsi disk dienkripsi dengan 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