برامج نصية لنموذج تشفير قرص Azure لأجهزة Linux الظاهرية

تنبيه

تشير هذه المقالة إلى CentOS، وهو توزيع Linux يقترب من حالة نهاية العمر الافتراضي (EOL). يرجى مراعاة استخدامك والتخطيط وفقا لذلك. لمزيد من المعلومات، راجع إرشادات نهاية العمر الافتراضي CentOS.

ينطبق على: ✔️ أجهزة Linux الظاهرية ✔️ مجموعات مقياس مرنة

توفر هذه المقالة نموذج من البرامج النصية لإعداد 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 اسم تطبيق Microsoft Entra الذي سيتم استخدامه لكتابة الأسرار إلى KeyVault. سيتم إنشاء تطبيق جديد بهذا الاسم إذا لم يكن موجودًا. إذا كان هذا التطبيق موجودا بالفعل، فقم بتمرير المعلمة aadClientSecret إلى البرنامج النصي. خطأ
$aadClientSecret سر العميل لتطبيق Microsoft Entra الذي تم إنشاؤه مسبقا. خطأ
$keyEncryptionKeyName اسم مفتاح تشفير المفتاح الاختياري في KeyVault. سيتم إنشاء مفتاح جديد بهذا الاسم في حالة عدم وجوده. خطأ

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

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

تشفير محرك أقراص نظام التشغيل على جهاز ظاهري يعمل بنظام Linux

المتطلبات الأساسية لتشفير قرص نظام التشغيل

  • يجب أن يستخدم الجهاز الظاهري توزيعة متوافقة مع تشفير قرص نظام التشغيل كما هو مدرج في أنظمة التشغيل المدعومة تشفير قرص Azure
  • يجب إنشاء الجهاز الظاهري من صورة Marketplace فيAzure Resource Manager.
  • الجهاز الظاهري Azure مع 4 غيغابايت على الأقل من ذاكرة الوصول العشوائي (الحجم الموصى به هو 7 غيغابايت). راجع متطلبات الذاكرة لمزيد من المعلومات.
  • (لـ RHEL و CentOS) تعطيل SELinux. لتعطيل SELinux، راجع "4.4.2. تعطيل SELinux" في دليل مستخدم SELinux والمسؤول على الجهاز الظاهري.
  • بعد تعطيل SELinux، أعد تشغيل الجهاز الظاهري مرة واحدة على الأقل.

‏‏الخطوات

  1. إنشاء جهاز ظاهري باستخدام أحد التوزيعات المحددة مسبقا.

  2. قم بتكوين الجهاز الظاهري وفقا لاحتياجاتك. إذا كنت ستقوم بتشفير جميع محركات الأقراص (OS + data)، فيجب تحديد محركات أقراص البيانات وتثبيتها من /etc/fstab.

    إشعار

    استخدام UUID = ... لتحديد محركات أقراص البيانات في /etc/fstab بدلا من تحديد اسم جهاز الحظر (على سبيل المثال، /dev/sdb1). أثناء التشفير، يتغير ترتيب محركات الأقراص على الجهاز الظاهري. إذا كان جهازك الظاهري يعتمد على ترتيب محدد من أجهزة الحظر، فسوف يفشل في تركيبها بعد التشفير.

  3. تسجيل الخروج من جلسات SSH.

  4. لتشفير نظام التشغيل، حدد volumeType ك الكل أو OS عند تمكين التشفير.

    إشعار

    يجب قتل جميع عمليات مساحة المستخدم التي لا تعمل كsystemdخدمات باستخدام SIGKILL. أعد تشغيل الجهاز الظاهري. عند تمكين تشفير قرص نظام التشغيل على جهاز ظاهري قيد التشغيل، خطط لوقت تعطل الجهاز الظاهري.

  5. راقب بشكل دوري تقدم التشفير باستخدام الإرشادات الواردة في القسم التالي.

  6. بعد Get-AzVmDiskEncryptionStatus يعرض "VMRestartPending"، أعد تشغيل جهازك الظاهري إما عن طريق تسجيل الدخول إليه أو باستخدام المدخل أو PowerShell أو CLI.

    C:\> Get-AzVmDiskEncryptionStatus  -ResourceGroupName $ResourceGroupName -VMName $VMName
    -ExtensionName $ExtensionName
    
    OsVolumeEncrypted          : VMRestartPending
    DataVolumesEncrypted       : NotMounted
    OsVolumeEncryptionSettings : Microsoft.Azure.Management.Compute.Models.DiskEncryptionSettings
    ProgressMessage            : OS disk successfully encrypted, reboot the VM
    

    قبل إعادة التشغيل، نوصي بحفظ تشخيصات التمهيد للجهاز الظاهري.

