تشفير بيانات التوزيع

عند تشغيل موارد Azure Container Instances (ACI) في السحابة، تجمع خدمة ACI البيانات المتعلقة بالحاويات الخاصة بك وتستمر في ذلك. تقوم ACI تلقائيا بتشفير هذه البيانات عندما تستمر في السحابة. يحمي هذا التشفير بياناتك للمساعدة في تلبية التزامات الأمان والامتثال لمؤسستك. يمنحك ACI أيضاً خيار تشفير هذه البيانات بمفتاحك الخاص، ما يمنحك تحكماً أكبر في البيانات المتعلقة بعمليات توزيع ACI.

تشفير بيانات ACI

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

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

مفاتيح تديرها Microsoft المفاتيح التي يديرها العميل
Encryption/decryption operations Azure Azure
Key storage مخزن مفاتيح Microsoft Azure Key Vault
Key rotation responsibility Microsoft العميل
Key access Microsoft فقط Microsoft والعميل

تستعرض هذه المقالة تدفقين لتشفير البيانات باستخدام مفتاح يديره العميل:

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

تشفير البيانات باستخدام مفتاح مدار من قبل العميل مخزن في Azure Key Vault قياسي

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

إنشاء مبدأ الخدمة لـ ACI

تتمثل الخطوة الأولى في التأكد من أن Azure tenant لديه مدير خدمة معين لمنح الأذونات لخدمة مثيلات Azure Container.

هام

من أجل تشغيل الأمر التالي وإنشاء مدير خدمة بنجاح، تأكد من أن لديك أذونات لإنشاء أساسيات الخدمة في المستأجر الخاص بك.

يقوم أمر CLI التالي بإعداد ACI SP في بيئة Azure الخاصة بك:

az ad sp create --id 6bb8e274-af5d-4df2-98a3-4fd78b4cafd9

يجب أن يظهر لك الإخراج من تشغيل هذا الأمر كيان خدمة تم إعداده باستخدام "displayName": "Azure Container Instance Service".

في حالة عدم القدرة على إنشاء كيان الخدمة بنجاح:

  • تأكد من أن لديك أذونات للقيام بذلك في المستأجر الخاص بك
  • تحقق لمعرفة ما إذا كان مدير الخدمة موجوداً بالفعل في المستأجر الخاص بك للتوزيع إلى ACI. يمكنك القيام بذلك عن طريق تشغيل az ad sp show --id 6bb8e274-af5d-4df2-98a3-4fd78b4cafd9 واستخدام كيان الخدمة هذا بدلاً من ذلك

قم بإنشاء مورد Key Vault

إنشاء Azure Key Vault باستخدام مدخل Microsoft Azure، Azure CLI، أو Azure PowerShell.

بالنسبة لخصائص خزينتك الرئيسية، استخدم الإرشادات التالية:

  • الاسم: A مطلوب اسم فريد.
  • Subscription: اختر اشتراكاً.
  • ضمن مجموعة الموارد، إما أن تختار مجموعة موارد موجودة، أو أنشئ مجموعة موارد جديدة، وأدخل اسم مجموعة موارد.
  • في القائمة المنسدلة Location، اختر موقعاً.
  • يمكنك ترك الخيارات الأخرى لقيمتها الافتراضية أو الاختيار بناءً على المتطلبات الإضافية.

هام

عند استخدام المفاتيح المُدارة بواسطة العميل لتشفير قالب توزيع ACI، يوصى بتعيين الخاصيتين التاليتين في خزنة المفاتيح، الحذف الناعم وعدم التطهير. لا يتم تمكين هذه الخصائص افتراضيّاً، ولكن يمكن تمكينها باستخدام PowerShell أو Azure CLI في مخزن مفاتيح جديد أو موجود.

قم بإنشاء مفتاح جديد

بمخزون إنشاء مخزن المفاتيح، انتقل إلى المورد في مدخل Microsoft Azure. في قائمة التنقل اليسرى لجزء المورد، ضمن Settings، حدد Keys. في طريقة عرض "Keys"، حدد "Generate/Import" لإنشاء مفتاح جديد. استخدم أي اسم فريد لهذا المفتاح، وأي تفضيلات أخرى بناءً على متطلباتك.

