تكوين TLS من نهاية إلى نهاية عن طريق Application Gateway مع PowerShell

نظرة عامة

يدعم Azure Application Gateway التشفير في نسبة استخدام الشبكة من نهاية إلى نهاية. إنهاء Application Gateway اتصال TLS/SSL في بوابة التطبيق ثم تطبق البوابة قواعد التوجيه على حركة المرور، وتعيد تشفير الحزمة، وتعيد توجيه الحزمة إلى خادم الواجهة الخلفية المناسب استنادا إلى قواعد التوجيه المعرفة. تمر أي استجابة من خادم الويب بنفس العملية إلى المستخدم النهائي.

يدعم Application Gateway تعريف خيارات TLS المخصصة. كما يدعم تعطيل إصدارات البروتوكول التالية: TLSv1.0وTLSv1.1وTLSv1.2، بالإضافة إلى تحديد مجموعات التشفير التي يجب استخدامها وترتيب التفضيل. لمعرفة المزيد حول خيارات TLS القابلة للتكوين، راجع نظرة عامة حول نهج TLS.

إشعار

SSL 2.0 وSSL 3.0 معطلة بشكل افتراضي ولا يمكن تمكينها. تعتبر غير آمنة ولا يمكن استخدامها مع Application Gateway

scenario image

السيناريو

في هذا السيناريو، تتعلم كيفية إنشاء تطبيق بوابة باستخدام TLS نهاية إلى نهاية مع PowerShell.

هذا السيناريو سوف:

  • أنشئ مجموعة موارد باسم appgw-rg.
  • إنشاء شبكة اتصال ظاهرية تسمى appgwvnet مع مساحة عنوان 10.0.0.0/16.
  • إنشاء اثنين من الشبكات الفرعية تسمى appgwsubnetوappsubnet.
  • إنشاء عبارة تطبيق صغيرة تدعم تشفير TLS من طرف إلى طرف الذي يحد من إصدارات بروتوكول TLS وأجنحة التشفير.

قبل البدء

إشعار

نوصي باستخدام الوحدة النمطية Azure Az PowerShell للتفاعل مع Azure. راجع تثبيت Azure PowerShell للبدء. لمعرفة كيفية الترحيل إلى الوحدة النمطية Az PowerShell، راجع ترحيل Azure PowerShell من AzureRM إلى Az.

لتكوين TLS من طرف إلى طرف باستخدام بوابة تطبيق، مطلوب شهادة للبوابة والشهادات مطلوبة للخوادم الخلفية. يتم استخدام شهادة البوابة لاشتقاق مفتاح متماثل وفقا لمواصفات بروتوكول TLS. يُستخدم المفتاح المتماثل لتشفير وفك تشفير نسبة استخدام الشبكة المُرسَل إلى البوابة. من الضروري أن تكون شهادة بوابة في صيغة تبادل المعلومات الشخصية (PFX). يسمح لك تنسيق الملف هذا بتصدير المفتاح الخاص المطلوب من قبل تطبيق بوابة لتنفيذ تشفير وفك تشفير نسبة استخدام الشبكة.

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