مراقبة تقدم تشفير نظام التشغيل

يمكنك مراقبة تقدم تشفير نظام التشغيل بثلاث طرق:

  • استخدمGet-AzVmDiskEncryptionStatus cmdlet وافحص حقل ProgressMessage:

    Get-AzVMDiskEncryptionStatus -ResourceGroupName $_.ResourceGroupName -VMName $_.Name
    
    OsVolumeEncrypted          : EncryptionInProgress
    DataVolumesEncrypted       : NotMounted
    OsVolumeEncryptionSettings : Microsoft.Azure.Management.Compute.Models.DiskEncryptionSettings
    ProgressMessage            : OS disk encryption started
    

    بعد وصول الجهاز الظاهري إلى "بدء تشفير قرص نظام التشغيل"، يستغرق الأمر حوالي 40 إلى 50 دقيقة على جهاز ظاهري مدعوم بسعة تخزين Premium.

    بسبب المشكلة #388 في WALinuxAgent، OsVolumeEncrypted وDataVolumesEncryptedتظهر كما هو الحال Unknown في بعض التوزيعات. باستخدام WALinuxAgent الإصدار 2.1.5 والإصدارات الأحدث، يتم إصلاح هذه المشكلة تلقائيا. إذا رأيت Unknown في الإخراج، فيمكنك التحقق من حالة تشفير القرص باستخدام مستكشف موارد Azure.

    انتقل إلى مستكشف موارد Azure، ثم قم بتوسيع هذا التدرج الهرمي في لوحة التحديد على اليسار:

    |-- subscriptions
       |-- [Your subscription]
            |-- resourceGroups
                 |-- [Your resource group]
                      |-- providers
                           |-- Microsoft.Compute
                                |-- virtualMachines
                                     |-- [Your virtual machine]
                                          |-- InstanceView
    

    في InstanceView، مرر لأسفل للاطلاع على حالة تشفير محركات الأقراص.

    طريقة عرض مثيل الجهاز الظاهري

  • انظر إلى تشخيصات التمهيد. يجب أن تكون الرسائل الواردة من ملحق ADE مسبوقة بـ [AzureDiskEncryption].

  • سجل الدخول إلى الجهاز الظاهري عبر SSH، واحصل على سجل الملحق من:

    /var/log/azure/Microsoft.Azure.Security.AzureDiskEncryptionForLinux

    نوصي بعدم تسجيل الدخول إلى الجهاز الظاهري أثناء تقدم تشفير نظام التشغيل. انسخ السجلات فقط عند فشل الطريقتين الأخريين.

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

يمكن أن يختلف التحضير ل VHDs المشفرة مسبقا اعتمادا على التوزيع. تتوفر أمثلة على إعداد Ubuntu وopenSUSE وCentOS 7.

تكوين التشفير أثناء تثبيت التوزيع عن طريق القيام بالخطوات التالية:

  1. حدد تكوين وحدات التخزين المشفرة عند تقسيم الأقراص.

    إعداد Ubuntu 16.04 - تكوين وحدات التخزين المشفرة

  2. قم بإنشاء محرك أقراص تمهيد منفصل، والذي يجب عدم تشفيره. تشفير محرك الأقراص الجذر.

    إعداد Ubuntu 16.04 - تحديد الأجهزة للتشفير

  3. قدم عبارة مرور. هذه هي عبارة المرور التي حملتها إلى قبو المفتاح.

    إعداد Ubuntu 16.04 - توفير عبارة المرور

  4. إنهاء التقسيم.

    إعداد Ubuntu 16.04 - إنهاء التقسيم

  5. عند تمهيد الجهاز الظاهري وتتم مطالبتك بعبارة مرور، استخدم عبارة المرور التي قدمتها في الخطوة 3.

    إعداد Ubuntu 16.04 - توفير عبارة مرور عند التمهيد

  6. قم بإعداد الجهاز الظاهري للتحميل إلى Azure باستخدام هذه الإرشادات. لا تقم بتشغيل الخطوة الأخيرة (إلغاء توفير الجهاز الظاهري) حتى الآن.

