Tutorial: Create a secure N-tier app in "Azure App Service"

تحتوي العديد من التطبيقات على أكثر من مكون واحد. على سبيل المثال، قد يكون لديك واجهة أمامية متاحة للجمهور وتتصل بواجهة برمجة تطبيقات خلفية أو تطبيق ويب. قد تتصل الموارد الخلفية بقاعدة بيانات، أو حساب تخزين، أو خزنة مفاتيح، أو آلة افتراضية أخرى، أو مزيج من هذه الموارد. هذه البنية هي أساس تطبيق من الفئة N. من المهم أن تكون تطبيقات مثل هذه مصممة لحماية الموارد الخلفية إلى أقصى حد ممكن.

يشرح هذا الدرس كيفية نشر تطبيق آمن من المستوى N مع تطبيق ويب واجهة أمامية يتصل بتطبيق ويب آخر معزول في الشبكة. يتم عزل جميع حركة المرور داخل الشبكة الافتراضية في Azure الخاص بك باستخدام Virtual Network ودمج وprivate endpoints. للحصول على إرشادات أكثر شمولا تتضمن سيناريوهات أخرى، راجع:

في هذا البرنامج التعليمي، سوف تتعلّم:

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

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

يستخدم الدرس تطبيقين Node.js نموذجيين مستضافين على GitHub. إذا لم يكن لديك حساب GitHub بالفعل، فبادر بإنشاء حساب مجانا.

إذا لم يكن لديك حساب Azure، فأنشئ حساباً مجانياً قبل أن تبدأ.

لإكمال هذا البرنامج التعليمي:

راجع بنية السيناريو

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

مخطط لبنية خدمة التطبيقات من المستوى N، بما في ذلك تكامل الشبكة الافتراضية مع تطبيق واجهة أمامية ونقطة نهاية خاصة في الخلفية.

  • تحتوي البنية على شبكة افتراضية تحتوي على شبكتين فرعيتين. شبكة فرعية واحدة مدمجة مع تطبيق الويب الأمامي، والشبكة الفرعية الأخرى تحتوي على نقطة نهاية خاصة لتطبيق الويب الخلفي. تحظر الشبكة الافتراضية جميع حركة المرور الواردة على الشبكة، باستثناء الحركة التي تستهدف تطبيق الواجهة الأمامية المدمجة.

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

  • يمكن الوصول إلى تطبيق الويب الخلفي فقط من خلال نقطة النهاية الخاصة في الشبكة الافتراضية.

  • تتكامل نقطة النهاية الخاصة مع تطبيق الويب الخلفي وتجعل التطبيق متاحا عبر عنوان IP خاص.

  • يتيح Private DNS zone حل اسم DNS إلى عنوان IP الخاص لنقطة الطرف.

إشعار

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

السيناريو في هذا الدرس يوفر السلوك التالي:

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