يتم وصف عملية التكوين في المقاطع التالية.

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

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

  1. سجّل الدخول إلى حساب Azure.

    Connect-AzAccount
    
  2. الاشتراك: اختر الاشتراك الذي ستستخدمه في المركز الخاص بك.

    Select-Azsubscription -SubscriptionName "<Subscription name>"
    
  3. قم بإنشاء مجموعة موارد. (تخطي هذه الخطوة إذا كنت تستخدم مجموعة موارد موجودة).

    New-AzResourceGroup -Name appgw-rg -Location "West US"
    

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

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

  1. تعيين نطاق عنوان الشبكة الفرعية لاستخدامها لبوابة التطبيق.

    $gwSubnet = New-AzVirtualNetworkSubnetConfig -Name 'appgwsubnet' -AddressPrefix 10.0.0.0/24
    

    إشعار

    يجب أن يكون حجم الشبكات الفرعية المكونة لبوابة تطبيق بشكل صحيح. يمكن تكوين بوابة تطبيق لـ10 مثيلات. يأخذ كل مثيل عنوان IP واحدًا من الشبكة الفرعية. يمكن أن يُحدث تأثيرًا صغيرًا جدًا من شبكة فرعية بشكل سلبي على توسيع نطاق بوابة تطبيق.

  2. تعيين نطاق عنوان لاستخدامه في تجمع عناوين الواجهة الخلفية.

    $nicSubnet = New-AzVirtualNetworkSubnetConfig  -Name 'appsubnet' -AddressPrefix 10.0.2.0/24
    
  3. إنشاء شبكة اتصال ظاهرية مع الشبكات الفرعية المعرفة في الخطوات السابقة.

    $vnet = New-AzvirtualNetwork -Name 'appgwvnet' -ResourceGroupName appgw-rg -Location "West US" -AddressPrefix 10.0.0.0/16 -Subnet $gwSubnet, $nicSubnet
    
  4. استرداد موارد شبكة الاتصال الظاهرية وموارد الشبكة الفرعية لاستخدامها في الخطوات التالية.

    $vnet = Get-AzvirtualNetwork -Name 'appgwvnet' -ResourceGroupName appgw-rg
    $gwSubnet = Get-AzVirtualNetworkSubnetConfig -Name 'appgwsubnet' -VirtualNetwork $vnet
    $nicSubnet = Get-AzVirtualNetworkSubnetConfig -Name 'appsubnet' -VirtualNetwork $vnet
    

إنشاء عنوان IP عام لتكوين الواجهة الأمامية

إنشاء مورد IP عام لاستخدامه في بوابة التطبيق. يتم استخدام عنوان IP العام هذا في إحدى الخطوات التالية.

$publicip = New-AzPublicIpAddress -ResourceGroupName appgw-rg -Name 'publicIP01' -Location "West US" -AllocationMethod Dynamic

هام

لا تدعم بوابة التطبيق استخدام عنوان IP عام تم إنشاؤه باستخدام تسمية مجال محددة. يتم دعم عنوان IP عام مع تسمية مجال تم إنشاؤها ديناميكيًا فقط. إذا كنت تحتاج إلى اسم DNS مألوف لبوابة التطبيق، نوصي باستخدام سجل CNAME كاسم مستعار.

إنشاء عنصر تكوين بوابة التطبيق