قم بتكوين التشفير للعمل مع Azure عن طريق تنفيذ الخطوات التالية:

  1. إنشاء ملف ضمن /usr/local/sbin/azure_crypt_key.sh، مع المحتوى في البرنامج النصي التالي. انتبه إلى KeyFileName، لأنه اسم ملف عبارة المرور المستخدمة من قبل Azure.

    #!/bin/sh
    MountPoint=/tmp-keydisk-mount
    KeyFileName=LinuxPassPhraseFileName
    echo "Trying to get the key from disks ..." >&2
    mkdir -p $MountPoint
    modprobe vfat >/dev/null 2>&1
    modprobe ntfs >/dev/null 2>&1
    sleep 2
    OPENED=0
    cd /sys/block
    for DEV in sd*; do
    
        echo "> Trying device: $DEV ..." >&2
        mount -t vfat -r /dev/${DEV}1 $MountPoint >/dev/null||
        mount -t ntfs -r /dev/${DEV}1 $MountPoint >/dev/null
        if [ -f $MountPoint/$KeyFileName ]; then
                cat $MountPoint/$KeyFileName
                umount $MountPoint 2>/dev/null
                OPENED=1
                break
        fi
        umount $MountPoint 2>/dev/null
    done
    
      if [ $OPENED -eq 0 ]; then
        echo "FAILED to find suitable passphrase file ..." >&2
        echo -n "Try to enter your password: " >&2
        read -s -r A </dev/console
        echo -n "$A"
     else
        echo "Success loading keyfile!" >&2
    fi
    
  2. تغيير تكوين السرداب فيetc/crypttab/. يجب أن يبدو مثل هذا:

     xxx_crypt uuid=xxxxxxxxxxxxxxxxxxxxx none luks,discard,keyscript=/usr/local/sbin/azure_crypt_key.sh
    
  3. إضافة أذونات قابلة للتنفيذ إلى البرنامج النصي:

     sudo chmod +x /usr/local/sbin/azure_crypt_key.sh
    
  4. تحرير /etc/initramfs-tools/modules عن طريق إلحاق الأسطر:

     vfat
     ntfs
     nls_cp437
     nls_utf8
     nls_iso8859-1
    
  5. قم بتشغيل update-initramfs -u -k all لتحديث initramfs لجعلهkeyscript ساري المفعول.

  6. الآن يمكنك إلغاء توفير الجهاز الظاهري.

    إعداد Ubuntu 16.04 - update-initramfs

  7. تابع إلى الخطوة التالية وقم بتحميل VHD الخاص بك إلى Azure.

تحميل VHD مشفر إلى حساب تخزين Azure

بعد تمكين تشفير DM-Crypt، يجب تحميل VHD المشفر المحلي إلى حساب التخزين الخاص بك.

    Add-AzVhd [-Destination] <Uri> [-LocalFilePath] <FileInfo> [[-NumberOfUploaderThreads] <Int32> ] [[-BaseImageUriToPatch] <Uri> ] [[-OverWrite]] [ <CommonParameters>]

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

عند التشفير باستخدام تطبيق Microsoft Entra (الإصدار السابق)، يجب تحميل سر تشفير القرص الذي حصلت عليه مسبقا كبيانات سرية في مخزن المفاتيح الخاص بك. يحتاج المخزن الرئيسي إلى تمكين تشفير القرص والأذونات لعميل Microsoft Entra الخاص بك.

 $AadClientId = "My-AAD-Client-Id"
 $AadClientSecret = "My-AAD-Client-Secret"

 $key vault = New-AzKeyVault -VaultName $KeyVaultName -ResourceGroupName $ResourceGroupName -Location $Location

 Set-AzKeyVaultAccessPolicy -VaultName $KeyVaultName -ResourceGroupName $ResourceGroupName -ServicePrincipalName $AadClientId -PermissionsToKeys all -PermissionsToSecrets all
 Set-AzKeyVaultAccessPolicy -VaultName $KeyVaultName -ResourceGroupName $ResourceGroupName -EnabledForDiskEncryption

بيانات سرية تشفير القرص غير مشفرة باستخدام 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 `
            -Linux `
            -CreateOption FromImage `
            -DiskEncryptionKeyVaultId $KeyVault.ResourceId `
            -DiskEncryptionKeyUrl $SecretUrl

استخدام KEK

عند إرفاق قرص نظام التشغيل، قم بتمرير $KeyEncryptionKey و $secretUrl. تم إنشاء عنوان URL في قسم "البيانات السرية لتشفير القرص المشفر باستخدام KEK".

    Set-AzVMOSDisk `
            -VM $VirtualMachine `
            -Name $OSDiskName `
            -SourceImageUri $CopiedTemplateBlobUri `
            -VhdUri $OSDiskUri `
            -Linux `
            -CreateOption FromImage `
            -DiskEncryptionKeyVaultId $KeyVault.ResourceId `
            -DiskEncryptionKeyUrl $SecretUrl `
            -KeyEncryptionKeyVaultId $KeyVault.ResourceId `
            -KeyEncryptionKeyURL $KeyEncryptionKey.Id