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

عند تشغيل موارد مثيلات Azure Container (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. في طريقة عرض "المفاتيح"، انقر على "إنشاء / استيراد" لإنشاء مفتاح جديد. استخدم أي اسم فريد لهذا المفتاح، وأي تفضيلات أخرى بناءً على متطلباتك.

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

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

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

  • بمخزون إنشاء المفتاح، ارجع مرة أخرى إلى شفرة مورد خزنة المفاتيح، ضمن "Settings"، انقر فوق Access Policies.
  • في صفحة "Access Policies" لمخزنك الرئيسي، انقر فوق Add Access Policy.
  • عيّن Key Permissions لتضمين Get وUnwrap KeySet key permissions
  • بالنسبة إلى Select Principal حدد Azure Container Instance Service
  • انقر فوق Add في الأسفل

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

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

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

هام

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

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

  • ضمن resources, قم بتعيين apiVersion إلى 2019-12-01.
  • ضمن قسم خصائص مجموعة الحاوية لقالب التوزيع، أضف encryptionProperties، والذي يحتوي على القيم التالية:
    • vaultBaseUrl: اسم DNS لمخزنك الرئيسي الذي يمكن العثور عليه في شفرة النظرة العامة لمورد المخزن الرئيسي في Portal
    • 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 بالمفتاح الذي قدمته.

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

قم بإنشاء مورد 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 إظهار الهوية"⁧⁩لتخزين معرف الخدمة الأساسي للهوية، ومعرف المورد في المتغيرات.

# 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 بالمفتاح الذي قدمته.