استخدم موفر Azure Key Vault لبرنامج تشغيل Secrets Store CSI في نظام مجموعة خدمة Azure Kubernetes ‏(AKS)

يوفر مزود Azure Key Vault لبرنامج تشغيل واجهة تخزين حاوية Secrets Store (CSI) بدمج مخزن مفتاح Azure كمخزن سري مع عنقود خدمة Azure Kubernetes ‏(AKS) عبر وحدة تخزين CSI.

الميزات

  • تحميل البيانات السرية والمفاتيح والشهادات إلى جراب باستخدام وحدة تخزين CSI.
  • يدعم وحدات التخزين المضمنة ل CSI.
  • يدعم تحميل عدة أسرار تخزين الكائنات كحجم واحد.
  • يدعم قابلية نقل البودات مع تعريف SecretProviderClass الموارد المخصص (CRD).
  • يدعم حاويات Windows.
  • تتم المزامنة مع أسرار Kubernetes.
  • يدعم التشغيل التلقائي للمحتويات المثبتة وأسرار Kubernetes المتزامنة.

القيود

  • الحاوية التي تستخدم أو ConfigMapSecret كحامل subPath حجم لا تتلقى تحديثات تلقائية عند تدوير السر، وهذا حد من قيود كوبيرنيتس. لكي تسري التغييرات، يحتاج التطبيق إلى إعادة تحميل الملف الذي تم تغييره إما عن طريق مراقبة التغييرات في نظام الملفات أو عن طريق إعادة تشغيل الجراب. لمزيد من المعلومات، راجع قيود Secrets Store CSI Driver المعروفة.
  • تقوم الإضافة بإنشاء هوية مدارة تسمى azurekeyvaultsecretsprovider-xxxxx في مجموعة موارد العقدة (MC_) وتعيينها تلقائيا إلى مجموعة مقياس الآلة الافتراضية. يمكنك استخدام هذه الهوية المدارة أو الهوية المدارة الخاصة بك للوصول إلى مخزن المفاتيح. لا يتم دعم منع إنشاء الهوية.

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

  • في حال لم يكن لديك اشتراك Azure، فأنشئ حساباً مجانيّاً قبل البدء.

  • Terraform الذي هو الإصدار 1.6 أو أحدث.

  • Azure CLI التثبيت وتسجيل الدخول. تثبيت أحدث إصدار.

  • أذونات لإنشاء موارد AKS و Key Vault.

  • قم بتعيين اشتراك Azure الخاص بك في Azure CLI بالأمر التالي. استبدل <subscriptionId> بمعرّف اشتراكك.

    az account set --subscription <subscriptionId>
    

الشبكة

الأدوار

إنشاء نظام مجموعة AKS

إنشاء عنقود AKS مع مزود Azure Key Vault لدعم برنامج تشغيل CSI في Secrets Store.

  1. أنشئ متغيرات تستخدم في الأوامر لإنشاء عنقود AKS وخزنة المفاتيح.

    export RANDOM_STRING=$(printf '%05d%05d' "$RANDOM" "$RANDOM")
    export KEYVAULT_NAME=myKeyVault${RANDOM_STRING}
    export RESOURCE_GROUP=myResourceGroup
    export CLUSTER_NAME=myAKSCluster
    export LOCATION=eastus2
    

    يجب أن تكون أسماء خزنة مفاتيح Azure فريدة عالميا، أبجدية رقمية تشمل الشرطات، وتحتوي على 3-24 حرفا. اسم خزنة المفاتيح يربط قيمة المتغير KEYVAULT_NAMEmyKeyVault بسلسلة RANDOM_STRING المتغيرات المكونة من 10 أحرف.

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

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  3. إنشاء نظام مجموعة AKS مع موفر Azure Key Vault لإمكانية Secrets Store CSI Driver باستخدام az aks create الأمر مع المعلمة --enable-addons azure-keyvault-secrets-provider .

    ينشئ هذا --enable-addons المعامل هوية مدارة معينة من قبل المستخدم تسمى azurekeyvaultsecretsprovider-xxxx يمكنك استخدامها للمصادقة على خزنة مفاتيحك. يتم تخزين الهوية المدارة في مجموعة موارد العقد (MC_) ويتم تعيينها تلقائيا لمجموعة مقياس الآلة الافتراضية. يمكنك استخدام هذه الهوية المدارة أو الهوية المدارة الخاصة بك للوصول إلى مخزن المفاتيح. لا يتم دعم منع إنشاء الهوية.

    az aks create \
      --name $CLUSTER_NAME \
      --resource-group $RESOURCE_GROUP \
      --enable-addons azure-keyvault-secrets-provider \
      --generate-ssh-keys
    

    نصيحة

    إذا كنت تريد استخدام معرف هوية حمل عمل Microsoft Entra، يجب أن az aks create يتضمن الأمر ال و --enable-oidc-issuer--enable-workload-identity المعلمات.

