عينة البرامج النصية لتشفير قرص Azure

هام

من المقرر إيقاف تشفير الأقراص Azure في 15 سبتمبر 2028. حتى ذلك التاريخ، يمكنك الاستمرار في استخدام تشفير الأقراص Azure دون انقطاع. في 15 سبتمبر 2028، ستستمر أحمال العمل المفعلة ب ADE، لكن الأقراص المشفرة ستفشل في فتح التشغيل بعد إعادة تشغيل الجهاز الافتراضي، مما يؤدي إلى تعطيل الخدمة.

استخدم التشفير في المضيف للأجهزة الافتراضية الجديدة، أو فكر في أحجام المحركات الافتراضية السرية مع تشفير قرص نظام التشغيل لأحمال عمل الحوسبة السرية. يجب على جميع الأجهزة الافتراضية المفعلة بدعم ADE (بما في ذلك النسخ الاحتياطية) الانتقال إلى التشفير عند المضيف قبل تاريخ التقاعد لتجنب تعطيل الخدمة. راجع Migrationate from تشفير قرص Azure إلى Encryption في المضيف لمزيد من التفاصيل.

ينطبق على: ✔️ أجهزة Windows الظاهرية

توفر هذه المقالة نموذج من البرامج النصية لإعداد VHDs المشفرة مسبقا والمهام الأخرى.

إشعار

تشير جميع البرامج النصية إلى أحدث إصدار غير AAD (دليل Azure النشط) من ADE (تشفير قرص Azure)، باستثناء ما تم ذكره.

عينة برامج PowerShell النصية لتشفير قرص Azure

  • إدراج جميع الأجهزة الظاهرية المشفرة في اشتراكك

يمكنك العثور على جميع الأجهزة الظاهرية المشفرة بواسطة ADE وإصدار الملحق، في جميع مجموعات الموارد الموجودة في اشتراك، باستخدام البرنامج النصيFind_1passAdeVersion_VM.ps1 PowerShell.

بدلا من ذلك، تعرض أوامر cmdlets هذه جميع الأجهزة الظاهرية المشفرة بواسطة ADE (ولكن ليس إصدار الملحق):

$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 المشفرة في اشتراكك

    يمكنك العثور على جميع مثيلات مجموعات مقياس الجهاز الظاهري المشفرة بواسطة ADE وإصدار الملحق، في جميع مجموعات الموارد الموجودة في اشتراك، باستخدام البرنامج النصيFind_1passAdeVersion_VMSS.ps1 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 اسم مجموعة الموارد التي ينتمي إليها مخزن المفاتيح. ينشئ البرنامج النصي مجموعة موارد جديدة بهذا الاسم إذا لم تكن موجودة. صواب
$keyVaultName اسم مخزن المفاتيح الذي يتم وضع مفاتيح التشفير فيه. ينشئ البرنامج النصي مخزنا جديدا بهذا الاسم إذا لم يكن موجودا. صواب
$location موقع مخزن المفاتيح. تأكد من أن مخزن المفاتيح والأجهزة الظاهرية المراد تشفيرها في نفس الموقع. احصل على قائمة الموقع باستخدام Get-AzLocation. صواب
subscriptionId معرف اشتراك Azure المراد استخدامه. احصل على معرف الاشتراك الخاص بك باستخدام Get-AzSubscription. صواب
$aadAppName اسم تطبيق Microsoft Entra الذي يكتب البيانات السرية إلى Key Vault. ينشئ البرنامج النصي تطبيقا جديدا بهذا الاسم إذا لم يكن موجودا. إذا كان هذا التطبيق موجودا بالفعل، فمرر المعلمة aadClientSecret إلى البرنامج النصي. خطأ
$aadClientSecret سر العميل لتطبيق Microsoft Entra الذي تم إنشاؤه مسبقا. خطأ
$keyEncryptionKeyName اسم مفتاح تشفير المفتاح الاختياري في Key Vault. ينشئ البرنامج النصي مفتاحا جديدا بهذا الاسم إذا لم يكن موجودا. خطأ

قوالب Azure Resource Manager

تشفير الأجهزة الظاهرية أو فك تشفيرها بدون تطبيق Microsoft Entra

تشفير الأجهزة الظاهرية أو فك تشفيرها باستخدام تطبيق Microsoft Entra

إعداد VHD Windows مشفر مسبقًا

توضح الأقسام التالية كيفية إعداد Windows VHD مشفر مسبقا للنشر ك VHD مشفر في Azure IaaS. استخدم هذه المعلومات لإعداد وتشغيل جهاز ظاهري جديد Windows (VHD) على استرداد موقع Azure أو Azure. لمزيد من المعلومات حول كيفية إعداد وتحميل VHD، راجع تحميل VHD معمم واستخدامه لإنشاء أجهزة ظاهرية جديدة في Azure.

تحديث نهج المجموعة للسماح بخلاف TPM لحماية نظام التشغيل

قم بتكوين إعداد نهج مجموعة BitLocker لتشفير محرك BitLocker، والذي ستجده ضمن القوالب الإدارية> لتكوين الكمبيوتر> لنهج الكمبيوتر المحلي>مكونات Windows. تغيير هذا الإعداد إلى Operating System Drives>يتطلب مصادقة إضافية عند بدء التشغيل>اسمح لـ BitLocker بدون TPM متوافق، كما هو موضح في الشكل التالي:

Microsoft Antimalware في Azure

تثبيت مكونات ميزة 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>]

تحميل بيانات سرية الجهاز الظاهري المشفر مسبقا إلى قبو المفاتيح الخاص بك

قم بتحميل سر تشفير القرص الذي حصلت عليه سابقا كبيانات سرية في خزنة المفاتيح الخاصة بك. للقيام بذلك، امنح الإذن السري المعين وإذن wrapkey للحساب الذي يقوم بتحميل الأسرار.

# 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 by using a 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 في قسم "Disk-encryption secret not encrypted with a 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