التعليم: عزل الاتصال الخلفي في Azure App Service باستخدام تكامل الشبكة الافتراضية

في هذا المقال، تقوم بتكوين تطبيق خدمة التطبيقات مع اتصال آمن ومعزول من الشبكة إلى خدمات الخلفية. السيناريو النموذجي المستخدم هو في Tutorial: اتصال الخدمة المعرفية الآمنة من خدمة التطبيقات باستخدام Key Vault. عند الانتهاء، سيكون لديك تطبيق خدمة التطبيقات الذي يصل إلى كل من Key Vault وأدوات Foundry عبر شبكة افتراضية لجهاز Azure. لا يسمح لأي حركة مرور أخرى بالوصول إلى تلك الموارد الخلفية. سيتم عزل جميع حركة المرور داخل شبكتك الافتراضية عبر تكامل الشبكة الافتراضيةونقاط النهاية الخاصة.

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

مخطط يوضح بنية السيناريو.

في هذه البنية:

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

ستتعلم كيفية:

  • أنشئ شبكة افتراضية وشبكات فرعية لتكامل الشبكة الافتراضية في خدمة التطبيقات
  • إنشاء مناطق DNS خاصة
  • إنشاء نقاط نهاية خاصة
  • تكوين تكامل الشبكة الافتراضية في خدمة التطبيقات

المتطلبات المسبقه

قم بإنشاء شبكة اتصال ظاهرية وشبكات فرعية

  1. أنشئ شبكة ظاهرية. استبدل <اسم> الشبكة الافتراضية باسم فريد.

    # Save the virtual network name as a variable for convenience
    vnetName=<virtual-network-name>
    
    az network vnet create --resource-group $groupName --location $region --name $vnetName --address-prefixes 10.0.0.0/16
    
  2. أنشئ شبكة فرعية لتكامل الشبكة الافتراضية في خدمة التطبيقات.

    az network vnet subnet create --resource-group $groupName --vnet-name $vnetName --name vnet-integration-subnet --address-prefixes 10.0.0.0/24 --delegations Microsoft.Web/serverfarms --private-endpoint-network-policies Enabled
    

    بالنسبة لخدمة التطبيقات، التوصية هي أن يكون لشبكة تكامل الشبكة الافتراضية كتلة /26 CIDR على الأقل. (انظر متطلبات تكامل الشبكة الفرعية.) /24 أكثر من كافية. يحدد --delegations Microsoft.Web/serverfarms أنه تم تفويض الشبكة الفرعية لتكامل الشبكة الظاهرية لخدمة التطبيقات.

  3. أنشئ شبكة فرعية أخرى لنقاط النهاية الخاصة.

    az network vnet subnet create --resource-group $groupName --vnet-name $vnetName --name private-endpoint-subnet --address-prefixes 10.0.1.0/24 --private-endpoint-network-policies Disabled
    

    بالنسبة لشبكات النقاط النهائية الخاصة، تحتاج إلى تعطيل سياسات شبكة النقاط النهائية الخاصة.

إنشاء مناطق DNS خاصة

نظرا لأن موارد Key Vault وأدوات Foundry الخاصة بك ستكون موجودة خلف نقاط نهاية خاصة، تحتاج إلى تحديد مناطق DNS خاصة لها. تستخدم هذه المناطق لاستضافة سجلات DNS لنقاط النهاية الخاصة وتسمح للعملاء بالعثور على خدمات الخلفية بالاسم.

  1. أنشئ منطقتين خاصتين لنظام DNS، واحدة لموارد أدوات الصبك وأخرى لخزنة المفاتيح.

    az network private-dns zone create --resource-group $groupName --name privatelink.cognitiveservices.azure.com
    az network private-dns zone create --resource-group $groupName --name privatelink.vaultcore.azure.net
    

    لمزيد من المعلومات حول هذه الإعدادات، راجع تكوين Azure Private Endpoint DNS.

  2. اربط مناطق DNS الخاصة بالشبكة الافتراضية.

    az network private-dns link vnet create --resource-group $groupName --name cognitiveservices-zonelink --zone-name privatelink.cognitiveservices.azure.com --virtual-network $vnetName --registration-enabled False
    az network private-dns link vnet create --resource-group $groupName --name vaultcore-zonelink --zone-name privatelink.vaultcore.azure.net --virtual-network $vnetName --registration-enabled False
    

