تمرين - إدارة البيانات السرية في قالب ARM خاصتك

مكتمل

في التمرين السابق، شغلت قالب Azure Resource Manager (ARM) الأساسي الذي يزود جهاز ظاهري يعمل بنظام Linux. في هذا الجزء، يمكنك اتباع عملية مماثلة.

هذه المرة، بدلًا من تمرير كلمة المرور باعتبارها معلمة، يمكنك تخزين كلمة المرور في Azure Key Vault. لتمكين قالب ARM من الوصول إلى كلمة المرور، يمكنك إنشاء ملف معلمة يشير إلى بيانات المخزن الرئيسي السرية في اشتراكك.

توزيع Azure Key Vault

إشعار

نظرًا للقيود المفروضة على بيئة الاختبار المعزولة، يمكنك هنا إنشاء مخزن رئيسي في Azure Key Vault من مدخل Azure. عادةً ما يمكنك استخدام New-AzKeyVault cmdlet لإنشاء مخزن رئيسي من Azure PowerShell.

أنشئ مخزنًا رئيسيًا واسمح بالوصول إلى وقت التوزيع. للقيام بذلك:

  1. أنشئ متغيّر PowerShell يحمل اسم المخزن الرئيسي:

    $KVNAME="tailwind-secrets" + (Get-Random -Count 1 -Maximum 9999999)
    
  2. شغَّل $KVNAME لطباعة قيمته:

    $KVNAME
    

    يشبه مُخرجك هذا (الرقم الذي تراه سيكون مختلفًا):

    tailwind-secrets5978564
    

    انسخ القيمة في مكان مناسب للخطوة التالية.

  3. سجِّل الدخول إلى مدخل Azure باستخدام الحساب نفسه الذي استخدمته في تنشيط بيئة الاختبار المعزولة.

  4. في قائمة مدخل Microsoft Azure أو من صفحة الصفحة الرئيسية، حدد إنشاء مورد.

  5. في مربع البحث، أدخِل Key Vault.

  6. حدد Key Vault من القائمة، وحدد Create لبدء تكوين المخزن الرئيسي.

  7. في جزء الإنشاء، حدد هذه القيم:

    1. Resource group: اسم مجموعة الموارد.
    2. Key vault name: قيمتك لـ $KVNAME، على سبيل المثال، tailwind-secrets5978564.
  8. حدد "Review + create".

  9. حدد إنشاء. هذا يجب أن يستغرق دقيقة أو نحو ذلك. بعد إنشاء المورد، حدد Go to resource.

  10. حدد Access Configuration ضمن الإعدادات. قم بتمكين الخيار Azure Resource Manager لنشر القالب وحدد Apply.

  11. من جلسة عمل PowerShell خاصتك، شغَّل الأمر ConvertTo-SecureString cmdlet وتعيين النتيجة إلى المتغير secretSecureString :

    $secretSecureString = ConvertTo-SecureString 'insecurepassword123!' -AsPlainText -Force
    
  12. شغّل الأمر Set-AzKeyVaultSecret التالي لتعيين البيانات السرية في المخزن الرئيسي. البيانات السرية تُسمى vmPassword، مع القيمة insecurepassword123! :

    $secret = Set-AzKeyVaultSecret -VaultName $KVNAME -Name vmPassword -SecretValue $secretSecureString
    

إنشاء ملف المعلمة

هنا، تُنشئ ملف معلمة يحتوي على اسم الجهاز الظاهري واسم المستخدم المسؤول و مرجع إلى كلمة مرور الجهاز الظاهري في المخزن الرئيسي.

