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

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

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

ملاحظة

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

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

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

    يمكنك العثور على جميع الأجهزة الظاهرية المشفرة بواسطة ADE والإصدار الملحق، في جميع مجموعات الموارد الموجودة في اشتراك، باستخدام هذا البرنامج النصي 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 المشفرة في اشتراكك

    يمكنك العثور على جميع مثيلات VMSS المشفرة بواسطة ADE وإصدار الملحق، في جميع مجموعات الموارد الموجودة في اشتراك، باستخدام هذا البرنامج النصي 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 AD

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

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

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

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

‏‏الخطوات

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

    بالنسبة إلى CentOS 7.2، يتم دعم تشفير قرص نظام التشغيل عبر صورة خاصة. لاستخدام هذه الصورة، حدد "7.2n" كرمز SKU عند إنشاء الجهاز الظاهري:

     Set-AzVMSourceImage -VM $VirtualMachine -PublisherName "OpenLogic" -Offer "CentOS" -Skus "7.2n" -Version "latest"
    
  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:

    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، مرر لأسفل للاطلاع على حالة تشفير محركات الأقراص.

    VM Instance View

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

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

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

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

إعداد لينكس VHD مشفر مسبقا

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

Ubuntu 16

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

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

    Ubuntu 16.04 Setup - Configure encrypted volumes

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

    Ubuntu 16.04 Setup - Select devices to encrypt

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

    Ubuntu 16.04 Setup - Provide passphrase

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

    Ubuntu 16.04 Setup - Finish partitioning

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

    Ubuntu 16.04 Setup - Provide passphrase on boot

  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. إضافة أذونات قابلة للتنفيذ إلى البرنامج النصي:

     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 Setup - update-initramfs

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

openSUSE 13.2

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

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

    openSUSE 13.2 Setup - Encrypt Volume Group

  2. قم بتشغيل الجهاز الظاهري باستخدام كلمة المرور الخاصة بك.

    openSUSE 13.2 Setup - Provide passphrase on boot

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

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

  1. تحرير الـ etc/ dracut.conf، وإضافة السطر التالي :

    add_drivers+=" vfat ntfs nls_cp437 nls_iso8859-1"
    
  2. قم بالتعليق على هذه الأسطر في نهاية الملف /usr/lib/dracut/modules.d/90crypt/module-setup.sh:

     #        inst_multiple -o \
     #        $systemdutildir/system-generators/systemd-cryptsetup-generator \
     #        $systemdutildir/systemd-cryptsetup \
     #        $systemdsystemunitdir/systemd-ask-password-console.path \
     #        $systemdsystemunitdir/systemd-ask-password-console.service \
     #        $systemdsystemunitdir/cryptsetup.target \
     #        $systemdsystemunitdir/sysinit.target.wants/cryptsetup.target \
     #        systemd-ask-password systemd-tty-ask-password-agent
     #        inst_script "$moddir"/crypt-run-generator.sh /sbin/crypt-run-generator
    
  3. إلحاق السطر التالي في بداية الملف /usr/lib/dracut/modules.d/90crypt/parse-crypt.sh:

     DRACUT_SYSTEMD=0
    

    وتغيير جميع التكرارات:

     if [ -z "$DRACUT_SYSTEMD" ]; then
    

    لكي تتمكن من:

     if [ 1 ]; then
    
  4. تحرير /usr/lib/dracut/modules.d/90crypt/cryptroot-ask.sh وإلحاقه بـ "# فتح جهاز LUKS":

    MountPoint=/tmp-keydisk-mount
    KeyFileName=LinuxPassPhraseFileName
    echo "Trying to get the key from disks ..." >&2
    mkdir -p $MountPoint >&2
    modprobe vfat >/dev/null >&2
    modprobe ntfs >/dev/null >&2
    for SFS in /dev/sd*; do
    echo "> Trying device:$SFS..." >&2
    mount ${SFS}1 $MountPoint -t vfat -r >&2 ||
    mount ${SFS}1 $MountPoint -t ntfs -r >&2
    if [ -f $MountPoint/$KeyFileName ]; then
        echo "> keyfile got..." >&2
        cp $MountPoint/$KeyFileName /tmp-keyfile >&2
        luksfile=/tmp-keyfile
        umount $MountPoint >&2
        break
    fi
    done
    
  5. تشغيل /usr/sbin/dracut -f -v لتحديث initrd.

  6. يمكنك الآن إلغاء توفير الجهاز الظاهري وتحميل VHD الخاص بك إلى Azure.

CentOS 7 و RHEL 7

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

  1. حدد تشفير بياناتي عند تقسيم الأقراص.

    CentOS 7 Setup -Installation destination

  2. تأكد من تحديد تشفير لقسم الجذر.

    CentOS 7 Setup -Select encrypt for root partition

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

    CentOS 7 Setup - provide passphrase

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

    CentOS 7 Setup - Enter passphrase on bootup

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

  6. يمكنك الآن إلغاء توفير الجهاز الظاهري وتحميل VHD الخاص بك إلى Azure.

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

  1. تحرير الـ etc/ dracut.conf، وإضافة السطر التالي :

    add_drivers+=" vfat ntfs nls_cp437 nls_iso8859-1"
    
  2. قم بالتعليق على هذه الأسطر في نهاية الملف /usr/lib/dracut/modules.d/90crypt/module-setup.sh:

     #        inst_multiple -o \
     #        $systemdutildir/system-generators/systemd-cryptsetup-generator \
     #        $systemdutildir/systemd-cryptsetup \
     #        $systemdsystemunitdir/systemd-ask-password-console.path \
     #        $systemdsystemunitdir/systemd-ask-password-console.service \
     #        $systemdsystemunitdir/cryptsetup.target \
     #        $systemdsystemunitdir/sysinit.target.wants/cryptsetup.target \
     #        systemd-ask-password systemd-tty-ask-password-agent
     #        inst_script "$moddir"/crypt-run-generator.sh /sbin/crypt-run-generator
    
  3. إلحاق السطر التالي في بداية الملف /usr/lib/dracut/modules.d/90crypt/parse-crypt.sh:

     DRACUT_SYSTEMD=0
    

    وتغيير جميع التكرارات:

     if [ -z "$DRACUT_SYSTEMD" ]; then
    

    إلى

     if [ 1 ]; then
    
  4. قم بتحرير /usr/lib/dracut/modules.d/90crypt/cryptroot-ask.sh وإلحاق ما يلي بعد "# فتح جهاز LUKS":

    MountPoint=/tmp-keydisk-mount
    KeyFileName=LinuxPassPhraseFileName
    echo "Trying to get the key from disks ..." >&2
    mkdir -p $MountPoint >&2
    modprobe vfat >/dev/null >&2
    modprobe ntfs >/dev/null >&2
    for SFS in /dev/sd*; do
    echo "> Trying device:$SFS..." >&2
    mount ${SFS}1 $MountPoint -t vfat -r >&2 ||
    mount ${SFS}1 $MountPoint -t ntfs -r >&2
    if [ -f $MountPoint/$KeyFileName ]; then
        echo "> keyfile got..." >&2
        cp $MountPoint/$KeyFileName /tmp-keyfile >&2
        luksfile=/tmp-keyfile
        umount $MountPoint >&2
        break
    fi
    done
    
  5. قم بتشغيل "usr/sbin/dracut -f -v/" لتحديث initrd.

    CentOS 7 Setup - run /usr/sbin/dracut -f -v

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

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

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

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

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

 $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