تكوين نهج WAF لكل موقع باستخدام Azure PowerShell

يتم تضمين إعدادات جدار حماية تطبيق الويب (WAF) في نهج WAF، ولغير تكوين WAF الخاص بك، يمكنك تعديل نهج WAF.

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

من خلال تطبيق نهج WAF على وحدة استماع، يمكنك تكوين إعدادات WAF للمواقع الفردية دون التغييرات التي تؤثر على كل موقع. السياسة الأكثر تحديدا تأخذ سابقة. إذا كان هناك نهج عمومي، ونهج لكل موقع (نهج WAF مقترن بمستمع)، فإن النهج لكل موقع يتجاوز نهج WAF العمومي لهذا المستمع. سيتأثر المستمعون الآخرون الذين ليس لديهم سياسات خاصة بهم فقط بسياسة WAF العالمية.

في هذه المقالة، ستتعرف على كيفية:

  • إعداد الشبكة
  • إنشاء نهج جدار حماية تطبيق الويب
  • إنشاء بوابة تطبيق مع تمكين جدار حماية تطبيق ويب
  • تطبيق نهج WAF عالميا، لكل موقع، ولكل URI
  • إنشاء مجموعة تحجيم الجهاز الظاهري
  • إنشاء حساب تخزين وتكوين التشخيص
  • اختبار بوابة التطبيق

رسم تخطيطي لمثال جدار حماية تطبيق ويب.

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

إشعار

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

Azure Cloud Shell

Azure يستضيف Azure Cloud Shell، بيئة تفاعلية يمكن استخدامها من خلال المستعرض. يمكنك استخدام Bash أو PowerShell مع Cloud Shell للعمل مع خدمات Azure. يمكنك استخدام أوامر Cloud Shell المثبتة مسبقًا لتشغيل التعليمات البرمجية في هذه المقالة دون الحاجة إلى تثبيت أي شيء على البيئة المحلية.

لبدء Azure Cloud Shell:

خيار مثال/ رابط
انقر فوق ⁧⁩جربه⁧⁩ في الزاوية العلوية اليسرى من التعليمة البرمجية أو كتلة الأمر. تحديد ⁧⁩جربه⁧⁩ لا يقوم بنسخ التعليمة البرمجية أو الأمر تلقائيًا إلى Cloud Shell. لقطة شاشة تعرض مثالاً على Try It for Azure Cloud Shell.
انتقل إلى ⁧⁩⁧ https://shell.azure.com⁩⁧⁩، أو حدد زر ⁩تشغيل Cloud Shell لفتح Cloud Shell في المتصفح لديك. زر لتشغيل Azure Cloud Shell.
حدد زر Cloud Shell على شريط القوائم في أعلى اليمين في مدخل Microsoft Azure. لقطة شاشة تعرض زر Cloud Shell في مدخل Microsoft Azure

لاستخدام Azure Cloud Shell:

  1. ابدأ تشغيل Cloud Shell.

  2. حدد الزر نسخ على كتلة التعليمات البرمجية (أو كتلة الأوامر) لنسخ التعليمات البرمجية أو الأمر.

  3. ألصق التعليمة البرمجية أو الأمر في جلسة Cloud Shell بتحديد Ctrl+Shift+Vعلى Windows وLunix، أو بتحديد Cmd+Shift+Vعلى macOS.

  4. حدد Enter لتشغيل التعليمات البرمجية أو الأمر.

إذا اخترت تثبيت PowerShell واستخدامه محليًّا، فستتطلب هذه المقالة إصدار الوحدة النمطية Azure PowerShell 1.0.0 أو إصدارًا أحدث. قم بتشغيل Get-Module -ListAvailable Az للعثور على الإصدار. إذا كنت بحاجة إلى الترقية، فراجع تثبيت الوحدة النمطية Azure PowerShell. في حالة تشغيل PowerShell محليًا، فأنت بحاجة أيضًا إلى تشغيل Login-AzAccount لإنشاء اتصال مع Azure.

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

وتُعد مجموعة الموارد عبارة عن حاوية منطقية يتم فيها توزيع موارد Azure وإدارتها. أنشئ مجموعة موارد Azure باستخدام New-AzResourceGroup.

$rgname = New-AzResourceGroup -Name myResourceGroupAG -Location eastus

إنشاء موارد الشبكة

