عينة البرامج النصية لتشفير قرص 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

تشفير الأجهزة الظاهرية أو فك تشفيرها باستخدام تطبيق Azure AD (الإصدار السابق)

إعداد 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 متوافق، كما هو موضح في الشكل التالي:

Microsoft Antimalware in 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>]

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

يجب تحميل البيانات السرية لتشفير القرص الذي حصلت عليه مسبقًا باعتبارها بيانات سرية في مخزن المفاتيح. يتطلب هذا منح إذن البيانات السرية الذي تم تعيينه وإذن تضمين الحساب الذي سيتم تحميل البيانات السرية.

# 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