برامج نصية لنموذج تشفير قرص 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
- تمكين تشفير القرص على جهاز ظاهري Linux موجود أو قيد التشغيل
- تعطيل التشفير على جهاز ظاهري يعمل بنظام Linux
- لا يسمح بتعطيل التشفير إلا على وحدات تخزين البيانات الخاصة بالأجهزة الظاهرية لنظام التشغيل Linux.
تشفير الأجهزة الظاهرية أو فك تشفيرها باستخدام تطبيق Microsoft Entra (الإصدار السابق)
- تمكين تشفير القرص على جهاز ظاهري Linux موجود أو قيد التشغيل
- تعطيل التشفير على جهاز ظاهري يعمل بنظام Linux
- لا يسمح بتعطيل التشفير إلا على وحدات تخزين البيانات الخاصة بالأجهزة الظاهرية لنظام التشغيل Linux.
- إنشاء قرص مدار مشفر جديد من كائن ثنائي كبير الحجم VHD/تخزين مشفر مسبقًا
- إنشاء قرص مُدار مشفر جديد بشرط أن يكون VHD مشفرًا مسبقًا وإعدادات التشفير المقابلة له
تشفير محرك أقراص نظام التشغيل على جهاز ظاهري يعمل بنظام Linux
المتطلبات الأساسية لتشفير قرص نظام التشغيل
- يجب أن يستخدم الجهاز الظاهري توزيعة متوافقة مع تشفير قرص نظام التشغيل كما هو مدرج في أنظمة التشغيل المدعومة تشفير قرص Azure
- يجب إنشاء الجهاز الظاهري من صورة Marketplace فيAzure Resource Manager.
- الجهاز الظاهري Azure مع 4 غيغابايت على الأقل من ذاكرة الوصول العشوائي (الحجم الموصى به هو 7 غيغابايت). راجع متطلبات الذاكرة لمزيد من المعلومات.
- (لـ RHEL و CentOS) تعطيل SELinux. لتعطيل SELinux، راجع "4.4.2. تعطيل SELinux" في دليل مستخدم SELinux والمسؤول على الجهاز الظاهري.
- بعد تعطيل SELinux، أعد تشغيل الجهاز الظاهري مرة واحدة على الأقل.
الخطوات
إنشاء جهاز ظاهري باستخدام أحد التوزيعات المحددة مسبقا.
قم بتكوين الجهاز الظاهري وفقا لاحتياجاتك. إذا كنت ستقوم بتشفير جميع محركات الأقراص (OS + data)، فيجب تحديد محركات أقراص البيانات وتثبيتها من /etc/fstab.
إشعار
استخدام UUID = ... لتحديد محركات أقراص البيانات في /etc/fstab بدلا من تحديد اسم جهاز الحظر (على سبيل المثال، /dev/sdb1). أثناء التشفير، يتغير ترتيب محركات الأقراص على الجهاز الظاهري. إذا كان جهازك الظاهري يعتمد على ترتيب محدد من أجهزة الحظر، فسوف يفشل في تركيبها بعد التشفير.
تسجيل الخروج من جلسات SSH.
لتشفير نظام التشغيل، حدد volumeType ك الكل أو OS عند تمكين التشفير.
إشعار
يجب قتل جميع عمليات مساحة المستخدم التي لا تعمل ك
systemd
خدمات باستخدامSIGKILL
. أعد تشغيل الجهاز الظاهري. عند تمكين تشفير قرص نظام التشغيل على جهاز ظاهري قيد التشغيل، خطط لوقت تعطل الجهاز الظاهري.راقب بشكل دوري تقدم التشفير باستخدام الإرشادات الواردة في القسم التالي.
بعد 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.
تكوين التشفير أثناء تثبيت التوزيع عن طريق القيام بالخطوات التالية:
حدد تكوين وحدات التخزين المشفرة عند تقسيم الأقراص.
قم بإنشاء محرك أقراص تمهيد منفصل، والذي يجب عدم تشفيره. تشفير محرك الأقراص الجذر.
قدم عبارة مرور. هذه هي عبارة المرور التي حملتها إلى قبو المفتاح.
إنهاء التقسيم.
عند تمهيد الجهاز الظاهري وتتم مطالبتك بعبارة مرور، استخدم عبارة المرور التي قدمتها في الخطوة 3.
قم بإعداد الجهاز الظاهري للتحميل إلى Azure باستخدام هذه الإرشادات. لا تقم بتشغيل الخطوة الأخيرة (إلغاء توفير الجهاز الظاهري) حتى الآن.
قم بتكوين التشفير للعمل مع Azure عن طريق تنفيذ الخطوات التالية:
إنشاء ملف ضمن
/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
تغيير تكوين السرداب فيetc/crypttab/. يجب أن يبدو مثل هذا:
xxx_crypt uuid=xxxxxxxxxxxxxxxxxxxxx none luks,discard,keyscript=/usr/local/sbin/azure_crypt_key.sh
إضافة أذونات قابلة للتنفيذ إلى البرنامج النصي:
sudo chmod +x /usr/local/sbin/azure_crypt_key.sh
تحرير
/etc/initramfs-tools/modules
عن طريق إلحاق الأسطر:vfat ntfs nls_cp437 nls_utf8 nls_iso8859-1
قم بتشغيل
update-initramfs -u -k all
لتحديث initramfs لجعلهkeyscript
ساري المفعول.الآن يمكنك إلغاء توفير الجهاز الظاهري.
تابع إلى الخطوة التالية وقم بتحميل 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