إنشاء نظام مجموعة AKS

أنشئ ملف main.tf بالتكوين التالي لإنشاء عنقود AKS مع مزود Azure Key Vault لدعم برامج تشغيل CSI في Secrets Store.

  1. أنشئ تكوين Terraform.

    terraform {
     required_version = ">= 1.6.0"
     required_providers {
       azurerm = {
         source  = "hashicorp/azurerm"
         version = "~> 4.0"
       }
     }
    }
    provider "azurerm" {
     features {}
    }
    data "azurerm_client_config" "current" {}
    resource "azurerm_resource_group" "rg" {
     name     = "aks-rg"
     location = "East US"
    }
    
  2. أنشئ عنقود AKS.

    resource "azurerm_kubernetes_cluster" "aks" {
     name                = "aks-cluster"
     location            = azurerm_resource_group.rg.location
     resource_group_name = azurerm_resource_group.rg.name
     dns_prefix          = "akscsi"
     default_node_pool {
       name       = "system"
       node_count = 1
       vm_size    = "Standard_DS2_v2"
     }
     identity {
       type = "SystemAssigned"
     }
     key_vault_secrets_provider {
       secret_rotation_enabled = false
     }
    }
    
  3. نشر الإعدادات. قم بتشكيل جلسة Bash، وتشغيل الأوامر التالية لنشر الموارد:

    terraform init
    terraform validate
    terraform plan
    terraform apply
    

تحديث نظام مجموعة AKS موجود

قم بتحديث عنقود AKS موجود مع مزود Azure Key Vault لدعم برنامج تشغيل CSI في Secrets Store.

  1. أنشئ متغيرات تستخدم في الأوامر. استبدل القيم حسب الحاجة لتحديث عنقود AKS الحالي أو خزنة المفاتيح.

    على سبيل المثال، إذا كنت تستخدم خزنة مفاتيح موجودة، استبدل قيمة المتغير KEYVAULT_NAME دون استخدام المتغير RANDOM_STRING .

    إذا لم يكن لديك خزنة مفاتيح، يجب أن تكون أسماء خزنة مفاتيح Azure فريدة عالميا، أبجدية رقمية تشمل الشرطات، و3-24 حرفا. اسم خزنة المفاتيح يربط قيمة المتغير KEYVAULT_NAMEmyKeyVault بسلسلة RANDOM_STRING المتغيرات المكونة من 10 أحرف. يمكنك إنشاء خزنة المفاتيح لاحقا في هذا المقال.

    export RANDOM_STRING=$(printf '%05d%05d' "$RANDOM" "$RANDOM")
    export KEYVAULT_NAME=myKeyVault${RANDOM_STRING}
    export RESOURCE_GROUP=myResourceGroup
    export CLUSTER_NAME=myAKSCluster
    export LOCATION=eastus2
    
  2. قم بتحديث مجموعة AKS موجودة باستخدام مزود Azure Key Vault لميزة برنامج تشغيل CSI في Secrets Store باستخدام az aks enable-addons الأمر وفعل الإضافة azure-keyvault-secrets-provider . تنشئ الوظيفة الإضافية هوية مدارة معينة من قبل المستخدم يمكنك استخدامها للمصادقة على مخزن المفاتيح الخاص بك.

    az aks enable-addons \
      --addons azure-keyvault-secrets-provider \
      --name $CLUSTER_NAME \
      --resource-group $RESOURCE_GROUP
    

    بعد تفعيل مزود Azure Key Vault السريري، يقوم AKS بإنشاء هوية مدارة تحمل اسمها azurekeyvaultsecretsprovider-xxxx يمكنك استخدامها للمصادقة على خزنة المفاتيح الخاصة بك. يتم تخزين الهوية المدارة في مجموعة موارد العقد (MC_) ويتم تعيينها تلقائيا لمجموعة مقياس الآلة الافتراضية. يمكنك استخدام هذه الهوية المدارة أو الهوية المدارة الخاصة بك للوصول إلى مخزن المفاتيح. لا يتم دعم منع إنشاء الهوية.

تحديث نظام مجموعة AKS موجود