يمكنك تمرير المعلمات إلى قوالب من سطر الأوامر. تذكر أن ملف معلمة هو طريقة بديلة لتمرير المعلمات إلى قالب ARM خاصتك أثناء التوزيع. يمكِّنك ملف المعلمة من الوصول إلى بيانات المخزن الرئيسي السرية من قالبك.

  1. شغَّل الأمر Get-AzKeyVault التالي لطباعة معرف المخزن الرئيسي خاصتك:

    Get-AzKeyVault -VaultName $KVNAME | Select-Object -ExpandProperty ResourceId
    

    يكون الإخراج مشابهًا لما يلي:

    /subscriptions/7c7df858-93a0-4f38-8990-304c836a4e8d/resourceGroups/<rgn>[resource group name]</rgn>/providers/Microsoft.KeyVault/vaults/tailwind-secrets3020
    

    لاحظ المُخرج للخطوة التالية.

  2. في Visual Studio Code، أنشئ ملفًا بالاسم azuredeploy.parameters.json في الدليل نفسه الذي يحتوي على azuredeploy.json.

  3. أضِف هذه المحتويات إلى azuredeploy.parameters.json:

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "adminUsername": {
          "value": "azureuser"
        },
        "vmName": {
          "value": "vm2"
        },
        "adminPasswordOrKey": {
          "reference": {
             "keyVault": {
             "id": ""
             },
             "secretName": "vmPassword"
          }
        }
      }
    }
    
  4. استبدل بقيمة id (سلسلة فارغة) القيمة التي نسختها في الخطوة السابقة. ثم احفظ الملف.

