البرنامج التعليمي: تشفير وفك تشفير الكائنات الثنائية كبيرة الحجم باستخدام Azure Key Vault

في هذا البرنامج التعليمي، ستتعلم كيفية استخدام التشفير من جانب العميل لتشفير وفك تشفير الكائنات الثنائية كبيرة الحجم باستخدام مفتاح مخزن مع Azure Key Vault.

يدعم Azure Blob Storage كلا من التشفير من جانب الخدمة والعميل. بالنسبة لمعظم السيناريوهات، توصي Microsoft باستخدام ميزات التشفير من جانب الخدمة لسهولة الاستخدام في حماية بياناتك. لمعرفة المزيد حول التشفير من جانب الخدمة، راجع تشفير تخزين Azure للبيانات الثابتة.

تدعم مكتبة عميل Azure Blob Storage ل .NET تشفير البيانات من جانب العميل داخل التطبيقات قبل التحميل إلى Azure Storage، وفك تشفير البيانات أثناء التنزيل إلى العميل. تدعم المكتبة أيضا التكامل مع Azure Key Vault لإدارة المفاتيح.

هذا البرنامج التعليمي يوضح لك كيفية:

  • تكوين الأذونات لمورد Azure Key Vault
  • إنشاء تطبيق وحدة تحكم للتفاعل مع الموارد باستخدام مكتبات عميل .NET
  • إضافة مفتاح إلى key vault
  • تكوين خيارات التشفير من جانب العميل باستخدام مفتاح مخزن في مخزن مفاتيح
  • إنشاء كائن عميل خدمة كائن ثنائي كبير الحجم مع تمكين التشفير من جانب العميل
  • تحميل كائن ثنائي كبير الحجم مشفر، ثم تنزيل وفك تشفير الكائن الثنائي كبير الحجم

المتطلبات الأساسية

تعيين دور لمستخدم Microsoft Entra

عند التطوير محليا، تأكد من أن حساب المستخدم الذي يصل إلى مخزن المفاتيح لديه الأذونات الصحيحة. ستحتاج إلى دور Key Vault Crypto Officer لإنشاء مفتاح وتنفيذ الإجراءات على المفاتيح في مخزن المفاتيح. يمكنك تعيين أدوار Azure RBAC لمستخدم باستخدام مدخل Microsoft Azure أو Azure CLI أو Azure PowerShell. يمكنك معرفة المزيد حول النطاقات المتوفرة لتعيينات الأدوار في صفحة نظرة عامة على النطاق.

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

يوضح المثال التالي كيفية تعيين دور Key Vault Crypto Officer لحساب المستخدم الخاص بك، والذي يوفر الوصول الذي ستحتاج إليه لإكمال هذا البرنامج التعليمي.

هام

في معظم الحالات، سيستغرق نشر تعيين الدور في Azure دقيقة أو دقيقتين، ولكن في حالات نادرة قد يستغرق الأمر ما يصل إلى ثماني دقائق. إذا تلقيت أخطاء المصادقة عند تشغيل التعليمات البرمجية لأول مرة، فانتظر بضع لحظات وحاول مرة أخرى.

  1. في مدخل Microsoft Azure، حدد موقع مخزن المفاتيح الخاص بك باستخدام شريط البحث الرئيسي أو التنقل الأيسر.

  2. في صفحة نظرة عامة على key vault، حدد Access control (IAM) من القائمة اليسرى.

  3. حدد صفحة التحكم بالوصول (IAM)، وحدد علامة تبويب تعيينات الدور.

  4. حدد + إضافة من القائمة العلوية ثم إضافة تعيين الدور من القائمة المنسدلة الناتجة.

    A screenshot showing how to assign a role in Azure portal.

  5. استخدم مربع البحث لتصفية النتائج إلى الدور المطلوب. في هذا المثال، ابحث عن Key Vault Crypto Officer وحدد النتيجة المطابقة ثم اختر Next.

  6. ضمن تعيين الوصول إلى، حدد المستخدم أو المجموعة أو كيان الخدمة، ثم اختر + تحديد الأعضاء.

  7. في مربع الحوار، ابحث عن اسم مستخدم Microsoft Entra (عنوان بريدك الإلكتروني user@domain عادة) ثم اختر تحديد في أسفل مربع الحوار.

  8. حدد مراجعة + تعيين للانتقال إلى الصفحة النهائية، ثم مراجعة + تعيين مرة أخرى لإكمال العملية.