أنشئ ملف main.tf مع التكوين التالي لتحديث عنقود AKS موجود مع مزود Azure Key Vault لدعم برنامج تشغيل CSI في Secrets Store.

  1. تحديث ومجموعة AKS الحالية.

    resource "azurerm_kubernetes_cluster" "aks" {
     name                = "<existing-cluster>"
     resource_group_name = "<resource-group>"
     key_vault_secrets_provider {
       secret_rotation_enabled = false
     }
    }
    
  2. نشر الإعدادات. قم بتشكيل جلسة Bash، وتشغيل الأوامر التالية لنشر التكوين:

    Run the following commands to apply the updates:
    
    terraform init
    terraform validate
    terraform plan
    terraform apply
    

تحقق من تثبيت مزود خدمة الخزانة المدارة والهاتف

إذا استخدمت Terraform لإنشاء عنقود جديد أو تحديث عنقود موجود، عليك استبدال المتغيرات كما $CLUSTER_NAME في الأوامر التالية بالقيم التي استخدمتها في تكوين Terraform الخاص بك.

تحقق من الهوية المدارة

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

  1. تحقق من إنشاء الهوية المدارة وتعيينها للعنقود باستخدام az aks show الأمر.

    az aks show \
      --name $CLUSTER_NAME \
      --resource-group $RESOURCE_GROUP \
      --query addonProfiles
    
    {
      "azureKeyvaultSecretsProvider": {
        "config": {
          "enableSecretRotation": "false",
          "rotationPollInterval": "2m"
        },
        "enabled": true,
        "identity": {
          "clientId": "00001111-aaaa-2222-bbbb-3333cccc4444",
          "objectId": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
          "resourceId": "/subscriptions/<subscriptionID>/resourcegroups/MC_myResourceGroup_myAKSCluster_eastus2/providers/Microsoft.ManagedIdentity/userAssignedIdentities/azurekeyvaultsecretsprovider-myakscluster"
        }
      }
    }
    

    تظهر الخاصية resourceId مجموعة الموارد واسم azurekeyvaultsecretsprovider-myaksclusterالهوية .

  2. تحقق من أن الهوية المدارة مخصصة لمجموعة مقياس الآلة الافتراضية لمجموعة موارد العقدة.

    NODE_RG=$(az aks show \
      --name $CLUSTER_NAME \
      --resource-group $RESOURCE_GROUP \
      --query nodeResourceGroup --output tsv)
    
    VMSS_NAME=$(az vmss list \
      --resource-group $NODE_RG \
      --query [].name --output tsv)
    
    az vmss show --name $VMSS_NAME --resource-group $NODE_RG --query '[id, identity]'
    

    يظهر الناتج معرف الموارد لمجموعات Microsoft.Compute/virtualMachineScaleSets مقياس الآلات الافتراضية والخاصية userAssignedIdentities التي تحتوي على معرف مورد يؤكد azurekeyvaultsecretsprovider-myakscluster أن الهوية مخصصة لمجموعة مقياس الآلة الافتراضية.

تحقق من موفر Azure Key Vault لتثبيت Secrets Store CSI Driver

  1. احصل على بيانات اعتماد نظام مجموعة AKS باستخدام az aks get-credentials الأمر .

    az aks get-credentials \
      --name $CLUSTER_NAME \
      --resource-group $RESOURCE_GROUP
    
  2. تحقق من انتهاء التثبيت باستخدام kubectl get pods الأمر، الذي يسرد جميع الكبسولات مع التسميات secrets-store-csi-driver و secrets-store-provider-azure /وعلامات في kube-system مساحة الأسماء.

    kubectl get pods -n kube-system -l 'app in (secrets-store-csi-driver,secrets-store-provider-azure)' -o wide
    

    تتضمن العلامة -o wide العقدة التي يعمل عليها كل وحدة في المخرج.

    يجب أن يبدو الإخراج مشابها لإخراج المثال التالي:

    NAME                                     READY   STATUS    RESTARTS   AGE    NODE
    aks-secrets-store-csi-driver-4vpkj       3/3     Running   2          4m25s  aks-nodepool1-12345678-vmss000002
    aks-secrets-store-csi-driver-ctjq6       3/3     Running   2          4m21s  aks-nodepool1-12345678-vmss000001
    aks-secrets-store-csi-driver-tlvlq       3/3     Running   2          4m24s  aks-nodepool1-12345678-vmss000000
    aks-secrets-store-provider-azure-5p4nb   1/1     Running   0          4m21s  aks-nodepool1-12345678-vmss000000
    aks-secrets-store-provider-azure-6pqmv   1/1     Running   0          4m24s  aks-nodepool1-12345678-vmss000001
    aks-secrets-store-provider-azure-f5qlm   1/1     Running   0          4m25s  aks-nodepool1-12345678-vmss000002
    

