إنشاء تطبيق Azure المدار الذي ينشر حساب تخزين مشفرا باستخدام مفتاح مدار من قبل العميل

توضح هذه المقالة كيفية إنشاء تطبيق Azure المدار الذي ينشر حساب تخزين مشفرا باستخدام مفتاح مدار من قبل العميل. يدعم حساب التخزين وقاعدة بيانات Cosmos وقاعدة بيانات Azure ل Postgres تشفير البيانات الثابتة باستخدام المفاتيح التي يديرها العميل أو المفاتيح التي تديرها Microsoft. يمكنك استخدام مفتاح التشفير الخاص بك لحماية البيانات الموجودة في حساب التخزين الخاص بك. عند تحديد مفتاح مدار من قبل العميل، يتم استخدام هذا المفتاح لحماية المفتاح الذي يقوم بتشفير البيانات والتحكم فيه. تُوفر المفاتيح المُدارة بواسطة العميل مزيدًا من المرونة في إدارة عناصر التحكم في الوصول.

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

الهويات المُدارة

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

يمكن منح طلبك نوعين من الهويات:

  • يتم تعيين هوية مدارة معينة من قبل النظام إلى التطبيق الخاص بك ويتم حذفها إذا تم حذف التطبيق الخاص بك. يمكن أن يكون للتطبيق هوية مدارة واحدة فقط يعينها النظام.
  • الهوية المدارة المعينة من قبل المستخدم هي مورد Azure مستقل يمكن تعيينه لتطبيقك. يمكن أن يكون للتطبيق هويات مدارة متعددة يعينها المستخدم.

لنشر حساب تخزين في مجموعة الموارد المدارة للتطبيق المدار الذي تم تشفيره باستخدام مفاتيح العملاء من مخزن المفاتيح الموجود، يلزم إجراء المزيد من التكوين. تحتاج الهوية المدارة التي تم تكوينها باستخدام التطبيق المدار إلى التحكم في الوصول المستند إلى دور Azure المضمن في عامل تشغيل الهوية المدارة عبر الهوية المدارة التي لديها حق الوصول إلى key vault. لمزيد من التفاصيل، انتقل إلى دور مشغل الهوية المدارة.

إنشاء مخزن مفاتيح مع الحماية من التطهير

  1. سجل الدخول إلى مدخل Azure.
  2. من قائمة مدخل Microsoft Azure، أو من صفحة Home، حدد Create a resource.
  3. في مربع البحث، أدخل Key Vault.
  4. من قائمة النتائج، حدد المخزن الرئيسي على اليسار.
  5. في قسم Key Vault ، حدد Create.
  6. في قسم Create key vault، قم بتوفير المعلومات التالية:
    • Subscription: حدد اشتراكك.
    • Resource Group: حدد Create new وأدخل اسما مثل demo-cmek-rg.
    • الاسم: مطلوب اسم فريد، مثل demo-keyvault-cmek.
    • المنطقة: حدد موقعا مثل شرق الولايات المتحدة.
    • مستوى التسعير: حدد قياسي من القائمة المنسدلة.
    • الحماية من الإزالة: حدد تمكين الحماية من التطهير.
  7. حدد التالي وانتقل إلى علامة التبويب نهج الوصول.
    • تكوين الوصول: حدد التحكم في الوصول المستند إلى الدور في Azure.
    • اقبل الإعدادات الافتراضية لجميع الخيارات الأخرى.
  8. حدد "Review + create".
  9. تأكد من صحة الإعدادات وحدد Create.

بعد النشر الناجح، حدد Go to resource. في علامة التبويب نظرة عامة ، دون الخصائص التالية:

  • اسم المخزن: في المثال، اسم المخزن هو demo-keyvault-cmek. يمكنك استخدام هذا الاسم في خطوات أخرى.
  • عنوان URI للمخزن: في المثال، عنوان URI للمخزن هو https://demo-keyvault-cmek.vault.azure.net/.

