تمكين مفتاح يديره العميل

هذه المقالة هي الجزء الثاني في سلسلة تعليمية من أربعة أجزاء. يوفر الجزء الأول نظرة عامة على المفاتيح التي يديرها العميل وميزاتها والاعتبارات قبل تمكينها في السجل الخاص بك. ترشدك هذه المقالة خلال خطوات تمكين مفتاح يديره العميل باستخدام Azure CLI أو مدخل Microsoft Azure أو قالب Azure Resource Manager.

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

تمكين مفتاح يديره العميل باستخدام Azure CLI

قم بإنشاء مجموعة موارد

قم بتشغيل الأمر az group create لإنشاء مجموعة موارد ستحتفظ بخزنة المفاتيح وسجل الحاوية والموارد المطلوبة الأخرى:

az group create --name <resource-group-name> --location <location>

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

قم بتكوين هوية مدارة معينة من قبل المستخدم للسجل بحيث يمكنك الوصول إلى مخزن المفاتيح:

  1. قم بتشغيل الأمر az identity create لإنشاء الهوية المدارة:

    az identity create \
      --resource-group <resource-group-name> \
      --name <managed-identity-name>
    
  2. في إخراج الأمر، لاحظ id القيم و principalId لتكوين الوصول إلى السجل باستخدام مخزن المفاتيح:

    {
      "clientId": "xxxx2bac-xxxx-xxxx-xxxx-192cxxxx6273",
      "clientSecretUrl": "https://control-eastus.identity.azure.net/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/myresourcegroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myidentityname/credentials?tid=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&oid=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&aid=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/myresourcegroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myresourcegroup",
      "location": "eastus",
      "name": "myidentityname",
      "principalId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "resourceGroup": "myresourcegroup",
      "tags": {},
      "tenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities"
    }
    
  3. للراحة، قم بتخزين id قيم و principalId في متغيرات البيئة:

    identityID=$(az identity show --resource-group <resource-group-name> --name <managed-identity-name> --query 'id' --output tsv)
    
    identityPrincipalID=$(az identity show --resource-group <resource-group-name> --name <managed-identity-name> --query 'principalId' --output tsv)
    

إنشاء مخزن رئيسي

  1. قم بتشغيل الأمر az keyvault create لإنشاء مخزن مفاتيح حيث يمكنك تخزين مفتاح يديره العميل لتشفير السجل.

  2. بشكل افتراضي، يمكن مخزن المفاتيح الجديد إعداد الحذف المبدئي تلقائيا. لمنع فقدان البيانات من الحذف العرضي للمفاتيح أو مخازن المفاتيح، نوصي بتمكين إعداد الحماية من المسح :

    az keyvault create --name <key-vault-name> \
      --resource-group <resource-group-name> \
      --enable-purge-protection
    
  3. للراحة، قم بتدوين معرف مورد مخزن المفاتيح وقم بتخزين القيمة في متغيرات البيئة:

    keyvaultID=$(az keyvault show --resource-group <resource-group-name> --name <key-vault-name> --query 'id' --output tsv)
    

تمكين الخدمات الموثوق بها للوصول إلى مخزن المفاتيح

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

تمكين الهويات المدارة للوصول إلى مخزن المفاتيح

هناك طريقتان لتمكين الهويات المدارة من الوصول إلى مخزن المفاتيح الخاص بك.

الخيار الأول هو تكوين نهج الوصول لمخزن المفاتيح وتعيين أذونات المفاتيح للوصول باستخدام هوية مدارة يعينها المستخدم:

  1. قم بتشغيل الأمر az keyvault set policy . قم بتمرير قيمة متغير البيئة التي تم إنشاؤها وتخزينها مسبقا ل principalID.

  2. تعيين الأذونات الرئيسية إلى getو unwrapKeyو:wrapKey

    az keyvault set-policy \
      --resource-group <resource-group-name> \
      --name <key-vault-name> \
      --object-id $identityPrincipalID \
      --key-permissions get unwrapKey wrapKey
    
    

الخيار الثاني هو استخدام التحكم في الوصول المستند إلى دور Azure (RBAC) لتعيين أذونات للهوية المدارة المعينة من قبل المستخدم والوصول إلى مخزن المفاتيح. قم بتشغيل الأمر az role assignment create وقم بتعيين Key Vault Crypto Service Encryption User الدور إلى هوية مدارة معينة من قبل المستخدم:

az role assignment create --assignee $identityPrincipalID \
  --role "Key Vault Crypto Service Encryption User" \
  --scope $keyvaultID