إنشاء تكوينات الشبكة الفرعية لـ myBackendSubnet وmyAGSubnet باستخدام New-AzVirtualNetworkSubnetConfig. إنشاء شبكة الاتصال الظاهرية myVNet باستخدام New-AzVirtualNetwork من خلال تكوينات الشبكة الفرعية. أنشئ عنوان IP عاماً باسم myPublicIPAddress باستخدام New-AzPublicIpAddress: تُستخدم هذه الموارد لتوفير اتصال الشبكة ببوابة التطبيق والموارد المرتبطة بها.

$backendSubnetConfig = New-AzVirtualNetworkSubnetConfig `
  -Name myBackendSubnet `
  -AddressPrefix 10.0.1.0/24

$agSubnetConfig = New-AzVirtualNetworkSubnetConfig `
  -Name myAGSubnet `
  -AddressPrefix 10.0.2.0/24

$vnet = New-AzVirtualNetwork `
  -ResourceGroupName myResourceGroupAG `
  -Location eastus `
  -Name myVNet `
  -AddressPrefix 10.0.0.0/16 `
  -Subnet $backendSubnetConfig, $agSubnetConfig

$pip = New-AzPublicIpAddress `
  -ResourceGroupName myResourceGroupAG `
  -Location eastus `
  -Name myAGPublicIPAddress `
  -AllocationMethod Static `
  -Sku Standard

إنشاء بوابة تطبيق

في هذا القسم، تقوم بإنشاء موارد تدعم بوابة التطبيق، ثم تقوم أخيراً بإنشائها وإنشاء حماية تطبيقات الويب (WAF). تتضمن الموارد التي تقوم بإنشائها ما يلي:

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

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

قم بربط myAGSubnet الذي قمت بإنشائه مسبقا ببوابة التطبيق باستخدام New-AzApplicationGatewayIPConfiguration. قم بتعيين myAGPublicIPAddress إلى بوابة التطبيق باستخدام New-AzApplicationGatewayFrontendIPConfig.

$vnet = Get-AzVirtualNetwork `
  -ResourceGroupName myResourceGroupAG `
  -Name myVNet

$subnet=$vnet.Subnets[1]

$gipconfig = New-AzApplicationGatewayIPConfiguration `
  -Name myAGIPConfig `
  -Subnet $subnet

$fipconfig = New-AzApplicationGatewayFrontendIPConfig `
  -Name myAGFrontendIPConfig `
  -PublicIPAddress $pip

$frontendport80 = New-AzApplicationGatewayFrontendPort `
  -Name myFrontendPort `
  -Port 80
  
$frontendport8080 = New-AzApplicationGatewayFrontendPort `
  -Name myFrontendPort `
  -Port 8080

إنشاء مجموعة الواجهة الخلفية والإعدادات

أنشئ المجموعة الخلفية الافتراضية باسم appGatewayBackendPool لبوابة التطبيق باستخدام New-AzApplicationGatewayBackendAddressPool. تكوين إعدادات تجمعات عناوين الواجهة الخلفية باستخدام New-AzApplicationGatewayBackendHttpSettings.

$defaultPool = New-AzApplicationGatewayBackendAddressPool `
  -Name appGatewayBackendPool 

$poolSettings = New-AzApplicationGatewayBackendHttpSettings `
  -Name myPoolSettings `
  -Port 80 `
  -Protocol Http `
  -CookieBasedAffinity Enabled `
  -RequestTimeout 120

إنشاء نهجي WAF

إنشاء نهجين WAF، أحدهما عمومي والآخر لكل موقع، وإضافة قواعد مخصصة.

يقيد النهج لكل موقع حد تحميل الملف إلى 5 ميغابايت. كل شيء آخر هو نفسه.

$variable = New-AzApplicationGatewayFirewallMatchVariable -VariableName RequestUri
$condition = New-AzApplicationGatewayFirewallCondition -MatchVariable $variable -Operator Contains -MatchValue "globalAllow" 
$rule = New-AzApplicationGatewayFirewallCustomRule -Name globalAllow -Priority 5 -RuleType MatchRule -MatchCondition $condition -Action Allow

$variable1 = New-AzApplicationGatewayFirewallMatchVariable -VariableName RequestUri
$condition1 = New-AzApplicationGatewayFirewallCondition -MatchVariable $variable1 -Operator Contains -MatchValue "globalBlock" 
$rule1 = New-AzApplicationGatewayFirewallCustomRule -Name globalBlock -Priority 10 -RuleType MatchRule -MatchCondition $condition1 -Action Block