قم بإنشاء مفتاح جديد

تعيين نُهج الوصول

قم بإنشاء نُهج وصول جديدة للسماح لخدمة ACI بالوصول إلى مفتاحك.

  • بمجرد إنشاء مفتاحك، مرة أخرى في شفرة مورد مخزن المفاتيح، ضمن Settings، حدد Access Policies.
  • في صفحة "نهج الوصول" لمخزن المفاتيح، اختر إضافة نهج الوصول.
  • تعيين أذونات المفتاح لتضمين Get و Unwrap Keyتعيين أذونات المفتاح
  • بالنسبة إلى Select Principal حدد Azure Container Instance Service
  • حدد إضافة في الأسفل

يجب أن تظهر نُهج الوصول الآن في نُهج الوصول الخاصة بخزينة المفاتيح.

نٌهج وصول جديدة

قم بتعديل قالب توزيع JSON الخاص بك

هام

يتوفر تشفير بيانات التوزيع باستخدام مفتاح يديره العميل في أحدث إصدار من واجهة برمجة التطبيقات (2019-12-01) والذي يتم طرحه حالياً. حدد إصدار API هذا في قالب التوزيع الخاص بك. إذا كانت لديك أي مشكلات تتعلق بهذا الأمر، فيرجى التواصل مع دعم Azure.

بمخزون إعداد مفتاح خزنة المفاتيح ونُهج الوصول، أضف الخصائص التالية إلى قالب توزيع ACI. تعرف على المزيد حول توزيع موارد ACI باستخدام قالب في برنامج تعليمي: قم بتوزيع مجموعة متعددة الحاويات باستخدام قالب Azure Resource Manager.

  • ضمن resources, قم بتعيين apiVersion إلى 2019-12-01.
  • ضمن قسم خصائص مجموعة الحاوية في قالب النشر، أضف encryptionProperties، الذي يحتوي على القيم التالية:
    • vaultBaseUrl: اسم DNS لمخزن المفاتيح الخاص بك، والذي يمكن العثور عليه في شفرة النظرة العامة لمورد مخزن المفاتيح في المدخل
    • keyName: اسم المفتاح الذي تم إنشاؤه سابقاً
    • keyVersion: الإصدار الحالي من المفتاح. يمكن العثور على هذا الحقل عن طريق الانتقال إلى المفتاح نفسه (ضمن "المفاتيح" في قسم الإعدادات في مورد مخزن المفاتيح الخاص بك)
  • ضمن خصائص مجموعة الحاوية، أضف خاصية sku property بالقيمة Standard. الخاصية sku مطلوبة في إصدار API 2019-12-01.

يعرض مقتطف القالب التالي هذه الخصائص الإضافية لتشفير بيانات التوزيع:

[...]
"resources": [
    {
        "name": "[parameters('containerGroupName')]",
        "type": "Microsoft.ContainerInstance/containerGroups",
        "apiVersion": "2019-12-01",
        "location": "[resourceGroup().location]",    
        "properties": {
            "encryptionProperties": {
                "vaultBaseUrl": "https://example.vault.azure.net",
                "keyName": "acikey",
                "keyVersion": "xxxxxxxxxxxxxxxx"
            },
            "sku": "Standard",
            "containers": {
                [...]
            }
        }
    }
]