أنشئ تطبيقي الويب

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

  1. أنشئ مجموعة موارد لإدارة جميع الموارد لهذا الدرس.

    حدد الاسم <resource-group> البديل لمجموعة الموارد الجديدة، مثل zava-resources. حدد العنصر <region-location> المؤقت للمنطقة الخاصة بمجموعة الموارد الجديدة الخاصة بك، مثل eastus.

    # Define variables for the resource group name and region location
    resourceGroupName=<resource-group>
    regionLocation=<region-location>
    
    # Create the resource group
    az group create --name $resourceGroupName --location $regionLocation
    

    لمزيد من المعلومات، راجع مرجع إنشاء أوامر من مجموعة az .

  2. أنشئ خطة خدمة تطبيقات لمواردك.

    حدد الاسم <app-service-plan> المؤقت لخطة App Service الجديدة الخاصة بك، مثل zava-app-service-plan.

    مثال الدرس يضبط المعامل --sku إلى P1V3 (Premium V3). يمكنك استخدام هذه القيمة أو تحديد وحدة تخزين مختلفة. يجب أن يدعم وحدة التخزين ميزات الشبكة المطلوبة لهذا الدرس. اختر المستوى الأساسي أو أعلى.

    # Define a variable for the App Service plan name
    appServicePlanName=<app-service-plan>
    
    # Create the App Service plan
    az appservice plan create --name $appServicePlanName --resource-group $resourceGroupName --is-linux --location $regionLocation --sku P1V3
    

    لمزيد من المعلومات، راجع خطة إنشاء أوامر في az appservice .

  3. أنشئ تطبيقات الويب في الواجهة الأمامية والخلفية.

    مثال الدرس ينشئ تطبيقين Node.js نموذجيين، حيث يكون إصدار لغة التشغيل هو NODE:24-lts. إذا كنت تفضل استخدام تطبيقاتك الخاصة، اضبط --runtime قيمة المعلمة <language-version> وفقا لذلك. يمكنك تشغيل az webapp list-runtimes الأمر لقائمة أوقات التشغيل المتاحة:

    az webapp list-runtimes
    

    قم بتعيين <frontend-app-name> الاسم المؤقت لتطبيق الويب الجديد الخاص بك في الواجهة الأمامية، مثل zava-frontend-app. يجب أن يكون الاسم فريدا عالميا ويتكون من أحرف صالحة (a-z, 0-9, -). وبالمثل، قم بتعيين الاسم <backend-app-name> المؤقت لتطبيق الويب الجديد الخاص بك في الخلفية، مثل zava-backend-app.

    # Define variables for the App Service web app names
    frontendAppName=<frontend-app-name>
    backendAppName=<backend-app-name>
    
    # Create the web apps
    az webapp create --name $frontendAppName --resource-group $resourceGroupName --plan $appServicePlanName --runtime "NODE:24-lts"
    az webapp create --name $backendAppName  --resource-group $resourceGroupName --plan $appServicePlanName --runtime "NODE:24-lts"
    

    لمزيد من المعلومات، راجع مرجع إنشاء أوامر على الويب في az .

إنشاء البنية التحتية للشبكة