$variable2 = New-AzApplicationGatewayFirewallMatchVariable -VariableName RequestUri
$condition2 = New-AzApplicationGatewayFirewallCondition -MatchVariable $variable2 -Operator Contains -MatchValue "siteAllow" 
$rule2 = New-AzApplicationGatewayFirewallCustomRule -Name siteAllow -Priority 5 -RuleType MatchRule -MatchCondition $condition2 -Action Allow

$variable3 = New-AzApplicationGatewayFirewallMatchVariable -VariableName RequestUri
$condition3 = New-AzApplicationGatewayFirewallCondition -MatchVariable $variable3 -Operator Contains -MatchValue "siteBlock" 
$rule3 = New-AzApplicationGatewayFirewallCustomRule -Name siteBlock -Priority 10 -RuleType MatchRule -MatchCondition $condition3 -Action Block

$variable4 = New-AzApplicationGatewayFirewallMatchVariable -VariableName RequestUri
$condition4 = New-AzApplicationGatewayFirewallCondition -MatchVariable $variable4 -Operator Contains -MatchValue "URIAllow" 
$rule4 = New-AzApplicationGatewayFirewallCustomRule -Name URIAllow -Priority 5 -RuleType MatchRule -MatchCondition $condition4 -Action Allow

$variable5 = New-AzApplicationGatewayFirewallMatchVariable -VariableName RequestUri
$condition5 = New-AzApplicationGatewayFirewallCondition -MatchVariable $variable5 -Operator Contains -MatchValue "URIBlock" 
$rule5 = New-AzApplicationGatewayFirewallCustomRule -Name URIBlock -Priority 10 -RuleType MatchRule -MatchCondition $condition5 -Action Block

$policySettingGlobal = New-AzApplicationGatewayFirewallPolicySetting `
  -Mode Prevention `
  -State Enabled `
  -MaxRequestBodySizeInKb 100 `
  -MaxFileUploadInMb 256

$wafPolicyGlobal = New-AzApplicationGatewayFirewallPolicy `
  -Name wafpolicyGlobal `
  -ResourceGroup myResourceGroupAG `
  -Location eastus `
  -PolicySetting $PolicySettingGlobal `
  -CustomRule $rule, $rule1

$policySettingSite = New-AzApplicationGatewayFirewallPolicySetting `
  -Mode Prevention `
  -State Enabled `
  -MaxRequestBodySizeInKb 100 `
  -MaxFileUploadInMb 5

$wafPolicySite = New-AzApplicationGatewayFirewallPolicy `
  -Name wafpolicySite `
  -ResourceGroup myResourceGroupAG `
  -Location eastus `
  -PolicySetting $PolicySettingSite `
  -CustomRule $rule2, $rule3

إنشاء وحدة الاستماع والقاعدة الافتراضية

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

أنشئ وحدة استماع باسم mydefaultListener باستخدام New-AzApplicationGatewayHttpListener مع تكوين الواجهة الأمامية ومنفذ الواجهة الأمامية الذي قمت بإنشائه مسبقا. يلزم وجود قاعدة لوحدة الاستماع لمعرفة أي مجموعة واجهة خلفية يستخدم لنسبة استخدام الشبكة الواردة. قم بإنشاء قاعدة أساسية تسمى rule1 باستخدام New-AzApplicationGatewayRequestRoutingRule.

$globalListener = New-AzApplicationGatewayHttpListener `
  -Name mydefaultListener `
  -Protocol Http `
  -FrontendIPConfiguration $fipconfig `
  -FrontendPort $frontendport80

$frontendRule = New-AzApplicationGatewayRequestRoutingRule `
  -Name rule1 `
  -RuleType Basic `
  -HttpListener $globallistener `
  -BackendAddressPool $defaultPool `
  -BackendHttpSettings $poolSettings
  
$siteListener = New-AzApplicationGatewayHttpListener `
  -Name mydefaultListener `
  -Protocol Http `
  -FrontendIPConfiguration $fipconfig `
  -FrontendPort $frontendport8080 `
  -FirewallPolicy $wafPolicySite
  
