عينة البرامج النصية لتشفير قرص Azure
ينطبق على: ✔️ أجهزة Windows الظاهرية
توفر هذه المقالة نماذج البرامج النصية لإعداد VHDs المشفرة مسبقًا والمهام الأخرى.
ملاحظة
تشير جميع البرامج النصية إلى أحدث إصدار غير AAD (دليل Azure النشط) من ADE (تشفير قرص Azure)، باستثناء ما تم ذكره.
عينة برامج PowerShell النصية لتشفير قرص Azure
إدراج جميع الأجهزة الافتراضية المشفرة في اشتراكك
يمكنك العثور على جميع الأجهزة الظاهرية المشفرة بتشفير قرص Azure وإصدار الملحق، في جميع مجموعات الموارد الموجودة في الاشتراك، باستخدام برنامج PowerShell النصي.
بدلاً من ذلك، ستعرض أوامر cmdlets هذه جميع الأجهزة الظاهرية المشفرة بتشفير قرص Azure (ولكن ليس إصدار الملحق):
$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}إدراج جميع مثيلات VMSS المشفرة في اشتراكك
يمكنك العثور على جميع مثيلات VMSS المشفرة بواسطة تشفير قرص Azure وإصدار الملحق، في جميع مجموعات الموارد الموجودة في اشتراك، باستخدام برنامج PowerShell النصي.
إدراج جميع أسرار تشفير القرص المستخدمة لتشفير أجهزة ظاهرية في مخزن المفاتيح
Get-AzKeyVaultSecret -VaultName $KeyVaultName | where {$_.Tags.ContainsKey('DiskEncryptionKeyFileName')} | format-table @{Label="MachineName"; Expression={$_.Tags['MachineName']}}, @{Label="VolumeLetter"; Expression={$_.Tags['VolumeLetter']}}, @{Label="EncryptionKeyURL"; Expression={$_.Id}}
استخدام البرنامج النصي PowerShell للمتطلبات الأساسية لتشفير قرص Azure
إذا كنت معتادًا بالفعل على المتطلبات الأساسية لتشفير قرص Azure، فيمكنك استخدام البرنامج النصي PowerShell المتطلبات الأساسية لتشفير قرص Azure. للحصول على مثال على استخدام هذا البرنامج النصي PowerShell، راجع تشفير التشغيل السريع للجهاز الظاهري. يمكنك إزالة التعليقات من قسم من البرنامج النصي، بدءًا من السطر 211، لتشفير جميع الأقراص للأجهزة الظاهرية الموجودة في مجموعة موارد موجودة.
يوضح الجدول التالي المعلمات التي يمكن استخدامها في برنامج PowerShell النصي:
| المعلمة | الوصف | إلزامي؟ |
|---|---|---|
| $resourceGroupName | اسم مجموعة الموارد التي ينتمي إليها KeyVault. سيتم إنشاء مجموعة موارد جديدة بهذا الاسم في حالة عدم وجودها. | صواب |
| $keyVaultName | اسم KeyVault الذي سيتم وضع مفاتيح التشفير فيه. سيتم إنشاء مخزن جديد بهذا الاسم إذا لم يكن موجودًا. | صواب |
| $location | موقع KeyVault. تأكد من أن KeyVault والأجهزة الظاهرية المراد تشفيرها في نفس الموقع. احصل على قائمة الموقع باستخدام Get-AzLocation. |
صواب |
| subscriptionId | معرف اشتراك Azure المراد استخدامه. يمكنك الحصول على معرف الاشتراك الخاص بك مع Get-AzSubscription. |
صواب |
| $aadAppName | اسم تطبيق Azure AD الذي سيتم استخدامه لنقل بيانات سرية إلى KeyVault. سيتم إنشاء تطبيق جديد بهذا الاسم إذا لم يكن موجودًا. إذا كان هذا التطبيق موجودا بالفعل، فقم بتمرير المعلمة aadClientSecret إلى البرنامج النصي. | خطأ |
| $aadClientSecret | سر العميل لتطبيق Azure AD الذي تم إنشاؤه مسبقًا. | خطأ |
| $keyEncryptionKeyName | اسم مفتاح تشفير المفتاح الاختياري في KeyVault. سيتم إنشاء مفتاح جديد بهذا الاسم في حالة عدم وجوده. | خطأ |
قوالب Azure Resource Manager
تشفير الأجهزة الظاهرية أو فك تشفيرها بدون تطبيق Azure AD
- تمكين تشفير القرص على جهاز Windows ظاهري موجود أو قيد التشغيل
- تعطيل التشفير على جهاز Windows ظاهري قيد التشغيل
تشفير الأجهزة الظاهرية أو فك تشفيرها باستخدام تطبيق Azure AD (الإصدار السابق)
- تمكين تشفير القرص على جهاز Windows ظاهري موجود أو قيد التشغيل
- تعطيل التشفير على جهاز Windows ظاهري قيد التشغيل
- إنشاء قرص مدار مشفر جديد من كائن ثنائي كبير الحجم VHD/تخزين مشفر مسبقًا
- إنشاء قرص مُدار مشفر جديد بشرط أن يكون VHD مشفرًا مسبقًا وإعدادات التشفير المقابلة له
إعداد VHD Windows مشفر مسبقًا
الأقسام التالية ضرورية لإعداد Windows VHD مشفر مسبقًا للنشر باعتباره VHD مشفرًا في Azure IaaS. استخدم المعلومات لإعداد جهاز Windows VM (VHD) جديد وتشغيله على Azure Site Recovery أو Azure. لمزيد من المعلومات حول كيفية إعداد VHD وتحميله، راجع تحميل VHD معمم واستخدامه لإنشاء أجهزة ظاهرية جديدة في Azure.
تحديث نهج المجموعة للسماح بخلاف TPM لحماية نظام التشغيل
قم بتكوين إعداد نهج مجموعة BitLocker لتشفير محرك BitLocker، والذي ستجده ضمن القوالب الإدارية> لتكوين الكمبيوتر> لنهج الكمبيوتر المحلي>مكونات Windows. تغيير هذا الإعداد إلى Operating System Drives>يتطلب مصادقة إضافية عند بدء التشغيل>اسمح لـ BitLocker بدون TPM متوافق، كما هو موضح في الشكل التالي:

تثبيت مكونات ميزة BitLocker
لنظام التشغيل Windows Server 2012 والإصدارات الأحدث، استخدم الأمر التالي:
dism /online /Enable-Feature /all /FeatureName:BitLocker /quiet /norestart
بالنسبة Windows Server 2008 R2، استخدم الأمر التالي:
ServerManagerCmd -install BitLockers
إعداد وحدة تخزين نظام التشغيل لـ BitLocker باستخدام bdehdcfg
لضغط قسم نظام التشغيل وإعداد الجهاز لـ BitLocker، قم بتنفيذ bdehdcfg إذا لزم الأمر:
bdehdcfg -target c: shrink -quiet
حماية وحدة تخزين نظام التشغيل باستخدام BitLocker
استخدم الأمر manage-bde لتمكين التشفير على وحدة تخزين التمهيد باستخدام واقي مفتاح خارجي. ضع أيضًا المفتاح الخارجي (ملف .bek) على محرك الأقراص الخارجي أو وحدة التخزين. يتم تمكين التشفير على وحدة تخزين النظام / التمهيد بعد إعادة التشغيل التالية.
manage-bde -on %systemdrive% -sk [ExternalDriveOrVolume]
reboot
ملاحظة
قم بإعداد الجهاز الظاهري باستخدام بيانات/مورد منفصل VHD للحصول على المفتاح الخارجي باستخدام BitLocker.
تحميل VHD مشفر إلى حساب تخزين Azure
بعد تمكين تشفير BitLocker، يجب تحميل VHD المشفر المحلي إلى حساب التخزين الخاص بك.
Add-AzVhd [-Destination] <Uri> [-LocalFilePath] <FileInfo> [[-NumberOfUploaderThreads] <Int32> ] [[-BaseImageUriToPatch] <Uri> ] [[-OverWrite]] [ <CommonParameters>]
قم بتحميل بيانات الجهاز الظاهري السرية المشفر مسبقًا إلى مخزن المفاتيح الخاصة بك
يجب تحميل البيانات السرية لتشفير القرص الذي حصلت عليه مسبقًا باعتبارها بيانات سرية في مخزن المفاتيح. يتطلب هذا منح إذن البيانات السرية الذي تم تعيينه وإذن تضمين الحساب الذي سيتم تحميل البيانات السرية.
# 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
البيانات السرية لتشفير القرص غير مشفر باستخدام KEK
لإعداد البيانات السرية في مخزن المفاتيح، استخدم Set-AzKeyVaultSecret. يتم ترميز عبارة المرور كسلسلة base64 ثم يتم تحميلها إلى مخزن المفاتيح. بالإضافة إلى ذلك، تأكد من تعيين العلامات التالية عند إنشاء البيانات السرية في مخزن المفاتيح.
# 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
استخدم $secretUrl الخطوة التالية لإرفاق قرص نظام التشغيل دون استخدام KEK.
البيانات السرية لتشفير القرص المشفر بـ KEK
قبل تحميل البيانات السرية إلى مخزن المفاتيح، يمكنك تشفيره اختياريًا باستخدام مفتاح تشفير مفتاح. استخدم واجهة برمجة تطبيقات التضمين لتشفير البيانات السرية أولًا باستخدام مفتاح تشفير المفتاح. إخراج عملية التضمين هذه عبارة عن سلسلة مشفرة لعنوان URL base64، والتي يمكنك بعد ذلك تحميلها كبيانات سرية باستخدام Set-AzKeyVaultSecret الأمر 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
استخدم $KeyEncryptionKey و $secretUrl في الخطوة التالية لإرفاق قرص نظام التشغيل باستخدام KEK.
حدد عنوان URL سريًا عند إرفاق قرص نظام التشغيل
بدون استخدام KEK
أثناء توصيل قرص نظام التشغيل، تحتاج إلى تمرير $secretUrl. تم إنشاء عنوان URL في قسم "البيانات السرية لتشفير القرص غير المشفر باستخدام KEK".
Set-AzVMOSDisk `
-VM $VirtualMachine `
-Name $OSDiskName `
-SourceImageUri $VhdUri `
-VhdUri $OSDiskUri `
-Windows `
-CreateOption FromImage `
-DiskEncryptionKeyVaultId $KeyVault.ResourceId `
-DiskEncryptionKeyUrl $SecretUrl
استخدام KEK
عند إرفاق قرص نظام التشغيل، قم بتمرير $KeyEncryptionKey و $secretUrl. تم إنشاء عنوان URL في قسم "البيانات السرية لتشفير القرص المشفر باستخدام 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