إنشاء هوية مُدارة يعينها المستخدم

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

  1. في مربع البحث، أدخل الهويات المدارة.
  2. ضمن الخدمات، حدد الهويات المدارة.
  3. حدد Create وأدخل القيم التالية في علامة التبويب Basics :
    • Subscription: حدد اشتراكك.
    • مجموعة الموارد: حدد مجموعة الموارد demo-cmek-rg التي قمت بإنشائها في الخطوات السابقة.
    • المنطقة: حدد منطقة مثل شرق الولايات المتحدة.
    • الاسم: أدخل اسم الهوية المدارة المعينة من قبل المستخدم، مثل demokeyvaultmi.
  4. حدد "Review + create".
  5. بعد عرض Validation Passed ، حدد Create.

بعد التوزيع الناجح، حدد Go to resource.

إنشاء تعيينات الأدوار

تحتاج إلى إنشاء تعييني دور لمخزن المفاتيح الخاص بك. للحصول على التفاصيل، راجع تعيين أدوار Azure باستخدام مدخل Microsoft Azure.

منح إذن المفتاح على key vault للهوية المدارة

إنشاء تعيين دور لمفاتيح الهوية المدارة key vault demokeyvaultmi للالتفاف وفك المفاتيح.

  1. انتقل إلى key vault demo-cmek-keyvault.
  2. حدد Access control (IAM).
  3. حدد إضافة>Add role assignmen.
  4. تعيين الدور التالي:
    • الدور: مستخدم تشفير خدمة تشفير Key Vault
    • تعيين الوصول إلى: الهوية المدارة
    • العضو: demokeyvaultmi
  5. حدد مراجعة + تعيين لعرض الإعدادات الخاصة بك.
  6. حدد Review + assign لإنشاء تعيين الدور.

إنشاء تعيين دور لحسابك

إنشاء تعيين دور آخر بحيث يمكن لحسابك إنشاء مفتاح جديد في مخزن المفاتيح الخاص بك.

  1. تعيين الدور التالي:
    • الدور: مسؤول تشفير Key Vault
    • تعيين الوصول إلى: المستخدم أو المجموعة أو كيان الخدمة
    • العضو: حساب Microsoft Entra الخاص بك
  2. حدد مراجعة + تعيين لعرض الإعدادات الخاصة بك.
  3. حدد Review + assign لإنشاء تعيين الدور.

يمكنك التحقق من تعيينات دور مخزن المفاتيح في تعيينات الدور للتحكم في الوصول (IAM).>

إنشاء مفتاح

تحتاج إلى إنشاء مفتاح يستخدمه مخزن المفاتيح لتشفير حساب تخزين.

  1. انتقل إلى key vault الخاص بك، demo-cmek-keyvault.
  2. حدد المفاتيح.
  3. حدد إنشاء/استيراد.
  4. في صفحة إنشاء مفتاح ، حدد القيم التالية:
    • الخيارات: إنشاء
    • الاسم: demo-cmek-key
  5. اقبل الإعدادات الافتراضية للخيارات الأخرى.
  6. حدد إنشاء.

دون اسم المفتاح. يمكنك استخدامه عند نشر التطبيق المدار.

إنشاء هوية مدارة يعينها المستخدم للتطبيق المدار

إنشاء هوية مدارة يعينها المستخدم لاستخدامها كهوية مدارة للتطبيق المدار.

  1. في مربع البحث، أدخل الهويات المدارة.
  2. ضمن الخدمات، حدد الهويات المدارة.
  3. حدد إنشاء.
    • Subscription: حدد اشتراكك.
    • مجموعة الموارد: حدد مجموعة الموارد demo-cmek-rg.
    • المنطقة: حدد منطقة مثل شرق الولايات المتحدة.
    • الاسم: أدخل اسم الهوية المدارة المعينة من قبل المستخدم، مثل demomanagedappmi.
  4. حدد "Review + create".
  5. بعد عرض Validation Passed ، حدد Create.

بعد التوزيع الناجح، حدد Go to resource.

تعيين إذن الدور للهوية المدارة