إنشاء خزنة مفاتيح جديدة

شغل الأمر az keyvault create لإنشاء خزنة مفاتيح جديدة مع تفعيل Azure RBAC.

az keyvault create \
  --name $KEYVAULT_NAME \
  --resource-group $RESOURCE_GROUP \
  --location $LOCATION \
  --enable-rbac-authorization

Azure RBAC مفعل افتراضيا عند إنشاء خزنة مفاتيح جديدة حتى لو لم تتضمن المعاملة --enable-rbac-authorization .

لمزيد من المعلومات حول نماذج الأصوات key vault وRBAC Azure، راجع توفير الوصول إلى مفاتيح Key Vault والشهادات والأسرار من خلال Azure التحكم في الوصول القائم على الأدوار.

تحديث خزنة المفاتيح الحالية

شغل أمر az keyvault update لتحديث خزنة مفاتيح موجودة باستخدام Azure التحكم في الوصول القائم على الأدوار (Azure RBAC). معامل --enable-rbac-authorization ضروري لتمكين Azure RBAC عند تحديث خزنة مفاتيح موجودة تم تعطيل Azure RBAC.

az keyvault update \
  --name $KEYVAULT_NAME \
  --resource-group $RESOURCE_GROUP \
  --enable-rbac-authorization

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

إضافة تعيين الأدوار والسر إلى خزنة المفاتيح

  1. شغل الأمر az keyvault show للتحقق من أن خزنة المفاتيح مفعلة في Azure RBAC.

    az keyvault show \
      --name $KEYVAULT_NAME \
      --resource-group $RESOURCE_GROUP \
      --query properties.enableRbacAuthorization
    

    يجب أن يكون trueالناتج هو .

  2. أضف تعيين دور لحساب المستخدم الخاص بك إلى نطاق خزنة المفاتيح باستخدام az role assignment create الأمر حتى تتمكن من إضافة سر خزنة المفاتيح في الخطوة التالية.

    تمت إضافة دور ضابط أسرار خزنة المفاتيح مع معرف b86a8fe4-44ce-4948-aee5-eccb2c155cd7 فريد ويمكنك استخدام الاسم أو المعرف الفريد. استخدام معرف الدور الفريد هو ممارسة مثلى لمنع حدوث مشاكل إذا تغير اسم الدور.

    KEYVAULT_ID=$(az keyvault show \
      --name $KEYVAULT_NAME \
      --resource-group $RESOURCE_GROUP \
      --query id -o tsv)
    
    MYID=$(az ad signed-in-user show --query id --output tsv)
    
    az role assignment create \
      --assignee-object-id $MYID \
      --role "b86a8fe4-44ce-4948-aee5-eccb2c155cd7" \
      --scope $KEYVAULT_ID \
      --assignee-principal-type User
    

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

    az role assignment list \
      --assignee-object-id $MYID \
      --scope $KEYVAULT_ID \
      --query '[].{Role:roleDefinitionName, Scope:scope}' \
      --output table
    
  3. أنشئ سريا نصيا مسماة ExampleSecret في خزنة المفاتيح باستخدام الأمر az keyvault secret set .

    يمكن لمخزن المفاتيح تخزين المفاتيح والأسرار والشهادات. يستخدم المعامل value المتغير RANDOM_STRING لإنشاء قيمة فريدة للسر.

    az keyvault secret set \
      --vault-name $KEYVAULT_NAME \
      --name ExampleSecret \
      --value MyAKSExampleSecret${RANDOM_STRING}
    
  4. تحقق من إضافة السر إلى خزنة المفاتيح باستخدام أمر [az keyvault secret show][az-keyvault-secret-show].

    az keyvault secret show --vault-name $KEYVAULT_NAME --name ExampleSecret
    

إنشاء خزنة مفاتيح جديدة