يتم تعيين كافة عناصر التكوين قبل إنشاء بوابة التطبيق. تؤدي الخطوات التالية إلى إنشاء عناصر التكوين المطلوبة لمورد بوابة تطبيق.

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

    $gipconfig = New-AzApplicationGatewayIPConfiguration -Name 'gwconfig' -Subnet $gwSubnet
    
  2. إنشاء تكوين IP للواجهة الأمامية. يعين هذا الإعداد عنوان IP خاصًا أو عامًا إلى الواجهة الأمامية لبوابة التطبيق. تربط الخطوة التالية عنوان IP العام في الخطوة السابقة بتكوين IP للواجهة الأمامية.

    $fipconfig = New-AzApplicationGatewayFrontendIPConfig -Name 'fip01' -PublicIPAddress $publicip
    
  3. تكوين تجمع عناوين IP الخلفية مع عناوين IP لخوادم الويب الخلفية. عناوين IP هذه هي عناوين IP التي تتلقى نسبة استخدام الشبكة التي تأتي من نقطة نهاية IP الأمامية. استبدل عناوين IP في العينة بنقاط نهاية عنوان IP للتطبيق الخاص بك.

    $pool = New-AzApplicationGatewayBackendAddressPool -Name 'pool01' -BackendIPAddresses 1.1.1.1, 2.2.2.2, 3.3.3.3
    

    إشعار

    اسم المجال المؤهل بالكامل (FQDN) هو أيضا قيمة صالحة لاستخدامها بدلا من عنوان IP للخوادم الخلفية. يمكنك تمكينه باستخدام -BackendFqdns التبديل.

  4. تكوين منفذ IP للواجهة الأمامية لنقطة نهاية IP العامة. هذا المنفذ هو المنفذ الذي يتصل به المستخدمون النهائيون.

    $fp = New-AzApplicationGatewayFrontendPort -Name 'port01'  -Port 443
    
  5. تكوين الشهادة لبوابة التطبيق. يتم استخدام هذه الشهادة لفك تشفير وإعادة تشفير نسبة استخدام الشبكة على بوابة التطبيق.

    $passwd = ConvertTo-SecureString  <certificate file password> -AsPlainText -Force 
    $cert = New-AzApplicationGatewaySSLCertificate -Name cert01 -CertificateFile <full path to .pfx file> -Password $passwd 
    

    إشعار

    تكون هذه العينة الشهادة المستخدمة للاتصال TLS. يجب أن تكون الشهادة بتنسيق .pfx.

  6. إنشاء وحدة الاستماع HTTP لبوابة التطبيق. قم بتعيين تكوين IP للواجهة الأمامية والمنفذ وشهادة TLS/SSL لاستخدامها.

    $listener = New-AzApplicationGatewayHttpListener -Name listener01 -Protocol Https -FrontendIPConfiguration $fipconfig -FrontendPort $fp -SSLCertificate $cert
    
  7. قم بتحميل الشهادة لاستخدامها على موارد تجمع الواجهة الخلفية التي تدعم TLS.

    إشعار

    يحصل الفحص الافتراضي على المفتاح العام من ربط TLS الافتراضي على عنوان IP للواجهة الخلفية ويقارن قيمة المفتاح العام التي يتلقاها بقيمة المفتاح العام التي تقدمها هنا.

    إذا كنت تستخدم عناوين المضيف وإشارة اسم الخادم (SNI) في النهاية الخلفية، فقد لا يكون المفتاح العام الذي تم استرداده هو الموقع المقصود الذي تتدفق إليه نسبة استخدام الشبكة. إذا كنت في شك، تفضل بزيارة https://127.0.0.1/ الخوادم الخلفية لتأكيد الشهادة المستخدمة لربط TLS الافتراضي . استخدم المفتاح العام من هذا الطلب في هذا القسم. إذا كنت تستخدم عناوين المضيف وSNI على روابط HTTPS ولم تتلق استجابة وشهادة من طلب مستعرض يدوي إلى https://127.0.0.1/ على خوادم الواجهة الخلفية، يجب إعداد ربط TLS افتراضي عليها. إذا لم تقم بذلك، تفشل الفحوصات ولا يسمح بالنهاية الخلفية.

    لمزيد من المعلومات حول SNI في Application Gateway، راجع نظرة عامة على إنهاء TLS ونهاية إلى نهاية TLS مع Application Gateway.

    $authcert = New-AzApplicationGatewayAuthenticationCertificate -Name 'allowlistcert1' -CertificateFile C:\cert.cer
    

    إشعار

    يجب أن تكون الشهادة المتوفرة في الخطوة السابقة هي المفتاح العام لشهادة.pfx الموجودة في النهاية الخلفية. قم بتصدير الشهادة (وليس الشهادة الجذر) المثبتة على الخادم الخلفي بتنسيق Claim و Evidence و Reasoning (CER) واستخدمها في هذه الخطوة. تسمح هذه الخطوة للنهاية الخلفية مع بوابة التطبيق.

    إذا كنت تستخدم Application Gateway v2 SKU، فبادر بإنشاء شهادة جذر موثوق بها بدلا من شهادة مصادقة. لمزيد من المعلومات، راجع نظرة عامة حول النهاية إلى نهاية TLS مع Application Gateway.

    $trustedRootCert01 = New-AzApplicationGatewayTrustedRootCertificate -Name "test1" -CertificateFile  <path to root cert file>
    
  8. تكوين إعدادات HTTP لنهاية بوابة التطبيق الخلفية. تعيين الشهادة التي تم تحميلها في الخطوة السابقة إلى إعدادات HTTP.

    $poolSetting = New-AzApplicationGatewayBackendHttpSettings -Name 'setting01' -Port 443 -Protocol Https -CookieBasedAffinity Enabled -AuthenticationCertificates $authcert
    

    لـApplication Gateway v2 SKU، استخدم الأمر التالي:

    $poolSetting01 = New-AzApplicationGatewayBackendHttpSettings -Name “setting01” -Port 443 -Protocol Https -CookieBasedAffinity Disabled -TrustedRootCertificate $trustedRootCert01 -HostName "test1"
    
  9. إنشاء قاعدة تحويل موازن التحميل التي تكون سلوك موازن التحميل. في هذا المثال، يتم إنشاء قاعدة التخصيص الدوري الأساسية.

    $rule = New-AzApplicationGatewayRequestRoutingRule -Name 'rule01' -RuleType basic -BackendHttpSettings $poolSetting -HttpListener $listener -BackendAddressPool $pool
    
  10. تكوين حجم مثيل بوابة التطبيق. الأحجام المتوفرة هي Standard_Small Standard_Medium Standard_Large. بالنسبة للسعة، القيم المتاحة هي من 1 إلى 10.

    $sku = New-AzApplicationGatewaySku -Name Standard_Small -Tier Standard -Capacity 2
    

    إشعار

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

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

    القيم التالية هي قائمة إصدارات البروتوكول التي يمكن تعريفها:

    • TLSV1_0
    • TLSV1_1
    • TLSV1_2

    يعين المثال التالي الحد الأدنى لإصدار البروتوكول إلى TLSv1_2 وتمكين TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_RSA_WITH_AES_128_GCM_SHA256 فقط.

    $SSLPolicy = New-AzApplicationGatewaySSLPolicy -MinProtocolVersion TLSv1_2 -CipherSuite "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", "TLS_RSA_WITH_AES_128_GCM_SHA256" -PolicyType Custom
    

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

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