تعيين دور عامل تشغيل الهوية المدارة إلى الهوية المدارة في نطاق الهوية المدارة المعينة من قبل المستخدم المسماة demokeyvaultmi.

  1. انتقل إلى الهوية المدارة المعينة من قبل المستخدم المسماة demokeyvaultmi.
  2. حدد Access control (IAM).
  3. حدد Add>Add role assignment لفتح صفحة إضافة تعيين الدور.
  4. تعيين الدور التالي.
    • الدور: عامل تشغيل الهوية المدارة
    • تعيين الوصول إلى: الهوية المدارة
    • العضو: demomanagedappmi
  5. حدد مراجعة + تعيين لعرض الإعدادات الخاصة بك.
  6. حدد Review + assign لإنشاء تعيين الدور.

يمكنك التحقق من تعيين الدور ل demokeyvaultmi في Access control (IAM)>Role assignments.

نموذج قالب التطبيق المدار

إنشاء تطبيق مدار ينشر حساب تخزين في مجموعة موارد مدارة واستخدام مفتاح مخزن مفاتيح موجود مسبقا لتشفير البيانات في حساب التخزين.

لنشر تطبيق مدار إلى كتالوج الخدمة، يجب تنفيذ المهام التالية:

  1. إنشاء ملف creatUIDefinition.json من النموذج في هذه المقالة. يحدد القالب عناصر واجهة مستخدم المدخل عند نشر التطبيق المدار.
  2. إنشاء قالب Azure Resource Manager يسمى mainTemplate.json عن طريق تحويل ملف Bicep في هذه المقالة إلى JSON. يحدد القالب الموارد التي يجب نشرها مع التطبيق المدار.
  3. إنشاء حزمة .zip تحتوي على ملفات JSON المطلوبة: createUiDefinition.json و mainTemplate.json.
  4. نشر تعريف التطبيق المدار بحيث يكون متوفرا في كتالوج الخدمة. لمزيد من المعلومات، انتقل إلى التشغيل السريع: إنشاء تعريف تطبيق مدار من Azure ونشره.

إنشاء قالب createUiDefinition.json

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

  1. إنشاء ملف جديد في Visual Studio Code باسم creatUIDefinition.json.
  2. انسخ التعليمات البرمجية التالية والصقها في الملف.
  3. احفظ الملف.
{
  "$schema": "https://schema.management.azure.com/schemas/0.1.2-preview/CreateUIDefinition.MultiVm.json#",
  "handler": "Microsoft.Azure.CreateUIDef",
  "version": "0.1.2-preview",
  "parameters": {
    "basics": [],
    "steps": [
      {
        "name": "managedApplicationSetting",
        "label": "Application Settings",
        "subLabel": {
          "preValidation": "Configure your application settings and Managed Identity for the application",
          "postValidation": "Done"
        },
        "bladeTitle": "Application Settings - Config",
        "elements": [
          {
            "name": "appIdentity",
            "type": "Microsoft.ManagedIdentity.IdentitySelector",
            "label": "Managed Identity Configuration for the Application (Needs Managed Identity Operator permissions over KV Managed Identity).",
            "toolTip": {
              "systemAssignedIdentity": "Enable system assigned identity to grant the managed application access to additional existing resources.",
              "userAssignedIdentity": "Add user assigned identities to grant the managed application access to additional existing resources."
            },
            "defaultValue": {
              "systemAssignedIdentity": "Off"
            },
            "options": {
              "hideSystemAssignedIdentity": true,
              "hideUserAssignedIdentity": false,
              "readOnlySystemAssignedIdentity": true
            },
            "visible": true
          }
        ]
      },
      {
        "name": "configuration",
        "type": "Microsoft.Common.Section",
        "label": "Configuration",
        "elements": [
          {
            "name": "cmek",
            "type": "Microsoft.Common.Section",
            "label": "Customer Managed Encryption Key (CMEK)",
            "elements": [
              {
                "name": "cmekEnable",
                "type": "Microsoft.Common.CheckBox",
                "label": "Enable CMEK",
                "toolTip": "Enable to provide a CMEK",
                "constraints": {
                  "required": false
                }
              },
              {
                "name": "cmekKeyVaultUrl",
                "type": "Microsoft.Common.TextBox",
                "label": "Key Vault URL",
                "toolTip": "Specify the CMEK Key Vault URL",
                "defaultValue": "",
                "constraints": {
                  "required": "[steps('configuration').cmek.cmekEnable]",
                  "regex": ".*",
                  "validationMessage": "The value must not be empty."
                },
                "visible": "[steps('configuration').cmek.cmekEnable]"
              },
              {
                "name": "cmekKeyName",
                "type": "Microsoft.Common.TextBox",
                "label": "Key Name",
                "toolTip": "Specify the key name from your key vault.",
                "defaultValue": "",
                "constraints": {
                  "required": "[steps('configuration').cmek.cmekEnable]",
                  "regex": ".*",
                  "validationMessage": "The value must not be empty."
                },
                "visible": "[steps('configuration').cmek.cmekEnable]"
              },
              {
                "name": "cmekKeyIdentity",
                "type": "Microsoft.ManagedIdentity.IdentitySelector",
                "label": "Managed Identity Configuration for Key Vault Access",
                "toolTip": {
                  "systemAssignedIdentity": "Enable system assigned identity to grant the managed application access to additional existing resources.",
                  "userAssignedIdentity": "Add user assigned identities to grant the managed application access to additional existing resources."
                },
                "defaultValue": {
                  "systemAssignedIdentity": "Off"
                },
                "options": {
                  "hideSystemAssignedIdentity": true,
                  "hideUserAssignedIdentity": false,
                  "readOnlySystemAssignedIdentity": true
                },
                "visible": "[steps('configuration').cmek.cmekEnable]"
              }
            ],
            "visible": true
          }
        ]
      }
    ],
    "outputs": {
      "location": "[location()]",
      "managedIdentity": "[steps('managedApplicationSetting').appIdentity]",
      "cmekConfig": {
        "kvUrl": "[if(empty(steps('configuration').cmek.cmekKeyVaultUrl), '', steps('configuration').cmek.cmekKeyVaultUrl)]",
        "keyName": "[if(empty(steps('configuration').cmek.cmekKeyName), '', steps('configuration').cmek.cmekKeyName)]",
        "identityId": "[if(empty(steps('configuration').cmek.cmekKeyIdentity), '', steps('configuration').cmek.cmekKeyIdentity)]"
      }
    }
  }
}