$frontendRuleSite = New-AzApplicationGatewayRequestRoutingRule `
  -Name rule2 `
  -RuleType Basic `
  -HttpListener $siteListener `
  -BackendAddressPool $defaultPool `
  -BackendHttpSettings $poolSettings

إنشاء بوابة التطبيق باستخدام جدار حماية تطبيقات الويب (WAF)

الآن بعد أن أنشأت موارد الدعم الضرورية، حدد معلمات بوابة التطبيق باستخدام New-AzApplicationGatewaySku. حدد نهج جدار الحماية باستخدام New-AzApplicationGatewayFirewallPolicy. ثم أنشئ بوابة التطبيق المسمى myAppGateway باستخدام New-AzApplicationGateway.

$sku = New-AzApplicationGatewaySku `
  -Name WAF_v2 `
  -Tier WAF_v2 `
  -Capacity 2

$appgw = New-AzApplicationGateway `
  -Name myAppGateway `
  -ResourceGroupName myResourceGroupAG `
  -Location eastus `
  -BackendAddressPools $defaultPool `
  -BackendHttpSettingsCollection $poolSettings `
  -FrontendIpConfigurations $fipconfig `
  -GatewayIpConfigurations $gipconfig `
  -FrontendPorts $frontendport80 `
  -HttpListeners $globallistener `
  -RequestRoutingRules $frontendRule `
  -Sku $sku `
  -FirewallPolicy $wafPolicyGlobal

تطبيق نهج URI لكل

لتطبيق نهج URI لكل، ما عليك سوى إنشاء نهج جديد وتطبيقه على تكوين قاعدة المسار.

$policySettingURI = New-AzApplicationGatewayFirewallPolicySetting `
  -Mode Prevention `
  -State Enabled `
  -MaxRequestBodySizeInKb 100 `
  -MaxFileUploadInMb 5

$wafPolicyURI = New-AzApplicationGatewayFirewallPolicy `
  -Name wafpolicySite `
  -ResourceGroup myResourceGroupAG `
  -Location eastus `
  -PolicySetting $PolicySettingURI `
  -CustomRule $rule4, $rule5

$appgw = Get-AzApplicationGateway `
  -ResourceGroupName myResourceGroupAG `
  -Name myAppGateway

$PathRuleConfig = New-AzApplicationGatewayPathRuleConfig -Name "base" `
  -Paths "/base" `
  -BackendAddressPool $defaultPool `
  -BackendHttpSettings $poolSettings `
  -FirewallPolicy $wafPolicyURI

$PathRuleConfig1 = New-AzApplicationGatewayPathRuleConfig `
  -Name "base" -Paths "/test" `
  -BackendAddressPool $defaultPool `
  -BackendHttpSettings $poolSettings

$URLPathMap = New-AzApplicationGatewayUrlPathMapConfig -Name "PathMap" `
  -PathRules $PathRuleConfig, $PathRuleConfig1 `
  -DefaultBackendAddressPoolId $defaultPool.Id `
  -DefaultBackendHttpSettingsId $poolSettings.Id

Add-AzApplicationGatewayRequestRoutingRule -ApplicationGateway $appgw `
  -Name "RequestRoutingRule" `
  -RuleType PathBasedRouting `
  -HttpListener $siteListener `
  -UrlPathMap $URLPathMap

إنشاء مجموعة تحجيم الجهاز الظاهري

في هذا المثال، تقوم بإنشاء مقياس جهاز ظاهري لتزويد خوادم لتجمع الواجهة الخلفية في بوابة التطبيق. يمكنك تعيين المقياس لمجموعة الواجهة الخلفية عند تكوين إعدادات IP.

استبدل القيم الخاصة بك -AdminUsername و-AdminPassword.

$vnet = Get-AzVirtualNetwork `
  -ResourceGroupName myResourceGroupAG `
  -Name myVNet

$appgw = Get-AzApplicationGateway `
  -ResourceGroupName myResourceGroupAG `
  -Name myAppGateway

$backendPool = Get-AzApplicationGatewayBackendAddressPool `
  -Name appGatewayBackendPool `
  -ApplicationGateway $appgw

$ipConfig = New-AzVmssIpConfig `
  -Name myVmssIPConfig `
  -SubnetId $vnet.Subnets[0].Id `
  -ApplicationGatewayBackendAddressPoolsId $backendPool.Id

$vmssConfig = New-AzVmssConfig `
  -Location eastus `
  -SkuCapacity 2 `
  -SkuName Standard_DS2 `
  -UpgradePolicyMode Automatic