تتكون البنية التحتية للشبكة الافتراضية من الموارد التالية:

  • مثيل الشبكة الافتراضية في Azure
  • شبكة فرعية لتكامل الشبكة الافتراضية في خدمة التطبيقات
  • شبكة فرعية أخرى لنقطة النهاية الخاصة
  • منطقة Azure Private DNS
  • نقطة نهاية خاصة
  1. إنشاء شبكة Azure ظاهرية.

    حدد الاسم <virtual-network-name> المؤقت لشبكتك الافتراضية الجديدة، مثل zava-virtual-network. يجب أن يكون الاسم فريدًا عالميًا.

    # Define a variable for the virtual network name
    virtualNetworkName=<virtual-network-name>
    
    # Create the virtual network
    az network vnet create --resource-group $resourceGroupName --location $regionLocation --name $virtualNetworkName --address-prefixes 10.0.0.0/16
    

    لمزيد من المعلومات، راجع مرجع أوامر إنشاء شبكة az vnet .

  2. أنشئ شبكة فرعية لتكامل الشبكة الافتراضية في خدمة التطبيقات.

    قم بتعيين الاسم <network-integration-subnet> المؤقت لشبكتك الفرعية الجديدة التي تدعم تكامل الشبكة الافتراضية، مثل zava-integration-subnet.

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

    # Define a variable for the integration subnet name
    networkIntegrationSubnet=<network-integration-subnet>
    
    # Create the subnet for virtual network integration
    az network vnet subnet create --resource-group $resourceGroupName --vnet-name $virtualNetworkName --name $networkIntegrationSubnet \
       --address-prefixes 10.0.0.0/24 --delegations Microsoft.Web/serverfarms \
       --disable-private-endpoint-network-policies false
    

    لمزيد من المعلومات، راجع مرجع أوامر إنشاء شبكة z.

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

    قم بتعيين الاسم <private-endpoint-subnet> المؤقت لاسم الشبكة الفرعية الجديدة التي تدعم نقطة النهاية الخاصة، مثل zava-endpoint-subnet.

    # Define a variable for the private endpoint subnet name
    privateEndpointSubnet=<private-endpoint-subnet>
    
    # Create the subnet for the private endpoint
    az network vnet subnet create --resource-group $resourceGroupName --vnet-name $virtualNetworkName --name $privateEndpointSubnet \
       --address-prefixes 10.0.1.0/24 \
       --disable-private-endpoint-network-policies true
    

    بالنسبة لشبكات النقاط النهائية الخاصة، يجب تعطيل سياسات شبكة النقاط النهائية الخاصة عن طريق تعيين العلم --disable-private-endpoint-network-policies على true. لمزيد من المعلومات، راجع المعلمات الاختيارية لأمر إنشاء شبكة vnet الفرعية في az .

    إشعار

    قد يحل العلم --private-endpoint-network-policies محل العلم --disable-private-endpoint-network-policies قريبا.

  4. إنشاء منطقة Azure Private DNS.

    اضبط <private-zone-name> المؤقت ليصبح اسم منطقة Private DNS الجديدة الخاصة بك، مثل zava-private.azurewebsites.net.

    # Define a variable for the Private DNS zone
    privateDNSZone=<private-zone-name>
    
    # Create the Private DNS zone
    az network private-dns zone create --resource-group $resourceGroupName --name $privateDNSZone
    

    لمزيد من المعلومات، راجع مرجع أوامر إنشاء شبكة z. لمزيد من المعلومات حول تكوين منطقة Private DNS، راجع Azure service DNS zone configuration.

    إشعار

    إذا أنشأت نقطة النهاية الخاصة في بوابة Azure، يتم إنشاء منطقة Azure Private DNS لتكوينك تلقائيا. لتحقيق الاتساق الإجرائي في هذا الدرس، تقوم بإنشاء منطقة Private DNS ونقطة النهاية الخاصة بشكل منفصل باستخدام Azure CLI.

  5. اربط منطقة Private DNS بالشبكة الافتراضية.

    حدد الاسم <dns-link-name> المؤقت لرابط DNS الجديد الخاص بك، مثل zava-private-link.

    # Define a variable for the DNS link name
    dnsLinkName=<dns-link-name>
    
    # Create the link between the Private DNS zone and the virtual network
    az network private-dns link vnet create --resource-group $resourceGroupName --name $dnsLinkName --zone-name $privateDNSZone \
       --virtual-network $virtualNetworkName --registration-enabled False
    

    لمزيد من المعلومات، راجع مرجع أوامر private-dns network az link vnet create command.

  6. في شبكة النهاية الخاصة لشبكتك الافتراضية، أنشئ نقطة نهاية خاصة لتطبيق الويب الخلفي الخاص بك.

    قم بتعيين العنصر <private-endpoint-name> المؤقت لاسم نقطة النهاية الخاصة الجديدة لتطبيق الويب الخلفي الخاص بك، مثل zava-backend-endpoint. قم بتعيين المفتاح <service-connection-name> المؤقت لاسم الاتصال الجديد للخدمة، مثل zava-backend-connection.

    # Define variables for the private endpoint and service connection
    privateEndpointName=<private-endpoint-name>
    serviceConnectionName=<service-connection-name>
    
    # Get the resource ID of the backend web app
    resourceId=$(az webapp show --resource-group $resourceGroupName --name $backendAppName --query id --output tsv)
    
    # Create the private endpoint for the backend web app by using the resource ID
    az network private-endpoint create --resource-group $resourceGroupName --name $privateEndpointName --location $regionLocation \
       --connection-name $serviceConnectionName --private-connection-resource-id $resourceId \
       --group-id sites --vnet-name $virtualNetworkName --subnet $privateEndpointSubnet
    

    لمزيد من المعلومات، راجع مرجع أوامر إنشاء إنشاء خاص في شبكة az .

  7. اربط نقطة النهاية الخاصة بمنطقة Private DNS مع مجموعة DNS Zone لتطبيق الويب الخلفي الخاص بنقطة الطرف.

    قم بتعيين الاسم <dns-zone-group-name> المؤقت لمجموعة DNS Zone الجديدة، مثل zava-dns-zone-group. تساعد مجموعة منطقة DNS في التحديث التلقائي لمنطقة Private DNS عند تحديث نقطة النهاية الخاصة.

    # Define a variable for the DNS Zone group
    dnsZoneGroupName=<dns-zone-group-name>
    
    # Link the private endpoint to the Private DNS      
    az network private-endpoint dns-zone-group create --resource-group $resourceGroupName --endpoint-name $privateEndpointName \
       --name $dnsZoneGroupName --private-dns-zone $privateDNSZone --zone-name $privateDNSZone
    

    لمزيد من المعلومات، راجع مرجع أوامر إنشاء dns-zone-group الخاص بشبكة az .

  8. تأكد من رفض الوصول المباشر إلى نقطة النهاية الخاصة بك.

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

    في المتصفح، أدخل عنوان URL الافتراضي لتطبيق الويب الخلفي الخاص بك، مثل <backend-app-name>.azurewebsites.net.

    تشير رسالة المتصفح إلى رفض الوصول المباشر:

    لقطة شاشة لرسالة المتصفح عندما يحظر الوصول المباشر إلى التطبيق الخلفي.

    لمزيد من المعلومات حول قيود الوصول إلى App Service مع نقاط النهاية الخاصة، راجع قيود الوصول إلى "Azure App Service".