إنشاء قالب mainTemplate.json

ملف Bicep التالي هو التعليمات البرمجية المصدر ل mainTemplate.json. يستخدم القالب الهوية المدارة المعينة من قبل المستخدم المحددة في ملف createUiDefinition.json .

  1. إنشاء ملف جديد في Visual Studio Code باسم mainTemplate.bicep.
  2. انسخ التعليمات البرمجية التالية والصقها في الملف.
  3. احفظ الملف.
param cmekConfig object = {
  kvUrl: ''
  keyName: ''
  identityId: {}
}
@description('Specify the Azure region to place the application definition.')
param location string = resourceGroup().location
/////////////////////////////////
// Common Resources Configuration
/////////////////////////////////
var commonproperties = {
  name: 'cmekdemo'
  displayName: 'Common Resources'
  storage: {
    sku: 'Standard_LRS'
    kind: 'StorageV2'
    accessTier: 'Hot'
    minimumTlsVersion: 'TLS1_2'

  }
}
var identity = items(cmekConfig.identityId.userAssignedIdentities)[0].key

resource storage 'Microsoft.Storage/storageAccounts@2022-05-01' = {
  name: '${commonproperties.name}${uniqueString(resourceGroup().id)}'
  location: location
  sku: {
    name: commonproperties.storage.sku
  }
  kind: commonproperties.storage.kind
  identity: cmekConfig.identityId
  properties: {
    accessTier: commonproperties.storage.accessTier
    minimumTlsVersion: commonproperties.storage.minimumTlsVersion
    encryption: {
      identity: {
        userAssignedIdentity: identity
      }
      services: {
        blob: {
          enabled: true
        }
        table: {
          enabled: true
        }
        file: {
          enabled: true
        }
      }
      keySource: 'Microsoft.Keyvault'
      keyvaultproperties: {
        keyname: '${cmekConfig.keyName}'
        keyvaulturi: '${cmekConfig.kvUrl}'
      }
    }
  }
}

استخدم PowerShell أو Azure CLI لإنشاء ملف mainTemplate.json . انتقل إلى الدليل حيث قمت بحفظ ملف Bicep الخاص بك وقم بتشغيل build الأمر .

bicep build mainTemplate.bicep