توزيع جهاز ظاهري يعمل بنظام Linux

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

  1. شغّل الأمر New-AzResourceGroupDeployment التالي:

    New-AzResourceGroupDeployment `
      -TemplateFile "./azuredeploy.json" `
      -TemplateParameterFile "./azuredeploy.parameters.json" `
      -dnsLabelPrefix ("vm2-" + (Get-Random -Count 1 -Maximum 9999999))
    

    في التمرين السابق، زودت زوج قيم المفاتيح جميعها مباشرةً من سطر الأوامر. هنا، يمكنك تحديد "./azuredeploy.parameters.json" لتزويد ملف المعلمات.

    يُعين dnsLabelPrefix إلى vm2- متبوعًا برقم عشوائي. هذا مطلوب للتأكد من أن اسم DNS يختلف عن اسم DNS الذي استخدمته في التمرين السابق.

تحقق من النشر

تحقق من أن الجهاز الظاهري مزود وأنه قابل للاتصال عبر SSH. للقيام بذلك:

  1. شغَّل الأمر Invoke-Expression للاتصال بجهاز ظاهري عبر SSH:

    Invoke-Expression (Get-AzResourceGroupDeployment -Name azuredeploy -ResourceGroupName <rgn>your resource group</rgn>).outputs.sshCommand.value
    

    عند مطالبتك، أدخِل yes لمتابعة الاتصال. ثم أدخِل كلمة مرور المسؤول، insecurepassword123!.

    هام

    حافظ على أمان كلمات المرور عمليًا. يمكنك أيضًا استخدام مصادقة المفتاح العام، والتي عادةً ما تكون أكثر أمانًا من استخدام كلمات المرور.

  2. من اتصال SSH خاصتك بالجهاز الظاهري، شغَّل hostname لطباعة اسم مضيف الجهاز الظاهري:

    hostname
    

    يمكنك أن ترى اسم المضيف الداخلي للجهاز الظاهري، vm1:

    vm2
    
  3. شغَّل exit لمغادرة جلسة عمل SSH خاصتك.

    exit
    

عمل جيد! لقد وسعت نطاق التوزيع خاصتك ليشمل ملف معلمات يقرأ معلومات سرية من Key Vault.

توزيع Azure Key Vault

أنشئ في Azure Key Vault مخزنًا رئيسيًا وأضِف كلمة مرور الجهاز الظاهري باعتبارها بيانات سرية آمنة. للقيام بذلك:

  1. أنشئ متغيّر Bash الذي يحمل اسم المخزن الرئيسي.

    KVNAME=tailwind-secrets$RANDOM
    

    يجب أن تكون أسماء المخزن الرئيسي مميزة. يضمن الجزء $RANDOM أن اسم المخزن الرئيسي ينتهي بسلسلة عشوائية من الأرقام.

  2. شغَّل الأمر az keyvault create التالي لإنشاء المخزن الرئيسي:

    az keyvault create \
      --name $KVNAME \
      --enabled-for-template-deployment true
    

    تسمح الوسيطة --enabled-for-template-deployment لقالب Azure Resource Manager (ARM) باسترداد البيانات السرية من المخزن الرئيسي.

  3. شغّل الأمر az keyvault secret set التالي لتعيين البيانات السرية في المخزن الرئيسي. البيانات السرية تُسمى vmPassword، مع القيمة insecurepassword123! :

    az keyvault secret set \
      --vault-name $KVNAME \
      --name vmPassword \
      --value 'insecurepassword123!'
    

إنشاء ملف المعلمة

هنا، تُنشئ ملف معلمة يحتوي على اسم الجهاز الظاهري واسم المستخدم المسؤول و مرجع إلى كلمة مرور الجهاز الظاهري في المخزن الرئيسي.

يمكنك تمرير المعلمات إلى قوالب من سطر الأوامر. تذكر أن ملف معلمة هو طريقة بديلة لتمرير المعلمات إلى قالب ARM خاصتك أثناء التوزيع. يمكِّنك ملف المعلمة من الوصول إلى بيانات المخزن الرئيسي السرية من قالبك.

  1. شغَّل الأمر az keyvault show التالي لطباعة معرف المخزن الرئيسي خاصتك:

    az keyvault show \
      --name $KVNAME \
      --query id \
      --output tsv
    

    يكون الإخراج مشابهًا لما يلي:

    /subscriptions/7c7df858-93a0-4f38-8990-304c836a4e8d/resourceGroups/<rgn>[resource group name]</rgn>/providers/Microsoft.KeyVault/vaults/tailwind-secrets3020
    

    لاحظ المُخرج للخطوة التالية.

  2. في Visual Studio Code، أنشئ ملفًا بالاسم azuredeploy.parameters.json في الدليل نفسه الذي يحتوي على azuredeploy.json.

  3. أضِف هذه المحتويات إلى azuredeploy.parameters.json:

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "adminUsername": {
          "value": "azureuser"
        },
        "vmName": {
          "value": "vm2"
        },
        "adminPasswordOrKey": {
          "reference": {
             "keyVault": {
             "id": ""
             },
             "secretName": "vmPassword"
          }
        }
      }
    }
    
  4. استبدل بقيمة id (سلسلة فارغة) القيمة التي نسختها في الخطوة السابقة. ثم احفظ الملف.

توزيع جهاز ظاهري يعمل بنظام Linux

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

شغّل الأمر az deployment group createالتالي لتوزيع القالب:

az deployment group create \
  --template-file azuredeploy.json \
  --parameters @azuredeploy.parameters.json dnsLabelPrefix="vm2-$RANDOM"

في التمرين السابق، زودت كل زوج قيم المفاتيح في الوسيطة --parameters. هنا، يمكنك تحديد @azuredeploy.parameters.json لتزويد ملف المعلمات.

يُعين dnsLabelPrefix إلى vm2- متبوعًا برقم عشوائي. هذا مطلوب للتأكد من أن اسم DNS يختلف عن اسم DNS الذي استخدمته في التمرين السابق.

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

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

  1. شغَّل ما يلي للاتصال بجهازك الظاهري عبر SSH:

    $(az deployment group show \
      --name azuredeploy \
      --query properties.outputs.sshCommand.value \
      --output tsv)
    

    عند مطالبتك، أدخِل yes لمتابعة الاتصال. ثم أدخِل كلمة مرور المسؤول، insecurepassword123!.

  2. من اتصال SSH خاصتك بالجهاز الظاهري، شغَّل hostname لطباعة اسم مضيف الجهاز الظاهري:

    hostname
    

    يمكنك أن ترى اسم المضيف الداخلي للجهاز الظاهري، vm2:

    vm2
    
  3. شغَّل exit لمغادرة جلسة عمل SSH خاصتك.

    exit
    

عمل جيد! لقد وسعت نطاق التوزيع خاصتك ليشمل ملف معلمات يقرأ معلومات سرية من Key Vault.