إعداد مشروعك

  1. في نافذة وحدة التحكم (مثل PowerShell أو Bash)، استخدم dotnet new الأمر لإنشاء تطبيق وحدة تحكم جديد باسم BlobEncryptionKeyVault. هذا الأمر ينشئ مشروع "مرحباً بالعالم" بسيطاً بلغة #C باستخدام ملف مصدر واحد: Program.cs.

    dotnet new console -n BlobEncryptionKeyVault
    
  2. قم بالتبديل إلى دليل BlobEncryptionKeyVault الذي تم إنشاؤه حديثا.

    cd BlobEncryptionKeyVault
    
  3. افتح المشروع في محرر التعليمات البرمجية المطلوب. لفتح المشروع في:

    • Visual Studio، حدد موقع الملف BlobEncryptionKeyVault.csproj وانقر نقرًا مزدوجًا فوقه.
    • في Visual Studio Code، قم بتشغيل الأمر التالي:
    code .
    

للتفاعل مع خدمات Azure في هذا المثال، قم بتثبيت مكتبات العميل التالية باستخدام dotnet add package.

dotnet add package Azure.Identity
dotnet add package Azure.Security.KeyVault.Keys
dotnet add package Azure.Storage.Blobs

أضف التوجيهات التالية using وتأكد من إضافة مرجع إلى System.Configuration المشروع.

using Azure;
using Azure.Core;
using Azure.Identity;
using Azure.Security.KeyVault.Keys;
using Azure.Security.KeyVault.Keys.Cryptography;
using Azure.Storage;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using Azure.Storage.Blobs.Specialized;

تعيين متغير البيئة

يبحث هذا التطبيق عن متغير بيئة يسمى KEY_VAULT_NAME لاسترداد اسم مخزن المفاتيح الخاص بك. لتعيين متغير البيئة، افتح نافذة وحدة تحكم واتبع الإرشادات الخاصة بنظام التشغيل الخاص بك. استبدل <your-key-vault-name> باسم مخزن المفاتيح الخاصة بك.

Windows:

يمكنك تعيين متغيرات البيئة ل Windows من سطر الأوامر. ومع ذلك، عند استخدام هذا الأسلوب، يمكن الوصول إلى القيم لجميع التطبيقات التي تعمل على نظام التشغيل هذا وقد تتسبب في تعارضات إذا لم تكن حذرا. يمكن تعيين متغيرات البيئة على مستوى المستخدم أو النظام:

setx KEY_VAULT_NAME "<your-key-vault-name>"

بعد إضافة متغير البيئة في Windows، يجب بدء تشغيل مثيل جديد من نافذة الأمر. إذا كنت تستخدم Visual Studio على Windows، فقد تحتاج إلى إعادة تشغيل Visual Studio بعد إنشاء متغير البيئة للكشف عن التغيير.

Linux:

export KEY_VAULT_NAME=<your-key-vault-name>

إضافة مفتاح في Azure Key Vault

في هذا المثال، نقوم بإنشاء مفتاح وإضافته إلى مخزن المفاتيح باستخدام مكتبة عميل Azure Key Vault. يمكنك أيضا إنشاء مفتاح وإضافته إلى مخزن مفاتيح باستخدام Azure CLI أو مدخل Azure أو PowerShell.

في النموذج أدناه، نقوم بإنشاء كائن KeyClient للمخزن المحدد. KeyClient ثم يتم استخدام الكائن لإنشاء مفتاح RSA جديد في المخزن المحدد.

var keyName = "testRSAKey";
var keyVaultName = Environment.GetEnvironmentVariable("KEY_VAULT_NAME");

// URI for the key vault resource
var keyVaultUri = $"https://{keyVaultName}.vault.azure.net";

TokenCredential tokenCredential = new DefaultAzureCredential();

// Create a KeyClient object
var keyClient = new KeyClient(new Uri(keyVaultUri), tokenCredential);

// Add a key to the key vault
var key = await keyClient.CreateKeyAsync(keyName, KeyType.Rsa);

إنشاء مثيلات محلل المفاتيح والمفتاح