إنشاء نقاط نهاية خاصة

  1. في الشبكة الفرعية الخاصة لنقطة النهاية في شبكتك الافتراضية، أنشئ نقطة نهاية خاصة لمورد أدوات Foundry الخاص بك.

    # Get Foundry Tools resource ID
    csResourceId=$(az cognitiveservices account show --resource-group $groupName --name $csResourceName --query id --output tsv)
    
    az network private-endpoint create --resource-group $groupName --name securecstext-pe --location $region --connection-name securecstext-pc --private-connection-resource-id $csResourceId --group-id account --vnet-name $vnetName --subnet private-endpoint-subnet
    
  2. أنشئ مجموعة منطقة DNS لنقطة النهاية الخاصة بأدوات Foundry. مجموعة منطقة DNS هي رابط بين منطقة DNS الخاصة ونقطة النهاية الخاصة. يساعدك هذا الرابط على تحديث منطقة DNS الخاصة تلقائيا عند حدوث تحديث لنقطة النهاية الخاصة.

    az network private-endpoint dns-zone-group create --resource-group $groupName --endpoint-name securecstext-pe --name securecstext-zg --private-dns-zone privatelink.cognitiveservices.azure.com --zone-name privatelink.cognitiveservices.azure.com
    
  3. حجب حركة المرور العامة إلى مورد أدوات Foundry.

    az rest --uri $csResourceId?api-version=2024-10-01 --method PATCH --body '{"properties":{"publicNetworkAccess":"Disabled"}}' --headers 'Content-Type=application/json'
    
    # Repeat the following command until the output is "Succeeded"
    az cognitiveservices account show --resource-group $groupName --name $csResourceName --query properties.provisioningState
    

    ‏‫ملاحظة‬

    تأكد من أن حالة التوفير لتغييرك هي "Succeeded". يمكنك بعد ذلك ملاحظة تغير السلوك في التطبيق النموذجي. لا يزال بإمكانك تحميل التطبيق، لكن إذا حاولت اختيار زر الاكتشاف ، تظهر HTTP 500 لك خطأ. فقد التطبيق اتصاله بمورد أدوات الصاهر من خلال الشبكات المشتركة.

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

    # Create a private endpoint for the key vault
    vaultResourceId=$(az keyvault show --name $vaultName --query id --output tsv)
    az network private-endpoint create --resource-group $groupName --name securekeyvault-pe --location $region --connection-name securekeyvault-pc --private-connection-resource-id $vaultResourceId --group-id vault --vnet-name $vnetName --subnet private-endpoint-subnet
    # Create a DNS zone group for the endpoint
    az network private-endpoint dns-zone-group create --resource-group $groupName --endpoint-name securekeyvault-pe --name securekeyvault-zg --private-dns-zone privatelink.vaultcore.azure.net --zone-name privatelink.vaultcore.azure.net
    # Block public traffic to the key vault
    az keyvault update --name $vaultName --default-action Deny
    
  5. أجبرك على إعادة استعادة إشارات خزنة المفاتيح فوريا في تطبيقك عن طريق إعادة ضبط إعدادات التطبيق. (لمزيد من المعلومات، انظر التناوب.)

    az webapp config appsettings set --resource-group $groupName --name $appName --settings CS_ACCOUNT_NAME="@Microsoft.KeyVault(SecretUri=$csResourceKVUri)" CS_ACCOUNT_KEY="@Microsoft.KeyVault(SecretUri=$csKeyKVUri)"
    

    ‏‫ملاحظة‬

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