تكوين تكامل virtual network

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

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

az webapp vnet-integration add --resource-group $resourceGroupName --name $frontendAppName --vnet $virtualNetworkName --subnet $networkIntegrationSubnet

لمزيد من المعلومات، راجع مرجع أوامر إضافة vnet-integration في az webapp .

لتوجيه جميع حركة المرور إلى الشبكة الافتراضية، انظر إدارة توجيه تكامل الشبكة الافتراضية. يمكن أيضا استخدام توجيه جميع حركة المرور إذا كنت ترغب في توجيه حركة الإنترنت عبر شبكتك الافتراضية، مثل الشبكة الافتراضية في Azure NAT أو Azure Firewall.

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

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

  1. تمكين الوصول العام لتطبيق الويب الخلفي.

    az webapp update --resource-group $resourceGroupName --name $backendAppName --set publicNetworkAccess=Enabled
    
  2. قم بتعيين إجراء القاعدة غير المتطابقة لتطبيق الويب الرئيسي لرفض كل حركة المرور.

    يرفض هذا الإعداد الوصول العام إلى تطبيق الويب الرئيسي على الرغم من تعيين إعداد الوصول العام للتطبيق للسماح بالوصول العام.

    az resource update --resource-group $resourceGroupName --name $backendAppName --namespace Microsoft.Web \
       --resource-type sites --set properties.siteConfig.ipSecurityRestrictionsDefaultAction=Deny
    
  3. تعيين إجراء القاعدة غير المتطابقة لموقع SCM للسماح بكافة نسبة استخدام الشبكة.

    az resource update --resource-group $resourceGroupName --name $backendAppName --namespace Microsoft.Web \
       --resource-type sites --set properties.siteConfig.scmIpSecurityRestrictionsDefaultAction=Allow
    

تقييد الوصول إلى FTP وSCM

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

  1. تعطيل الوصول إلى FTP لكل من تطبيق الويب الأمامي والخلفية:

    az resource update --resource-group $resourceGroupName --name ftp --namespace Microsoft.Web \
       --resource-type basicPublishingCredentialsPolicies --parent sites/<frontend-app-name> --set properties.allow=false
    
    az resource update --resource-group $resourceGroupName --name ftp --namespace Microsoft.Web \
       --resource-type basicPublishingCredentialsPolicies --parent sites/<backend-app-name> --set properties.allow=false
    
  2. تعطيل الوصول الأساسي للمصادقة إلى منافذ WebDeploy ومواقع SCM/الأدوات المتقدمة لكلا التطبيقين:

    az resource update --resource-group $resourceGroupName --name scm --namespace Microsoft.Web \
       --resource-type basicPublishingCredentialsPolicies --parent sites/<frontend-app-name> --set properties.allow=false
    
    az resource update --resource-group $resourceGroupName --name scm --namespace Microsoft.Web \
       --resource-type basicPublishingCredentialsPolicies --parent sites/<backend-app-name> --set properties.allow=false
    