بعد ذلك، سنستخدم المفتاح الذي أضفناه للتو إلى المخزن لإنشاء عميل التشفير ومثيلات محلل المفاتيح. ينفذ CryptographyClient IKeyEncryptionKey ويستخدم لتنفيذ عمليات التشفير باستخدام المفاتيح المخزنة في Azure Key Vault. يقوم KeyResolver بتنفيذ IKeyEncryptionResolver واسترداد مفاتيح تشفير المفاتيح من معرف المفتاح وحل المفتاح.

// Cryptography client and key resolver instances using Azure Key Vault client library
CryptographyClient cryptoClient = keyClient.GetCryptographyClient(key.Value.Name, key.Value.Properties.Version);
KeyResolver keyResolver = new (tokenCredential);

إذا كان لديك مفتاح موجود في المخزن الذي ترغب في التشفير باستخدامه، يمكنك إنشاء مثيلات محلل المفاتيح والمفتاح عن طريق تمرير URI:

var keyVaultKeyUri = $"https://{keyVaultName}.vault.azure.net/keys/{keyName}";
CryptographyClient cryptoClient = new CryptographyClient(new Uri(keyVaultKeyUri), tokenCredential);

تكوين خيارات التشفير

الآن نحن بحاجة إلى تكوين خيارات التشفير لاستخدامها لتحميل البيانات الثنائية كبيرة الحجم وتنزيلها. لاستخدام التشفير من جانب العميل، نقوم أولا بإنشاء كائن ClientSideEncryptionOptions وتعيينه على إنشاء العميل باستخدام SpecializedBlobClientOptions.

توفر فئة ClientSideEncryptionOptions خيارات تكوين العميل للاتصال ب Blob Storage باستخدام التشفير من جانب العميل. KeyEncryptionKey مطلوب لعمليات التحميل ويستخدم لتضمين مفتاح تشفير المحتوى الذي تم إنشاؤه. KeyResolver مطلوب لعمليات التنزيل ويجلب مفتاح تشفير المفتاح الصحيح لفك تشفير مفتاح تشفير المحتوى الذي تم تنزيله. المفتاحWrapAlgorithm مطلوب للتحميلات ويحدد معرف الخوارزمية لاستخدامه عند التفاف مفتاح تشفير المحتوى.

هام

نظرا لثغرة أمنية في الإصدار 1، يوصى بإنشاء ClientSideEncryptionOptions الكائن باستخدام ClientSideEncryptionVersion.V2_0 لمعلمة الإصدار. لمعرفة المزيد حول تخفيف الثغرة الأمنية في تطبيقاتك، راجع التخفيف من الثغرة الأمنية في تطبيقاتك. لمزيد من المعلومات حول هذه الثغرة الأمنية، راجع Azure Storage تحديث التشفير من جانب العميل في SDK لمعالجة الثغرة الأمنية.

// Configure the encryption options to be used for upload and download
ClientSideEncryptionOptions encryptionOptions = new (ClientSideEncryptionVersion.V2_0)
{
    KeyEncryptionKey = cryptoClient,
    KeyResolver = keyResolver,
    // String value that the client library will use when calling IKeyEncryptionKey.WrapKey()
    KeyWrapAlgorithm = "RSA-OAEP"
};

// Set the encryption options on the client options.
BlobClientOptions options = new SpecializedBlobClientOptions() { ClientSideEncryption = encryptionOptions };

تكوين كائن العميل لاستخدام التشفير من جانب العميل

في هذا المثال، نطبق خيارات تكوين التشفير من جانب العميل على كائن BlobServiceClient . عند تطبيقها على مستوى عميل الخدمة، يتم تمرير خيارات التشفير هذه من عميل الخدمة إلى عملاء الحاوية، ومن عملاء الحاوية إلى عملاء blob. BlobClient عندما ينفذ الكائن عملية تحميل أو تنزيل، تستخدم مكتبات عميل Azure Blob Storage تشفير المغلف لتشفير وفك تشفير الكائنات الثنائية كبيرة الحجم على جانب العميل. يقوم تشفير المغلفات بتشفير مفتاح بمفتاح إضافي واحد أو أكثر.

// Create a blob client with client-side encryption enabled.
// Attempting to construct a BlockBlobClient, PageBlobClient, or AppendBlobClient from a BlobContainerClient
// with client-side encryption options present will throw, as this functionality is only supported with BlobClient.
Uri blobUri = new (string.Format($"https://{accountName}.blob.core.windows.net"));
BlobClient blob = new BlobServiceClient(blobUri, tokenCredential, options).GetBlobContainerClient("test-container").GetBlobClient("testBlob");