بعد تحويل ملف Bicep إلى JSON، يجب أن يتطابق ملف mainTemplate.json مع المثال التالي. قد يكون لديك قيم مختلفة في خصائص metadataversion و templateHash.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "metadata": {
    "_generator": {
      "name": "bicep",
      "version": "0.16.2.56959",
      "templateHash": "1234567891234567890"
    }
  },
  "parameters": {
    "cmekConfig": {
      "type": "object",
      "defaultValue": {
        "kvUrl": "",
        "keyName": "",
        "identityId": {}
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "Specify the Azure region to place the application definition."
      }
    }
  },
  "variables": {
    "commonproperties": {
      "name": "cmekdemo",
      "displayName": "Common Resources",
      "storage": {
        "sku": "Standard_LRS",
        "kind": "StorageV2",
        "accessTier": "Hot",
        "minimumTlsVersion": "TLS1_2"
      }
    },
    "identity": "[items(parameters('cmekConfig').identityId.userAssignedIdentities)[0].key]"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2022-05-01",
      "name": "[format('{0}{1}', variables('commonproperties').name, uniqueString(resourceGroup().id))]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "[variables('commonproperties').storage.sku]"
      },
      "kind": "[variables('commonproperties').storage.kind]",
      "identity": "[parameters('cmekConfig').identityId]",
      "properties": {
        "accessTier": "[variables('commonproperties').storage.accessTier]",
        "minimumTlsVersion": "[variables('commonproperties').storage.minimumTlsVersion]",
        "encryption": {
          "identity": {
            "userAssignedIdentity": "[variables('identity')]"
          },
          "services": {
            "blob": {
              "enabled": true
            },
            "table": {
              "enabled": true
            },
            "file": {
              "enabled": true
            }
          },
          "keySource": "Microsoft.Keyvault",
          "keyvaultproperties": {
            "keyname": "[format('{0}', parameters('cmekConfig').keyName)]",
            "keyvaulturi": "[format('{0}', parameters('cmekConfig').kvUrl)]"
          }
        }
      }
    }
  ]
}

نشر التطبيق المدار

بعد إنشاء تعريف كتالوج الخدمة، يمكنك نشر التطبيق المدار. لمزيد من المعلومات، انتقل إلى التشغيل السريع: نشر تطبيق مدار لكتالوج الخدمة.

أثناء النشر، يمكنك استخدام الهويات المدارة المعينة من قبل المستخدم، واسم خزنة المفاتيح، وعنوان URL لمخزن المفاتيح، واسم مفتاح خزنة المفاتيح. ينشئ ملف createUiDefinition.json واجهة الاستخدام.

على سبيل المثال، في نشر المدخل، في علامة التبويب الإعدادات التطبيق، يمكنك إضافة demomanagedappmi.

Screenshot of the Application Settings tab to add a user-assigned managed identity.

في علامة التبويب Configuration ، يمكنك تمكين المفتاح المدار من قبل العميل وإضافة الهوية المدارة المعينة من قبل المستخدم لمخزن المفاتيح، demokeyvaultmi. يمكنك أيضا تحديد عنوان URL لمخزن المفاتيح واسم مفتاح المخزن الرئيسي الذي قمت بإنشائه.

Screenshot of the Configuration to enable the customer-managed key, add key vault URL and key name, and add a user-assigned managed identity.

تحقق من التوزيع

بعد اكتمال النشر، يمكنك التحقق من تعيين هوية التطبيق المدار. يتم تعيين الهوية المدارة المعينة من قبل المستخدم demomanagedappmi إلى التطبيق المدار.

  1. انتقل إلى مجموعة الموارد حيث قمت بنشر التطبيق المدار.
  2. ضمن الإعدادات> Identity حدد المستخدم المعين (معاينة).

يمكنك أيضا التحقق من حساب التخزين الذي نشره التطبيق المدار. تعرض علامة التبويب Encryption المفتاح demo-cmek-key ومعرف المورد للهوية المدارة المعينة من قبل المستخدم.

  1. انتقل إلى مجموعة الموارد المدارة حيث يتم نشر حساب تخزين التطبيق المدار.
  2. ضمن Security + networking حدد Encryption.

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