عند تعطيل المصادقة الأساسية على خدمة التطبيقات، فإنك تحد من الوصول إلى نقاط نهاية FTP وSCM للمستخدمين المسجلين في Microsoft Entra ID. هذا الإجراء يؤمن تطبيقاتك بشكل أكبر. لمزيد من المعلومات حول تعطيل المصادقة الأساسية بما في ذلك كيفية اختبار ومراقبة تسجيل الدخول، راجع تعطيل المصادقة الأساسية على خدمة التطبيقات.

تكوين النشر المستمر باستخدام GitHub Actions

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

احصل على تطبيقات الويب لاختبار النشر

مستودعات Azure Samples على GitHub توفر تطبيقات Node.js عينات للنشر.

  1. في المتصفح، اذهب إلى تطبيق Node.js Backend النموذجي.

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

  2. كرر نفس العملية مع نموذج Node.js تطبيق الواجهة الأمامية.

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

تكوين مبدأ الخدمة

تحتاج إلى مدير خدمة لتطبيق الويب الأمامي وتطبيق الويب الخلفي.

  1. إنشاء كيان الخدمة.

    حدد الاسم <service-principal-name> المؤقت لاسم مدير الخدمة الجديد، مثل zava-service-principal.

    استبدل قيم المعلمات الأخرى <placeholder> بمعلومات الموارد الخاصة بك.

    # Define a variable for the service principal name
    servicePrincipalName=<service-principal-name>
    
    # Link the private endpoint to the Private DNS 
    
     az ad sp create-for-rbac --name <service-principal-name> --role contributor --scopes \
       /subscriptions/<subscription-ID>/resourceGroups/<resource-group>/providers/Microsoft.Web/sites/<frontend-app-name> \
       /subscriptions/<subscription-ID>/resourceGroups/<resource-group>/providers/Microsoft.Web/sites/<backend-app-name>
    

    الإخراج هو كائن JSON مع بيانات اعتماد تعيين الدور التي توفر الوصول إلى تطبيقات App Service.

    {
      "appId": "00001111-aaaa-2222-bbbb-3333cccc4444",
      "displayName": "<service-principal-name>",
      "password": "0Aa!1Bb!2Cc!3Dd!4Ee!5Ff!6Gg!7Hh!8Ii!9Jj!",
      "tenantId": "aaaabbbb-6666-cccc-7777-dddd8888eeee"
    }
    

    يتضمن ملف JSON كلمة المرور الرئيسية للخدمة الخاصة بك، والتي تظهر فقط في الوقت الحالي.

    نصيحة

    من الممارسات الجيدة منح الحد الأدنى من الوصول. في هذا المثال، النطاق محدود بالتطبيقات فقط، وليس على مجموعة الموارد بأكملها.

  2. انسخ كائن JSON ليكون لديك سجل لاسم الشركة الرئيسية في خدمتك.

  3. قدم بيانات اعتماد المديرين لخدمتك لعملية تسجيل الدخول Azure كجزء من سير عمل GitHub Action الخاص بك.

    قم بتخزين بيانات الاعتماد كأسرار في GitHub يتم الإشارة إليها في سير عملك.

    1. في المتصفح، اذهب إلى المستودع المقسم لتطبيق Node.js الخلفية على GitHub.

    2. اذهب إلى الإعدادات>: أسرار الأمان> والمتغيرات >والإجراءات اللازمة.

    3. اختر سر مستودع جديد وأنشئ سريا لكل من الإعدادات التالية.

      استخدم القيم من مخرجات JSON الخاصة بك.

      الإعداد القيمة‬ مثال
      AZURE_CLIENT_ID <application/client-id> 00001111-aaaa-2222-bbbb-3333cccc4444
      AZURE_TENANT_ID <tenant-id> aaaabbbb-6666-cccc-7777-dddd8888eeee
      AZURE_SUBSCRIPTION_ID <subscription-id> cccc2c2c-dd3d-ee4e-ff5f-aaaaaa6a6a6a
    4. كرر هذه العملية للمستودع المقسم لتطبيق Node.js الواجهة الأمامية على GitHub.

إعداد النشر المستمر باستخدام GitHub Actions

