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

Mengenkripsi atau mendekripsi VM dengan aplikasi Microsoft Entra (rilis sebelumnya)

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:

Microsoft Antimalware in Azure

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