تشفير blob وتحميل

BlobClient عندما يستدعي الكائن أسلوب تحميل، تحدث عدة خطوات لتنفيذ التشفير من جانب العميل:

  1. تنشئ مكتبة عميل Azure Storage متجه تهيئة عشوائيا (IV) من 16 بايت ومفتاح تشفير محتوى عشوائي (CEK) من 32 بايت، وتنفذ تشفير المغلف لبيانات الكائن الثنائي كبير الحجم باستخدام هذه المعلومات.
  2. يتم تشفير بيانات Blob باستخدام CEK.
  3. ثم يتم التفاف CEK (مشفر) باستخدام مفتاح تشفير المفتاح (KEK) الذي حددناه في ClientSideEncryptionOptions. في هذا المثال، KEK هو زوج مفاتيح غير متماثل مخزن في مورد Azure Key Vault المحدد. عميل الكائن الثنائي كبير الحجم نفسه ليس لديه حق الوصول إلى KEK، بل يستدعي فقط خوارزمية التفاف المفتاح التي يوفرها Key Vault.
  4. ثم يتم تحميل بيانات الكائن الثنائي كبير الحجم المشفرة إلى حساب التخزين.

أضف التعليمات البرمجية التالية لتشفير كائن ثنائي كبير الحجم وتحميله إلى حساب تخزين Azure الخاص بك:

// Upload the encrypted contents to the blob
Stream blobContent = BinaryData.FromString("Ready for encryption, Captain.").ToStream();
await blob.UploadAsync(blobContent);

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

فك تشفير blob وتنزيل

تفترض مكتبة عميل Azure Storage أن المستخدم يدير KEK إما محليا أو في مخزن مفاتيح. لا يحتاج المستخدم إلى معرفة المفتاح المحدد الذي تم استخدامه للتشفير. سيتم استخدام محلل المفاتيح المحدد في ClientSideEncryptionOptions لحل معرفات المفاتيح عند تنزيل بيانات الكائن الثنائي كبير الحجم وفك تشفيرها.

BlobClient عندما يستدعي الكائن أسلوب تنزيل، تحدث عدة خطوات لفك تشفير بيانات الكائن الثنائي كبير الحجم المشفرة:

  1. تقوم مكتبة العميل بتنزيل بيانات الكائن الثنائي كبير الحجم المشفرة، بما في ذلك بيانات تعريف التشفير، من حساب التخزين.
  2. ثم يتم فك تشفير CEK الملتف (فك تشفيره) باستخدام KEK. لا تملك مكتبة العميل حق الوصول إلى KEK أثناء هذه العملية، ولكنها تستدعي فقط خوارزمية فك المفتاح المحددة في ClientSideEncryptionOptions. يبقى المفتاح الخاص لهم زوج مفاتيح RSA في خزنة المفاتيح، لذلك يتم إرسال المفتاح المشفر من بيانات تعريف الكائن الثنائي كبير الحجم الذي يحتوي على CEK إلى مخزن المفاتيح لفك التشفير.
  3. تستخدم مكتبة العميل CEK لفك تشفير بيانات الكائن الثنائي كبير الحجم المشفرة.

أضف التعليمات البرمجية التالية لتنزيل وفك تشفير الكائن الثنائي كبير الحجم الذي قمت بتحميله مسبقا.

// Download and decrypt the encrypted contents from the blob
Response<BlobDownloadInfo>  response = await blob.DownloadAsync();
BlobDownloadInfo downloadInfo = response.Value;
Console.WriteLine((await BinaryData.FromStreamAsync(downloadInfo.Content)).ToString());

الخطوات التالية

في هذا البرنامج التعليمي، تعلمت كيفية استخدام مكتبات عميل .NET لتنفيذ التشفير من جانب العميل لعمليات تحميل وتنزيل الكائنات الثنائية كبيرة الحجم.

للحصول على نظرة عامة واسعة حول التشفير من جانب العميل للكائنات الثنائية كبيرة الحجم، بما في ذلك إرشادات ترحيل البيانات المشفرة إلى الإصدار 2، راجع التشفير من جانب العميل للكائنات الثنائية كبيرة الحجم.

لمزيد من المعلومات حول Azure Key Vault، راجع صفحة نظرة عامة على Azure Key Vault