فيما يلي نموذج كامل، مقتبس من القالب الموجود في برنامج تعليمي: توزيع مجموعة متعددة الحاويات باستخدام قالب Azure Resource Manager.

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "containerGroupName": {
      "type": "string",
      "defaultValue": "myContainerGroup",
      "metadata": {
        "description": "Container Group name."
      }
    }
  },
  "variables": {
    "container1name": "aci-tutorial-app",
    "container1image": "mcr.microsoft.com/azuredocs/aci-helloworld:latest",
    "container2name": "aci-tutorial-sidecar",
    "container2image": "mcr.microsoft.com/azuredocs/aci-tutorial-sidecar"
  },
  "resources": [
    {
      "name": "[parameters('containerGroupName')]",
      "type": "Microsoft.ContainerInstance/containerGroups",
      "apiVersion": "2019-12-01",
      "location": "[resourceGroup().location]",
      "properties": {
        "encryptionProperties": {
            "vaultBaseUrl": "https://example.vault.azure.net",
            "keyName": "acikey",
            "keyVersion": "xxxxxxxxxxxxxxxx"
        },
        "sku": "Standard",  
        "containers": [
          {
            "name": "[variables('container1name')]",
            "properties": {
              "image": "[variables('container1image')]",
              "resources": {
                "requests": {
                  "cpu": 1,
                  "memoryInGb": 1.5
                }
              },
              "ports": [
                {
                  "port": 80
                },
                {
                  "port": 8080
                }
              ]
            }
          },
          {
            "name": "[variables('container2name')]",
            "properties": {
              "image": "[variables('container2image')]",
              "resources": {
                "requests": {
                  "cpu": 1,
                  "memoryInGb": 1.5
                }
              }
            }
          }
        ],
        "osType": "Linux",
        "ipAddress": {
          "type": "Public",
          "ports": [
            {
              "protocol": "tcp",
              "port": "80"
            },
            {
                "protocol": "tcp",
                "port": "8080"
            }
          ]
        }
      }
    }
  ],
  "outputs": {
    "containerIPv4Address": {
      "type": "string",
      "value": "[reference(resourceId('Microsoft.ContainerInstance/containerGroups/', parameters('containerGroupName'))).ipAddress.ip]"
    }
  }
}

توزيع مواردك

إذا أنشأت ملف النموذج وعدّلته على سطح المكتب، فيمكنك تحميله إلى دليل Cloud Shell عن طريق سحب الملف إليه.

أنشئ مجموعة موارد باستخدام الأمر az group create.

az group create --name myResourceGroup --location eastus

قم بنشر القالب باستخدام الأمر az deployment group create.

az deployment group create --resource-group myResourceGroup --template-file deployment-template.json

في غضون ثوانٍ قليلة، من المفترض أن تتلقى استجابة أولية من Azure. بمجرد اكتمال النشر، يتم تشفير جميع البيانات المتعلقة به التي تستمر بها خدمة ACI بالمفتاح الذي قدمته.

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

قم بإنشاء مورد Key Vault

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

بالنسبة لخصائص خزينتك الرئيسية، استخدم الإرشادات التالية:

  • الاسم: A مطلوب اسم فريد.
  • Subscription: اختر اشتراكاً.
  • ضمن مجموعة الموارد، إما أن تختار مجموعة موارد موجودة، أو أنشئ مجموعة موارد جديدة، وأدخل اسم مجموعة موارد.
  • في القائمة المنسدلة Location، اختر موقعاً.
  • يمكنك ترك الخيارات الأخرى لقيمتها الافتراضية أو الاختيار بناءً على المتطلبات الإضافية.

هام

عند استخدام المفاتيح المُدارة بواسطة العميل لتشفير قالب توزيع ACI، يوصى بتعيين الخاصيتين التاليتين في خزنة المفاتيح، الحذف الناعم وعدم التطهير. لا يتم تمكين هذه الخصائص افتراضيّاً، ولكن يمكن تمكينها باستخدام PowerShell أو Azure CLI في مخزن مفاتيح جديد أو موجود.

قم بإنشاء مفتاح جديد

بمخزون إنشاء مخزن المفاتيح، انتقل إلى المورد في مدخل Microsoft Azure. في قائمة التنقل اليسرى لجزء المورد، ضمن Settings، حدد Keys. في طريقة عرض "المفاتيح"، اختر "إنشاء/استيراد" لإنشاء مفتاح جديد. استخدم أي اسم فريد لهذا المفتاح، وأي تفضيلات أخرى بناءً على متطلباتك. تأكد من التقاط اسم المفتاح وإصداره للخطوات اللاحقة.