يمكنك إعداد النشر المستمر باستخدام GitHub Actions.

  1. في بوابة Azure، توجه إلى صفحة نظرة عامة الخاصة بتطبيق الويب الخاص بك في الواجهة الأمامية.

  2. في القائمة اليسرى، اختر مركز نشر النشر>.

  3. في تبويب Settings، قم بتعيين خيار Source على GitHub:

    لقطة شاشة توضح كيفية اختيار مصدر النشر لتطبيق الويب الأمامي في بوابة Azure.

  4. إذا كنت تقوم بالتوزيع من GitHub للمرة الأولى، فحدد تخويل واتبع مطالبات التفويض. إذا كنت تريد التوزيع من مستودع مستخدم مختلف، فحدد تغيير الحساب.

  5. بعد تفويض حسابك Azure باستخدام GitHub، اختر Organization، Repository، و Branch لتكوين CI/CD لها. إذا لم تتمكن من العثور على منظمة أو مستودع، قد تحتاج إلى تفعيل المزيد من الأذونات على GitHub. لمزيد من المعلومات، راجع إدارة وصول المستخدمين إلى مستودعات مؤسستك.

    الإعداد القيمة‬
    منظمة <your-GitHub-organization>
    المستودع <forked-repository-name>
    الفرع أساسي
  6. حدد حفظ.

  7. كرر هذه العملية لتطبيق الويب الخلفي الخاص بك والمستودع المفرع المقابل.

التحقق من الاتصالات والوصول إلى التطبيقات

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

  1. حاول التصفح مباشرة إلى تطبيق الويب الخلفي الخاص بك مع عنوانه المناسب، https://<backend-app-name>.azurewebsites.net.

    يجب أن ترى رسالة المتصفح التالية:

    لقطة شاشة لرسالة المتصفح عندما يحظر الوصول المباشر إلى التطبيق الخلفي.

    إذا استطعت الوصول إلى التطبيق، تحقق من إعدادك:

    • تأكد من أن نقطة النهاية الخاصة مضبوطة بشكل صحيح.

    • تأكد من أن قيود الوصول لتطبيقك مضبوطة على رفض كل حركة المرور لتطبيق الويب الرئيسي.

  2. الآن جرب تصفح التطبيق المباشر على الويب الخاص بك مع رابط الرابط الخاص به. https://<frontend-app-name>.azurewebsites.net

    عندما ينجح الاتصال، ترى الصفحة التالية:

    لقطة شاشة لاتصال ناجح بتطبيق الواجهة الأمامية يعمل في المتصفح.

  3. في مربع العنوان، أدخل رابط تطبيق الويب الخلفي الخاص بك، https://<backend-app-name>.azurewebsites.net، واختر الجلب.

    إذا قمت بإعداد الاتصالات بشكل صحيح، يتم تحديث الصفحة لعرض محتوى الرسائل من تطبيق الويب الخلفي:

    لقطة شاشة لمحتوى المتصفح بعد محاولة تطبيق الواجهة الأمامية الوصول إلى التطبيق الخلفي.

    جميع حركة المرور الصادرة من تطبيق الويب الأمامي تمر عبر الشبكة الافتراضية. يتصل تطبيق الويب الأمامي بشكل آمن بتطبيق الويب الخلفي من خلال نقطة النهاية الخاصة.

    إذا كان هناك خطأ في اتصالاتك، سترى رسالة الخطأ 403 - المحظور في المخرج.