Set-AzVmssStorageProfile $vmssConfig `
  -ImageReferencePublisher MicrosoftWindowsServer `
  -ImageReferenceOffer WindowsServer `
  -ImageReferenceSku 2016-Datacenter `
  -ImageReferenceVersion latest `
  -OsDiskCreateOption FromImage

Set-AzVmssOsProfile $vmssConfig `
  -AdminUsername <username> `
  -AdminPassword <password> `
  -ComputerNamePrefix myvmss

Add-AzVmssNetworkInterfaceConfiguration `
  -VirtualMachineScaleSet $vmssConfig `
  -Name myVmssNetConfig `
  -Primary $true `
  -IPConfiguration $ipConfig

New-AzVmss `
  -ResourceGroupName myResourceGroupAG `
  -Name myvmss `
  -VirtualMachineScaleSet $vmssConfig

تثبيت IIS

$publicSettings = @{ "fileUris" = (,"https://raw.githubusercontent.com/Azure/azure-docs-powershell-samples/master/application-gateway/iis/appgatewayurl.ps1"); 
  "commandToExecute" = "powershell -ExecutionPolicy Unrestricted -File appgatewayurl.ps1" }

$vmss = Get-AzVmss -ResourceGroupName myResourceGroupAG -VMScaleSetName myvmss

Add-AzVmssExtension -VirtualMachineScaleSet $vmss `
  -Name "customScript" `
  -Publisher "Microsoft.Compute" `
  -Type "CustomScriptExtension" `
  -TypeHandlerVersion 1.8 `
  -Setting $publicSettings

Update-AzVmss `
  -ResourceGroupName myResourceGroupAG `
  -Name myvmss `
  -VirtualMachineScaleSet $vmss

إنشاء حساب تخزين وتكوين التشخيص

خلال هذه المقالة، تستخدم بوابة التطبيق حساب تخزين لتخزين البيانات لأغراض الكشف والوقاية. يمكنك استخدام سجلات Azure Monitor أو Event Hub لتسجيل البيانات.

إنشاء حساب التخزين

أنشئ حساب تخزين باسم myagstore1 باستخدام New-AzStorageAccount.

$storageAccount = New-AzStorageAccount `
  -ResourceGroupName myResourceGroupAG `
  -Name myagstore1 `
  -Location eastus `
  -SkuName "Standard_LRS"

تكوين التشخيصات

تكوين التشخيصات لتسجيل البيانات في سجلات ApplicationGatewayAccessLog وApplicationGatewayPerformanceLog وApplicationGatewayFirewallLog باستخدام Set-AzDiagnosticSetting.

$appgw = Get-AzApplicationGateway `
  -ResourceGroupName myResourceGroupAG `
  -Name myAppGateway

$store = Get-AzStorageAccount `
  -ResourceGroupName myResourceGroupAG `
  -Name myagstore1

Set-AzDiagnosticSetting `
  -ResourceId $appgw.Id `
  -StorageAccountId $store.Id `
  -Category ApplicationGatewayAccessLog, ApplicationGatewayPerformanceLog, ApplicationGatewayFirewallLog `
  -Enabled $true `
  -RetentionEnabled $true `
  -RetentionInDays 30

اختبار بوابة التطبيق

يمكنك استخدام Get-AzPublicIPAddress للحصول على عنوان IP العام لبوابة التطبيق. ثم استخدم عنوان IP هذا لتجعيده (استبدل 1.1.1.1 الموضح أدناه).

Get-AzPublicIPAddress -ResourceGroupName myResourceGroupAG -Name myAGPublicIPAddress

#should be blocked
curl 1.1.1.1/globalBlock
curl 1.1.1.1/?1=1

#should be allowed
curl 1.1.1.1/globalAllow?1=1

#should be blocked
curl 1.1.1.1:8080/siteBlock
curl 1.1.1.1/?1=1

#should be allowed
curl 1.1.1.1:8080/siteAllow?1=1

#should be blocked
curl 1.1.1.1/URIBlock
curl 1.1.1.1/?1=1

#should be allowed
curl 1.1.1.1/URIAllow?1=1

اختبر عنوان URL الأساسي في مدخل التطبيق

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

عند عدم الحاجة إلى ذلك، قم بإزالة مجموعة الموارد وبوابة التطبيق وجميع الموارد ذات الصلة باستخدام Remove-AzResourceGroup.

Remove-AzResourceGroup -Name myResourceGroupAG

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

تخصيص قواعد جدار الحماية لتطبيق الويب