نقطتا النهاية الخاصة متاحتان فقط للعملاء داخل الشبكة الافتراضية التي أنشأتها. لا يمكنك حتى الوصول إلى الأسرار في خزنة المفاتيح من صفحة الأسرار في بوابة Azure، لأن البوابة تصل إليها عبر الإنترنت العام. (انظر إدارة الموارد المغلقة.)

قم بتكوين تكامل الشبكة الافتراضية في تطبيقك

  1. قم بتوسيع التطبيق إلى مستوى تسعير مدعوم. (انظر دمج تطبيقك مع شبكة افتراضية لجهاز Azure.)

    az appservice plan update --name $planName --resource-group $groupName --sku S1
    
  2. تطبيق HTTPS للطلبات الواردة. (هذه الخطوة ليست مرتبطة بالسيناريو الحالي، لكنها مهمة.)

    az webapp update --resource-group $groupName --name $appName --https-only
    
  3. قم بتمكين تكامل الشبكة الظاهرية على تطبيقك.

    az webapp vnet-integration add --resource-group $groupName --name $appName --vnet $vnetName --subnet vnet-integration-subnet
    

    يسمح تكامل الشبكة الظاهرية لنسبة استخدام الشبكة الصادرة بالتدفق مباشرة إلى الشبكة الظاهرية. بشكل ظاهري، يتم توجيه حركة مرور IP المحلية المحددة في RFC-1918 فقط إلى الشبكة الظاهرية، وهو ما تحتاجه لنقاط النهاية الخاصة. للحصول على معلومات حول توجيه كل حركة المرور إلى الشبكة الافتراضية، راجع إدارة توجيه تكامل الشبكة الافتراضية. يمكنك أيضا توجيه كل حركة المرور إذا أردت توجيه حركة الإنترنت عبر شبكتك الافتراضية، مثل Azure NAT Gateway أو Azure Firewall.

  4. في المتصفح، اذهب وانتظر <app-name>.azurewebsites.net حتى يبدأ التكامل في المشاهد. إذا ظهرت لك رسالة خطأ في HTTP 500، انتظر بضع دقائق وحاول مرة أخرى. إذا تمكنت من تحميل الصفحة والحصول على نتائج الكشف، فأنت تتصل بنقطة نهاية أدوات Foundry باستخدام مراجع خزنة المفاتيح.

    ‏‫ملاحظة‬

    إذا استمريت في ظهور أخطاء HTTP 500 لفترة طويلة، قد يساعد إجبار مراجع خزنة المفاتيح على إعادة السحب مرة أخرى:

    az webapp config appsettings set --resource-group $groupName --name $appName --settings CS_ACCOUNT_NAME="@Microsoft.KeyVault(SecretUri=$csResourceKVUri)" CS_ACCOUNT_KEY="@Microsoft.KeyVault(SecretUri=$csKeyKVUri)"
    

إدارة الموارد المغلقة

اعتمادا على سيناريوهاتك النفسية، قد لا تتمكن من إدارة الموارد الخاصة المحمية بنقطة النهاية من خلال بوابة Azure، أو Azure CLI، أو Azure PowerShell (على سبيل المثال، Key Vault). كل هذه الأدوات تقوم باستدعاءات واجهة برمجة التطبيقات REST للوصول إلى الموارد عبر الإنترنت العام، وهي محجوبة بواسطة إعدادك. إليك بعض الخيارات للوصول إلى الموارد المغلقة:

  • بالنسبة ل Key Vault، أضف عنوان IP العام لجهازك المحلي لعرض أو تحديث الأسرار المحمية بنقاط النهاية الخاصة.
  • إذا تم تمديد شبكتك المحلية إلى شبكة Azure الافتراضية عبر بوابة VPN أو Azure ExpressRoute، يمكنك إدارة الموارد المحمية الخاصة بالنقطة النهائية مباشرة من شبكتك المحلية.
  • إدارة الموارد الخاصة المحمية بنقطة النهاية من خادم القفز في الشبكة الافتراضية.
  • نشر Cloud Shell في الشبكة الافتراضية.

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

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

az group delete --name $groupName

قد يستغرق تشغيل هذا الأمر دقيقة.

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