لقطة شاشة لإعدادات إنشاء المفاتيح، PNG.

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

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

az identity create \
  --resource-group myResourceGroup \
  --name myACIId

لاستخدام الهوية في الخطوات التالية، استخدم الأمر az identity show لتخزين معرف كيان خدمة الهوية ومعرف المورد في المتغيرات.

# Get service principal ID of the user-assigned identity
spID=$(az identity show \
  --resource-group myResourceGroup \
  --name myACIId \
  --query principalId --output tsv)

تعيين نُهج الوصول

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

az keyvault set-policy \
    --name mykeyvault \
    --resource-group myResourceGroup \
    --object-id $spID \
    --key-permissions get unwrapKey

تعديل أذونات شبكة Azure Key Vault

إعداد الأوامر التالية جدار حماية Azure ل Azure Key Vault الخاص بك والسماح لخدمات Azure الموثوق بها مثل الوصول إلى ACI.

az keyvault update \
    --name mykeyvault \
    --resource-group myResourceGroup \
    --default-action Deny
az keyvault update \
    --name mykeyvault \
    --resource-group myResourceGroup \
    --bypass AzureServices

قم بتعديل قالب توزيع JSON الخاص بك

هام

يتوفر تشفير بيانات النشر باستخدام مفتاح مدار من قبل العميل في إصدار واجهة برمجة التطبيقات 2022-09-01 أو أحدث. يتوفر إصدار واجهة برمجة التطبيقات 2022-09-01 فقط عبر ARM أو REST. إذا كانت لديك أي مشكلات تتعلق بهذا الأمر، فيرجى التواصل مع دعم Azure. بمخزون إعداد مفتاح خزنة المفاتيح ونُهج الوصول، أضف الخصائص التالية إلى قالب توزيع ACI. تعرف على المزيد حول توزيع موارد ACI باستخدام قالب في برنامج تعليمي: قم بتوزيع مجموعة متعددة الحاويات باستخدام قالب Azure Resource Manager.

  • ضمن resources, قم بتعيين apiVersion إلى 2022-09-01.
  • ضمن قسم خصائص مجموعة الحاوية في قالب النشر، أضف encryptionProperties، الذي يحتوي على القيم التالية:
    • vaultBaseUrl: اسم DNS لمخزن المفاتيح الخاص بك. يمكن العثور على هذه الخاصية على شفرة النظرة العامة لمورد مخزن المفاتيح في المدخل
    • keyName: اسم المفتاح الذي تم إنشاؤه سابقاً
    • keyVersion: الإصدار الحالي من المفتاح. يمكن العثور على هذه الخاصية بالنقر فوق المفتاح نفسه (ضمن "المفاتيح" في قسم الإعدادات في مورد مخزن المفاتيح الخاص بك)
    • identity: هذه الخاصية هي URI للمورد لمثيل الهوية المدارة الذي تم إنشاؤه مسبقا
  • ضمن خصائص مجموعة الحاوية، أضف خاصية sku property بالقيمة Standard. الخاصية sku مطلوبة في إصدار واجهة برمجة التطبيقات 2022-09-01.
  • ضمن الموارد، أضف identity الكائن المطلوب لاستخدام الهوية المدارة مع ACI، والذي يحتوي على القيم التالية:
    • type: نوع الهوية المستخدمة (إما المعينة من قبل المستخدم أو المعينة من قبل النظام). تم تعيين هذه الحالة إلى "UserAssigned"
    • userAssignedIdentities: resourceURI لنفس الهوية المعينة من قبل المستخدم المستخدمة في encryptionProperties الكائن.

يعرض مقتطف القالب التالي هذه الخصائص الإضافية لتشفير بيانات التوزيع:

[...]
"resources": [
    {
        "name": "[parameters('containerGroupName')]",
        "type": "Microsoft.ContainerInstance/containerGroups",
        "apiVersion": "2019-12-01",
        "location": "[resourceGroup().location]",    
        "identity": {
         "type": "UserAssigned",
         "userAssignedIdentities": {
           "/subscriptions/XXXXXXXXXXXXXXXXXXXXXX/resourcegroups/XXXXXXXXXXXXXXXXXXXXXX/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId": {}
         }
        },
        "properties": {
            "encryptionProperties": {
                "vaultBaseUrl": "https://example.vault.azure.net",
                "keyName": "acikey",
                "keyVersion": "xxxxxxxxxxxxxxxx",
                "identity": "/subscriptions/XXXXXXXXXXXXXXXXXXXXXX/resourcegroups/XXXXXXXXXXXXXXXXXXXXXX/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId"
            },
            "sku": "Standard",
            "containers": {
                [...]
            }
        }
    }
]

فيما يلي نموذج كامل، مقتبس من القالب الموجود في برنامج تعليمي: توزيع مجموعة متعددة الحاويات باستخدام قالب Azure Resource Manager.

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "containerGroupName": {
      "type": "string",
      "defaultValue": "myContainerGroup",
      "metadata": {
        "description": "Container Group name."
      }
    }
  },
  "variables": {
    "container1name": "aci-tutorial-app",
    "container1image": "mcr.microsoft.com/azuredocs/aci-helloworld:latest",
    "container2name": "aci-tutorial-sidecar",
    "container2image": "mcr.microsoft.com/azuredocs/aci-tutorial-sidecar"
  },
  "resources": [
    {
      "name": "[parameters('containerGroupName')]",
      "type": "Microsoft.ContainerInstance/containerGroups",
      "apiVersion": "2022-09-01",
      "location": "[resourceGroup().location]",
      "identity": {
        "type": "UserAssigned",
        "userAssignedIdentities": {
          "/subscriptions/XXXXXXXXXXXXXXXXXXXXXX/resourcegroups/XXXXXXXXXXXXXXXXXXXXXX/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId": {}
        }
      },
      "properties": {
        "encryptionProperties": {
          "vaultBaseUrl": "https://example.vault.azure.net",
          "keyName": "acikey",
          "keyVersion": "xxxxxxxxxxxxxxxx",
          "identity": "/subscriptions/XXXXXXXXXXXXXXXXXXXXXX/resourcegroups/XXXXXXXXXXXXXXXXXXXXXX/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId"
        },
        "sku": "Standard",
        "containers": [
          {
            "name": "[variables('container1name')]",
            "properties": {
              "image": "[variables('container1image')]",
              "resources": {
                "requests": {
                  "cpu": 1,
                  "memoryInGb": 1.5
                }
              },
              "ports": [
                {
                  "port": 80
                },
                {
                  "port": 8080
                }
              ]
            }
          },
          {
            "name": "[variables('container2name')]",
            "properties": {
              "image": "[variables('container2image')]",
              "resources": {
                "requests": {
                  "cpu": 1,
                  "memoryInGb": 1.5
                }
              }
            }
          }
        ],
        "osType": "Linux",
        "ipAddress": {
          "type": "Public",
          "ports": [
            {
              "protocol": "tcp",
              "port": "80"
            },
            {
              "protocol": "tcp",
              "port": "8080"
            }
          ]
        }
      }
    }
  ],
  "outputs": {
    "containerIPv4Address": {
      "type": "string",
      "value": "[reference(resourceId('Microsoft.ContainerInstance/containerGroups/', parameters('containerGroupName'))).ipAddress.ip]"
    }
  }
}

توزيع مواردك

إذا أنشأت ملف النموذج وعدّلته على سطح المكتب، فيمكنك تحميله إلى دليل Cloud Shell عن طريق سحب الملف إليه.

أنشئ مجموعة موارد باستخدام الأمر az group create.

az group create --name myResourceGroup --location eastus

قم بنشر القالب باستخدام الأمر az deployment group create.

az deployment group create --resource-group myResourceGroup --template-file deployment-template.json

في غضون ثوانٍ قليلة، من المفترض أن تتلقى استجابة أولية من Azure. بمجرد اكتمال النشر، يتم تشفير جميع البيانات المتعلقة به التي تستمر بها خدمة ACI بالمفتاح الذي قدمته.