إنشاء مفتاح والحصول على معرف المفتاح

  1. قم بتشغيل الأمر az keyvault key create لإنشاء مفتاح في مخزن المفاتيح:

    az keyvault key create \
      --name <key-name> \
      --vault-name <key-vault-name>
    
  2. في إخراج الأمر، لاحظ معرف المفتاح (kid):

    [...]
      "key": {
        "crv": null,
        "d": null,
        "dp": null,
        "dq": null,
        "e": "AQAB",
        "k": null,
        "keyOps": [
          "encrypt",
          "decrypt",
          "sign",
          "verify",
          "wrapKey",
          "unwrapKey"
        ],
        "kid": "https://mykeyvault.vault.azure.net/keys/mykey/<version>",
        "kty": "RSA",
    [...]
    
  3. للراحة، قم بتخزين التنسيق الذي تختاره لمعرف المفتاح في $keyID متغير البيئة. يمكنك استخدام معرف مفتاح مع إصدار أو بدونه.

تدوير المفتاح

يمكنك اختيار التدوير اليدوي أو التلقائي للمفتاح.

سيؤدي تشفير سجل باستخدام مفتاح يديره العميل يحتوي على إصدار مفتاح إلى السماح فقط بالتناوب اليدوي للمفتاح في Azure Container Registry. يخزن هذا المثال خاصية kid الخاصة بالمفتاح:

keyID=$(az keyvault key show \
  --name <keyname> \
  --vault-name <key-vault-name> \
  --query 'key.kid' --output tsv)

سيؤدي تشفير السجل بمفتاح يديره العميل عن طريق حذف إصدار مفتاح إلى تمكين التدوير التلقائي للمفاتيح لاكتشاف إصدار مفتاح جديد في Azure Key Vault. يزيل هذا المثال الإصدار من خاصية kid الخاصة بالمفتاح:

keyID=$(az keyvault key show \
  --name <keyname> \
  --vault-name <key-vault-name> \
  --query 'key.kid' --output tsv)

keyID=$(echo $keyID | sed -e "s/\/[^/]*$//")

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

  1. قم بتشغيل الأمر az acr create لإنشاء سجل في طبقة الخدمة Premium وتمكين المفتاح المدار من قبل العميل.

  2. قم بتمرير قيم معرف الهوية المدارة (id) ومعرف المفتاح (kid) المخزنة في متغيرات البيئة في الخطوات السابقة:

    az acr create \
      --resource-group <resource-group-name> \
      --name <container-registry-name> \
      --identity $identityID \
      --key-encryption-key $keyID \
      --sku Premium
    

إظهار حالة التشفير

قم بتشغيل الأمر az acr encryption show لإظهار حالة تشفير السجل باستخدام مفتاح يديره العميل:

az acr encryption show --name <container-registry-name>

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

{
  "keyVaultProperties": {
    "identity": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "keyIdentifier": "https://myvault.vault.azure.net/keys/myresourcegroup/abcdefg123456789...",
    "keyRotationEnabled": true,
    "lastKeyRotationTimestamp": xxxxxxxx
    "versionedKeyIdentifier": "https://myvault.vault.azure.net/keys/myresourcegroup/abcdefg123456789...",
  },
  "status": "enabled"
}

تمكين مفتاح يديره العميل باستخدام مدخل Microsoft Azure

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

لإنشاء هوية مدارة يعينها المستخدم لموارد Azure في مدخل Microsoft Azure:

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

  2. احفظ اسم الهوية لاستخدامها في خطوات لاحقة.

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

إنشاء مخزن رئيسي

  1. اتبع الخطوات الواردة في التشغيل السريع: إنشاء مخزن مفاتيح باستخدام مدخل Microsoft Azure.

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

    لقطة شاشة لخيارات إنشاء مخزن مفاتيح في مدخل Microsoft Azure.

تمكين الخدمات الموثوق بها للوصول إلى مخزن المفاتيح

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

تمكين الهويات المدارة للوصول إلى مخزن المفاتيح

هناك طريقتان لتمكين الهويات المدارة من الوصول إلى مخزن المفاتيح الخاص بك.

الخيار الأول هو تكوين نهج الوصول لمخزن المفاتيح وتعيين أذونات المفاتيح للوصول باستخدام هوية مدارة يعينها المستخدم:

  1. انتقل إلى مخزن المفاتيح الخاص بك.
  2. حدد الإعدادات>نُهج الوصول> +إضافة نهج الوصول.
  3. حدد Key permissions، ثم حدد Get و Unwrap Key و Wrap Key.
  4. في تحديد كيان، حدد اسم المورد للهوية المُدارة التي عيّنها المستخدم.
  5. حدد إضافة، ثم حدد حفظ.

لقطة شاشة لخيارات إنشاء نهج الوصول إلى مخزن المفاتيح.

الخيار الآخر هو تعيين Key Vault Crypto Service Encryption User دور RBAC إلى الهوية المدارة المعينة من قبل المستخدم في نطاق مخزن المفاتيح. للحصول على خطوات مفصلة، راجع تعيين أدوار Azure باستخدام بوابة Azure .

إنشاء مفتاح

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

  1. انتقل إلى مخزن المفاتيح الخاص بك.
  2. حدد الإعدادات>المفاتيح.
  3. حدد + إنشاء/ استيراد وأدخل اسماً مميزاً للمفتاح.
  4. اقبل القيم الافتراضية المتبقية، ثم حدد إنشاء.
  5. بعد الإنشاء، حدد المفتاح ثم حدد الإصدار الحالي. انسخ معرّف المفتاح الخاص بإصدار المفتاح.

إنشاء سجل حاويات

  1. حدد Create a resource>Containers>Container Registry.
  2. في علامة التبويب Basics ، حدد مجموعة موارد أو أنشئها، ثم أدخل اسم سجل. في وحدة حفظ المخزون (SKU) ، حدد Premium.
  3. في علامة التبويب Encryption ، للمفتاح المدار من قبل العميل، حدد Enabled.
  4. بالنسبة للهوية، حدد الهوية المدارة التي قمت بإنشائها.
  5. بالنسبة إلى التشفير، اختر أحد الخيارات التالية:
    • اختر تحديد من Key Vault، ثم حدد إما مخزن مفاتيح ومفتاح موجودين أو حدد إنشاء جديد. المفتاح الذي تحدده غير منفر ويمكن التدوير التلقائي للمفتاح.
    • حدد إدخال معرف الموارد المنتظم (URI) للمفتاح، وقم بتوفير معرّف مفتاح موجود. يمكنك توفير عنوان URI للمفتاح الذي تم إصداره (لمفتاح يجب تدويره يدويا) أو URI مفتاح غير منفر (والذي يتيح التدوير التلقائي للمفتاح). راجع القسم السابق لمعرفة خطوات إنشاء مفتاح.
  6. حدد Review + create.
  7. حدد إنشاء لنشر مثيل السجل.

لقطة شاشة تعرض خيارات إنشاء سجل مشفر في مدخل Microsoft Azure.

إظهار حالة التشفير

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

تمكين مفتاح يديره العميل باستخدام قالب Resource Manager

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

  1. انسخ المحتوى التالي من قالب Resource Manager إلى ملف جديد واحفظه ك CMKtemplate.json:

    {
      "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "vault_name": {
          "defaultValue": "",
          "type": "String"
        },
        "registry_name": {
          "defaultValue": "",
          "type": "String"
        },
        "identity_name": {
          "defaultValue": "",
          "type": "String"
        },
        "kek_id": {
          "type": "String"
        }
      },
      "variables": {},
      "resources": [
        {
          "type": "Microsoft.ContainerRegistry/registries",
          "apiVersion": "2019-12-01-preview",
          "name": "[parameters('registry_name')]",
          "location": "[resourceGroup().location]",
          "sku": {
            "name": "Premium",
            "tier": "Premium"
          },
          "identity": {
            "type": "UserAssigned",
            "userAssignedIdentities": {
              "[resourceID('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('identity_name'))]": {}
            }
          },
          "dependsOn": [
            "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('identity_name'))]"
          ],
          "properties": {
            "adminUserEnabled": false,
            "encryption": {
              "status": "enabled",
              "keyVaultProperties": {
                "identity": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('identity_name')), '2018-11-30').clientId]",
                "KeyIdentifier": "[parameters('kek_id')]"
              }
            },
            "networkRuleSet": {
              "defaultAction": "Allow",
              "virtualNetworkRules": [],
              "ipRules": []
            },
            "policies": {
              "quarantinePolicy": {
                "status": "disabled"
              },
              "trustPolicy": {
                "type": "Notary",
                "status": "disabled"
              },
              "retentionPolicy": {
                "days": 7,
                "status": "disabled"
              }
            }
          }
        },
        {
          "type": "Microsoft.KeyVault/vaults/accessPolicies",
          "apiVersion": "2018-02-14",
          "name": "[concat(parameters('vault_name'), '/add')]",
          "dependsOn": [
            "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('identity_name'))]"
          ],
          "properties": {
            "accessPolicies": [
              {
                "tenantId": "[subscription().tenantId]",
                "objectId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('identity_name')), '2018-11-30').principalId]",
                "permissions": {
                  "keys": [
                    "get",
                    "unwrapKey",
                    "wrapKey"
                  ]
                }
              }
            ]
          }
        },
        {
          "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
          "apiVersion": "2018-11-30",
          "name": "[parameters('identity_name')]",
          "location": "[resourceGroup().location]"
        }
      ]
    }
    
  2. اتبع الخطوات الموجودة في الأقسام السابقة لإنشاء الموارد التالية:

    • مخزن المفاتيح، معرّف بالاسم
    • مفتاح مخزن المفاتيح، معرّف بمعرّف المفتاح
  3. قم بتشغيل الأمر az deployment group create لإنشاء السجل باستخدام ملف القالب السابق. عند الإشارة إليها، قم بتوفير اسم سجل جديد واسم هوية مدارة معينة من قبل المستخدم، جنبا إلى جنب مع اسم مخزن المفاتيح ومعرف المفتاح الذي قمت بإنشائه.

    az deployment group create \
      --resource-group <resource-group-name> \
      --template-file CMKtemplate.json \
      --parameters \
        registry_name=<registry-name> \
        identity_name=<managed-identity> \
        vault_name=<key-vault-name> \
        key_id=<key-vault-key-id>
    
  4. قم بتشغيل الأمر az acr encryption show لإظهار حالة تشفير السجل:

    az acr encryption show --name <registry-name>
    

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

تقدم إلى المقالة التالية للتنقل عبر تدوير المفاتيح التي يديرها العميل وتحديث إصدارات المفاتيح وإبطال مفتاح يديره العميل.