لـV1 SKU استخدام الأمر أدناه

$appgw = New-AzApplicationGateway -Name appgateway -SSLCertificates $cert -ResourceGroupName "appgw-rg" -Location "West US" -BackendAddressPools $pool -BackendHttpSettingsCollection $poolSetting -FrontendIpConfigurations $fipconfig -GatewayIpConfigurations $gipconfig -FrontendPorts $fp -HttpListeners $listener -RequestRoutingRules $rule -Sku $sku -SSLPolicy $SSLPolicy -AuthenticationCertificates $authcert -Verbose

لـV2 SKU استخدام الأمر أدناه

$appgw = New-AzApplicationGateway -Name appgateway -SSLCertificates $cert -ResourceGroupName "appgw-rg" -Location "West US" -BackendAddressPools $pool -BackendHttpSettingsCollection $poolSetting01 -FrontendIpConfigurations $fipconfig -GatewayIpConfigurations $gipconfig -FrontendPorts $fp -HttpListeners $listener -RequestRoutingRules $rule -Sku $sku -SSLPolicy $SSLPolicy -TrustedRootCertificate $trustedRootCert01 -Verbose

تطبيق شهادة جديدة إذا انتهت صلاحية شهادة الواجهة الخلفية

استخدم هذا الإجراء لتطبيق شهادة جديدة إذا انتهت صلاحية الشهادة الخلفية.

  1. استرداد بوابة التطبيق إلى تحديث.

    $gw = Get-AzApplicationGateway -Name AdatumAppGateway -ResourceGroupName AdatumAppGatewayRG
    
  2. إضافة مورد شهادة جديدة من ملف .cer الذي يحتوي على المفتاح العام للشهادة ويمكن أيضًا أن تكون الشهادة نفسها بمثابة إضافة إلى وحدة الاستماع لإنهاء TLS عند بوابة التطبيق.

    Add-AzApplicationGatewayAuthenticationCertificate -ApplicationGateway $gw -Name 'NewCert' -CertificateFile "appgw_NewCert.cer" 
    
  3. الحصول على عنصر شهادة مصادقة جديدة في متغير (TypeName: Microsoft.Azure.Commands.Network.Models.PSApplicationGatewayAuthenhenticationCertificate).

    $AuthCert = Get-AzApplicationGatewayAuthenticationCertificate -ApplicationGateway $gw -Name NewCert
    
  4. تعيين الشهادة الجديدة إلى إعداد BackendHttp وإحالتها مع متغير $AuthCert. (حدد اسم إعداد HTTP الذي تريد تغييره.)

$out= Set-AzApplicationGatewayBackendHttpSetting -ApplicationGateway $gw -Name "HTTP1" -Port 443 -Protocol "Https" -CookieBasedAffinity Disabled -AuthenticationCertificates $Authcert
  1. الالتزام بالتغيير في بوابة التطبيق وتمرير التكوين الجديد المضمن في متغير $out.
Set-AzApplicationGateway -ApplicationGateway $gw  

إزالة شهادة منتهية الصلاحية غير مستخدمة من إعدادات HTTP