قم بتحديث ملف main.tf لإنشاء خزنة مفاتيح جديدة مع تفعيل Azure التحكم في الوصول القائم على الأدوار (Azure RBAC).

  1. أنشئ خزنة مفاتيح جديدة مع تفعيل Azure RBAC.

    data "azurerm_client_config" "current" {}
    resource "random_string" "suffix" {
     length  = 5
     special = false
     upper   = false
    }
    resource "azurerm_key_vault" "kv" {
     name                = "akskv${random_string.suffix.result}"
     location            = azurerm_resource_group.rg.location
     resource_group_name = azurerm_resource_group.rg.name
     tenant_id           = data.azurerm_client_config.current.tenant_id
     sku_name            = "standard"
     enable_rbac_authorization = true
    }
    
  2. تعيين دور ضابط Key Vault Secrets.

    resource "azurerm_role_assignment" "kv_role" {
     scope                = azurerm_key_vault.kv.id
     role_definition_name = "Key Vault Secrets Officer"
     principal_id         = data.azurerm_client_config.current.object_id
    }
    
  3. أنشئ ExampleSecret في خزنة المفاتيح.

    resource "azurerm_key_vault_secret" "example" {
     name         = "ExampleSecret"
     value        = "MyAKSExampleSecret"
     key_vault_id = azurerm_key_vault.kv.id
    }
    
  4. نشر الإعدادات. قم بتشكيل جلسة Bash، وتشغيل الأوامر التالية لنشر التكوين المحدث:

    terraform plan
    terraform apply
    
  5. تمت إضافة Verify ExampleSecret إلى خزنة المفاتيح باستخدام أمر [az keyvault secret show][az-keyvault-secret-show]. استبدلها <keyvault-name> باسم خزنة المفاتيح التي أنشأتها في تكوين Terraform الخاص بك.

    az keyvault secret show \
     --vault-name <keyvault-name> \
     --name ExampleSecret
    

تحديث خزنة المفاتيح الحالية

قم بتحديث ملف main.tf الخاص بك لتحديث خزنة مفاتيح موجودة مع تفعيل Azure التحكم في الوصول القائم على الدور (Azure RBAC).

  1. قم بتحديث مخزن المفاتيح الحالي لتمكين Azure RBAC.

    resource "azurerm_key_vault" "kv" {
     name                = "<existing-kv>"
     resource_group_name = "<resource-group>"
     enable_rbac_authorization = true
    }
    
  2. تعيين دور وأضف سريا.

    resource "azurerm_role_assignment" "kv_role" {
     scope                = azurerm_key_vault.kv.id
     role_definition_name = "Key Vault Secrets Officer"
     principal_id         = data.azurerm_client_config.current.object_id
    }
    resource "azurerm_key_vault_secret" "example" {
     name         = "ExampleSecret"
     value        = "MyAKSExampleSecret"
     key_vault_id = azurerm_key_vault.kv.id
    }
    
  3. نشر الإعدادات. قم بتشكيل جلسة Bash، وتشغيل الأوامر التالية لنشر التكوين المحدث:

    terraform plan
    terraform apply
    

تنظيف الموارد

إذا كنت ذاهبا إلى المقالة التالية وتحتاج إلى هذه الموارد، تجاهل الخطوات التالية. وإلا، إذا انتهيت ولم تكن تخطط للمتابعة إلى المقال التالي، يجب عليك حذف الموارد التي تم إنشاؤها في هذا المقال لتجنب التكاليف غير الضرورية.

  1. قم بإزالة بيانات اعتماد العنقود من ملف .kube/config المحلي.

    KUBE_CONTEXT=$(kubectl config current-context)
    kubectl config delete-context $KUBE_CONTEXT
    
  2. احذف مجموعة الموارد وجميع الموارد داخلها، بما في ذلك الموارد في مجموعة موارد العقدة (MC_) باستخدام az group delete الأمر.

    az group delete --name $RESOURCE_GROUP --yes --no-wait
    

تقوم هذه الأوامر terraform destroy بإزالة جميع الموارد المعرفة في تكوين Terraform الحالي وملف الحالة. شغل هذا الأمر فقط من الدليل العامل المستخدم لهذا المقال.

التحذير

إذا كنت تعمل مع الموارد الحالية أو الإنتاجية، راجع خطة التنفيذ بعناية قبل التشغيل:

terraform plan -destroy

تجنب اللعب terraform destroy ضد البنية التحتية المشتركة أو المستوردة إلا إذا كنت متأكدا من أنها آمنة للإزالة. لمزيد من المعلومات، راجع توثيق Terraform الخاص بأمر تدمير التيرافورم .

  1. قم بإزالة بيانات اعتماد العنقود من ملف .kube/config المحلي.

    KUBE_CONTEXT=$(kubectl config current-context)
    kubectl config delete-context $KUBE_CONTEXT
    
  2. شغل الأمر التالي لإزالة الموارد التي تم إنشاؤها في هذا المقال:

    terraform destroy
    

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

في هذه المقالة، تعلمت كيفية استخدام موفر Azure Key Vault لبرنامج تشغيل CSI مخزن الأسرار في نظام مجموعة AKS. تحتاج الآن إلى توفير هوية للوصول إلى Azure Key Vault. لمعرفة كيفية إجراء ذلك، تابع إلى المقالة التالية.