إنشاء جلسة SSH وفتح غلاف عن بعد

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

  1. أنشئ جلسة SSH إلى حاوية الويب في تطبيقك وافتح shell عن بعد في متصفحك:

    az webapp ssh --resource-group $resourceGroupName --name $frontendAppName
    

    لمزيد من المعلومات، راجع مرجع أوامر ssh في az webapp .

  2. بعد فتح الشل في متصفحك، تأكد من أن تطبيق الويب الخلفي الخاص بك يتم الوصول إليه باستخدام عنوان IP الخاص بتطبيق الويب الخلفي.

    في الأوامر التالية، استبدل <placeholder> قيم المعلمات بمعلومات موردك الخاص.

    1. شغل الأمر nslookup :

      nslookup <backend-app-name>.azurewebsites.net
      
    2. شغل curl الأمر للتحقق من محتوى الموقع مرة أخرى:

      curl https://<backend-app-name>.azurewebsites.net
      

    لقطة شاشة لجلسة SSH إلى مثيل واجهة أمامية توضح كيفية التحقق من اتصالات التطبيقات بالخلفية.

    يجب أن nslookup يحل الأمر إلى عنوان IP الخاص بتطبيق الويب الخلفي الخاص بك. يجب أن يكون عنوان IP الخاص عنوانا من شبكتك الظاهرية.

    يمكنك تأكيد عنوان IP الخاص بك من خلال بوابة Azure. اذهب إلى صفحة إعدادات>شبكة التطبيقات الخلفية الخاصة بك.

    لقطة شاشة تظهر صفحة الشبكات لتطبيق ويب في بوابة Azure مع تمييز عنوان IP وارد.

  3. كرر نفس nslookup الشيء والأوامر curl من طرفية أخرى (واحدة ليست جلسة SSH على مثيلات الواجهة الأمامية لديك).

    لقطة شاشة لطرفية خارجية تشغل أوامر nslookup وcurl لتطبيق الويب الخلفي تظهر أن الوصول ممنوع.

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

    nslookup الأمر لا يحل إلى عنوان IP الخاص لأن العنوان قابل للحل فقط من داخل الشبكة الافتراضية عبر منطقة DNS الخاصة. فقط تطبيق الويب الأمامي موجود داخل الشبكة الافتراضية. إذا حاولت تشغيل curl الأمر على تطبيق الويب الخلفي من الطرفية الخارجية، فإن ملف HTML المرتجع يحتوي على رسالة الخطأ 403: ممنوع - التطبيق الذي حاولت الوصول إليه قد حظر وصولك. بعض الأجهزة تعرض نفس HTML كما تظهر صفحة الخطأ عند محاولة الوصول المباشر إلى تطبيق الويب الخلفي.

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

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

استبدل قيمة المعلمة <placeholder> بمعلومات مصدرك الخاص:

az group delete --name <resource-group>

قد يستغرق تنفيذ هذا الأمر عدة دقائق.

الأسئلة الشائعة

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

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

النشر باستخدام طرق أخرى غير القاعدة الرئيسية للخدمة

في هذا الدرس، قمت بتعطيل المصادقة الأساسية. لا يمكنك المصادقة مع موقع SCM الخلفي باستخدام اسم مستخدم وكلمة مرور، أو باستخدام ملف تعريف للنشر. ومع ذلك، بدلا من المصادقة باستخدام مبدأ الخدمة، يمكنك استخدام بيانات اعتماد OpenID Connect .

تكوين نشر GitHub Actions في App Service

يقوم Azure بإنشاء ملف سير عمل تلقائيا في مستودعك. الالتزامات الجديدة في المستودع والفرع المحدد تنشر باستمرار في تطبيق خدمة التطبيقات الخاص بك. يمكنك تتبع الالتزامات والنشر في تبويب Logs في GitHub.

تتم إضافة ملف سير عمل افتراضي يستخدم ملف تعريف نشر للمصادقة على App Service إلى مستودع GitHub الخاص بك. يمكنك عرض هذا الملف بالانتقال إلى <repo-name>/.github/workflows/ الدليل.

تأكد من الوصول الآمن للجمهور إلى موقع SCM الخلفي

عندما تقوم بقفل الوصول إلى FTP وSCM، يمكنك التأكد من أن المبادئ المدعومة Microsoft Entra فقط هي التي يمكنها الوصول إلى نقطة نهاية SCM، حتى لو كانت النقطة متاحة للجمهور. يساعدك هذا الإعداد على طمأنتك بأن تطبيق الويب الخلفي لا يزال آمنا.

نشر بدون موقع SCM مفتوح في الواجهة الخلفية

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

نشر هذه البنية المعمارية باستخدام قالب

يمكن نشر الموارد التي أنشأتها في هذا الدرس باستخدام قالب Azure Resource Manager (قالب ARM) أو قالب Bicep. application المتصل بملف Bicep تطبيق ويب خلفي يسمح لك بإنشاء حل تطبيق آمن من المستوى N.

لتعلم كيفية نشر قوالب ARM و Bicep، راجع نشر ملفات Bicep باستخدام Azure CLI.