استخدم هذا الإجراء لإزالة شهادة منتهية الصلاحية غير مستخدمة من إعدادات HTTP.

  1. استرداد بوابة التطبيق إلى تحديث.

    $gw = Get-AzApplicationGateway -Name AdatumAppGateway -ResourceGroupName AdatumAppGatewayRG
    
  2. قم بذكر اسم شهادة المصادقة التي تريد إزالتها.

    Get-AzApplicationGatewayAuthenticationCertificate -ApplicationGateway $gw | select name
    
  3. قم بإزالة شهادة المصادقة من بوابة تطبيق.

    $gw=Remove-AzApplicationGatewayAuthenticationCertificate -ApplicationGateway $gw -Name ExpiredCert
    
  4. قم بتثبيت التغييرات:

Set-AzApplicationGateway -ApplicationGateway $gw

تقييد إصدارات بروتوكول TLS على بوابة تطبيق موجودة

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

  1. استرداد بوابة التطبيق إلى تحديث.

    $gw = Get-AzApplicationGateway -Name AdatumAppGateway -ResourceGroupName AdatumAppGatewayRG
    
  2. قم بتعريف نهج TLS. في المثال التالي، يتم تعطيل TLSv1.0 وTLSv1.1 وتكون مجموعات التشفير TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_RSA_WITH_AES_128_GCM_SHA256 هي الوحيدة المسموح بها.

    Set-AzApplicationGatewaySSLPolicy -MinProtocolVersion TLSv1_2 -PolicyType Custom -CipherSuite "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", "TLS_RSA_WITH_AES_128_GCM_SHA256" -ApplicationGateway $gw
    
    
  3. وأخيرًا، قم بتحديث العبارة. هذه الخطوة الأخيرة مهمة طويلة الأمد. عند الانتهاء من ذلك، يتم تكوين TLS من نهاية إلى نهاية على بوابة التطبيق.

    $gw | Set-AzApplicationGateway
    

الحصول على اسم DNS لبوابة تطبيق

بعد إنشاء البوابة، فإن الخطوة التالية هي تكوين الواجهة الأمامية للاتصال. تتطلب بوابة التطبيق اسم DNS معين ديناميكيا عند استخدام IP عام، وهو غير مألوف. للتأكد من أن المستخدمين النهائيين يمكنهم أن يصلوا إلى بوابة التطبيق، يمكنك استخدام سجل CNAME للإشارة إلى نقطة النهاية العامة لبوابة التطبيق. لمزيد من المعلومات، راجع تكوين اسم المجال المخصص في Azure.

للقيام بذلك، يتم استرجاع تفاصيل بوابة التطبيق واسم IP/DNS المقترن به باستخدام عنصر PublicIPAddress المرفق مع بوابة التطبيق. استخدم اسم DNS الخاص ببوابة التطبيق لإنشاء سجل CNAME يشير إلى تطبيقي ويب إلى اسم DNS هذا. لا نوصي باستخدام السجلات A، لأن VIP يمكنه التغيير عند إعادة تشغيل بوابة التطبيق.

Get-AzPublicIpAddress -ResourceGroupName appgw-RG -Name publicIP01
Name                     : publicIP01
ResourceGroupName        : appgw-RG
Location                 : westus
Id                       : /subscriptions/<subscription_id>/resourceGroups/appgw-RG/providers/Microsoft.Network/publicIPAddresses/publicIP01
Etag                     : W/"00000d5b-54ed-4907-bae8-99bd5766d0e5"
ResourceGuid             : 00000000-0000-0000-0000-000000000000
ProvisioningState        : Succeeded
Tags                     : 
PublicIpAllocationMethod : Dynamic
IpAddress                : xx.xx.xxx.xx
PublicIpAddressVersion   : IPv4
IdleTimeoutInMinutes     : 4
IpConfiguration          : {
                                "Id": "/subscriptions/<subscription_id>/resourceGroups/appgw-RG/providers/Microsoft.Network/applicationGateways/appgwtest/frontendIP
                            Configurations/frontend1"
                            }
DnsSettings              : {
                                "Fqdn": "00000000-0000-xxxx-xxxx-xxxxxxxxxxxx.cloudapp.net"
                            }

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

لمزيد من المعلومات حول تصلب أمان تطبيقات الويب باستخدام جدار حماية تطبيق ويب من خلال بوابة التطبيق، راجع نظرة عامة حول جدار حماية تطبيق ويب.