Skip to content

Commit 6c2dfc0

Browse files
yoavmalyoavmalichi_microsoft
andauthored
Add XFF support to WAF custom rule (#28730)
Co-authored-by: yoavmalichi_microsoft <[email protected]>
1 parent c3412a9 commit 6c2dfc0

9 files changed

+5904
-2
lines changed

src/Network/Network.Test/ScenarioTests/ApplicationGatewayTests.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,5 +388,37 @@ public void TestApplicationGatewayFirewallPolicyComputedDisabledRules()
388388
{
389389
TestRunner.RunTestScript("Test-ApplicationGatewayFirewallPolicyComputedDisabledRules");
390390
}
391+
392+
[Fact]
393+
[Trait(Category.AcceptanceType, Category.CheckIn)]
394+
[Trait(Category.Owner, NrpTeamAlias.nvadev_subset1)]
395+
public void TestApplicationGatewayFirewallPolicyWithRateLimitRuleClientAddrXFFHeader()
396+
{
397+
TestRunner.RunTestScript("Test-ApplicationGatewayFirewallPolicyWithRateLimitRuleClientAddrXFFHeader");
398+
}
399+
400+
[Fact]
401+
[Trait(Category.AcceptanceType, Category.CheckIn)]
402+
[Trait(Category.Owner, NrpTeamAlias.nvadev_subset1)]
403+
public void TestApplicationGatewayFirewallPolicyWithRateLimitRuleGeoLocationXFFHeader()
404+
{
405+
TestRunner.RunTestScript("Test-ApplicationGatewayFirewallPolicyWithRateLimitRuleGeoLocationXFFHeader");
406+
}
407+
408+
[Fact]
409+
[Trait(Category.AcceptanceType, Category.CheckIn)]
410+
[Trait(Category.Owner, NrpTeamAlias.nvadev_subset1)]
411+
public void TestApplicationGatewayFirewallPolicyCustomRuleClientAddrXFFHeaderRemoval()
412+
{
413+
TestRunner.RunTestScript("Test-ApplicationGatewayFirewallPolicyCustomRuleClientAddrXFFHeaderRemoval");
414+
}
415+
416+
[Fact]
417+
[Trait(Category.AcceptanceType, Category.CheckIn)]
418+
[Trait(Category.Owner, NrpTeamAlias.nvadev_subset1)]
419+
public void TestApplicationGatewayFirewallPolicyCustomRuleGeoLocationXFFHeaderRemoval()
420+
{
421+
TestRunner.RunTestScript("Test-ApplicationGatewayFirewallPolicyCustomRuleGeoLocationXFFHeaderRemoval");
422+
}
391423
}
392424
}

src/Network/Network.Test/ScenarioTests/ApplicationGatewayTests.ps1

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6083,3 +6083,154 @@ function Test-ApplicationGatewayFirewallPolicyComputedDisabledRules
60836083
Clean-ResourceGroup $rgname
60846084
}
60856085
}
6086+
6087+
<#
6088+
.SYNOPSIS
6089+
Helper function for testing WAF policy with rate limiting rules and XFF header group-by variables.
6090+
This helper reduces code duplication across multiple test scenarios.
6091+
#>
6092+
function Test-ApplicationGatewayFirewallPolicyWithRateLimitRuleXFFHeaderInternal {
6093+
param(
6094+
[Parameter(Mandatory = $true)]
6095+
[ValidateSet("ClientAddrXFFHeader", "GeoLocationXFFHeader")]
6096+
[string]$GroupByVariableName
6097+
)
6098+
6099+
# Setup
6100+
$location = Get-ProviderLocation "Microsoft.Network/applicationGateways" "West US 2"
6101+
$rgname = Get-ResourceGroupName
6102+
$wafPolicyName = "wafPolicy1"
6103+
6104+
try {
6105+
6106+
$resourceGroup = New-AzResourceGroup -Name $rgname -Location $location -Tags @{ testtag = "APPGw tag" }
6107+
6108+
# WAF Policy with rate limiting rule custom Rule
6109+
$variable = New-AzApplicationGatewayFirewallMatchVariable -VariableName RequestHeaders -Selector Malicious-Header
6110+
$condition = New-AzApplicationGatewayFirewallCondition -MatchVariable $variable -Operator Any -NegationCondition $False
6111+
$groupbyVar = New-AzApplicationGatewayFirewallCustomRuleGroupByVariable -VariableName $GroupByVariableName
6112+
$groupbyUserSes = New-AzApplicationGatewayFirewallCustomRuleGroupByUserSession -GroupByVariable $groupbyVar
6113+
$customRule = New-AzApplicationGatewayFirewallCustomRule -Name example -Priority 2 -RateLimitDuration OneMin -RateLimitThreshold 10 -RuleType RateLimitRule -MatchCondition $condition -GroupByUserSession $groupbyUserSes -Action Block
6114+
6115+
$policySettings = New-AzApplicationGatewayFirewallPolicySetting -Mode Prevention -State Enabled -MaxFileUploadInMb 70 -MaxRequestBodySizeInKb 70
6116+
$managedRuleSet = New-AzApplicationGatewayFirewallPolicyManagedRuleSet -RuleSetType "OWASP" -RuleSetVersion "3.2"
6117+
$managedRule = New-AzApplicationGatewayFirewallPolicyManagedRule -ManagedRuleSet $managedRuleSet
6118+
New-AzApplicationGatewayFirewallPolicy -Name $wafPolicyName -ResourceGroupName $rgname -Location $location -ManagedRule $managedRule -PolicySetting $policySettings -CustomRule $customRule
6119+
6120+
$policy = Get-AzApplicationGatewayFirewallPolicy -Name $wafPolicyName -ResourceGroupName $rgname
6121+
6122+
# Check WAF policy
6123+
Assert-AreEqual $policy.CustomRules[0].Name $customRule.Name
6124+
Assert-AreEqual $policy.CustomRules[0].RuleType $customRule.RuleType
6125+
Assert-AreEqual $policy.CustomRules[0].Action $customRule.Action
6126+
Assert-AreEqual $policy.CustomRules[0].Priority $customRule.Priority
6127+
Assert-AreEqual $policy.CustomRules[0].RateLimitDuration $customRule.RateLimitDuration
6128+
Assert-AreEqual $policy.CustomRules[0].RateLimitThreshold $customRule.RateLimitThreshold
6129+
Assert-AreEqual $policy.CustomRules[0].State "Enabled"
6130+
Assert-AreEqual $policy.CustomRules[0].MatchConditions[0].OperatorProperty $customRule.MatchConditions[0].OperatorProperty
6131+
Assert-AreEqual $policy.CustomRules[0].MatchConditions[0].NegationConditon $customRule.MatchConditions[0].NegationConditon
6132+
Assert-AreEqual $policy.CustomRules[0].MatchConditions[0].MatchVariables[0].VariableName $customRule.MatchConditions[0].MatchVariables[0].VariableName
6133+
Assert-AreEqual $policy.CustomRules[0].MatchConditions[0].MatchVariables[0].Selector $customRule.MatchConditions[0].MatchVariables[0].Selector
6134+
Assert-AreEqual $policy.CustomRules[0].GroupByUserSession[0].GroupByVariables[0].VariableName $customRule.GroupByUserSession[0].GroupByVariables[0].VariableName
6135+
Assert-AreEqual $policy.PolicySettings.FileUploadLimitInMb $policySettings.FileUploadLimitInMb
6136+
Assert-AreEqual $policy.PolicySettings.MaxRequestBodySizeInKb $policySettings.MaxRequestBodySizeInKb
6137+
Assert-AreEqual $policy.PolicySettings.RequestBodyCheck $policySettings.RequestBodyCheck
6138+
Assert-AreEqual $policy.PolicySettings.Mode $policySettings.Mode
6139+
Assert-AreEqual $policy.PolicySettings.State $policySettings.State
6140+
6141+
$policy.CustomRules[0].State = "Disabled"
6142+
Set-AzApplicationGatewayFirewallPolicy -InputObject $policy
6143+
$policy1 = Get-AzApplicationGatewayFirewallPolicy -Name $wafPolicyName -ResourceGroupName $rgname
6144+
Assert-AreEqual $policy1.CustomRules[0].State "Disabled"
6145+
}
6146+
finally {
6147+
# Cleanup
6148+
Clean-ResourceGroup $rgname
6149+
}
6150+
}
6151+
6152+
function Test-ApplicationGatewayFirewallPolicyWithRateLimitRuleClientAddrXFFHeader {
6153+
Test-ApplicationGatewayFirewallPolicyWithRateLimitRuleXFFHeaderInternal -GroupByVariableName "ClientAddrXFFHeader"
6154+
}
6155+
6156+
function Test-ApplicationGatewayFirewallPolicyWithRateLimitRuleGeoLocationXFFHeader {
6157+
Test-ApplicationGatewayFirewallPolicyWithRateLimitRuleXFFHeaderInternal -GroupByVariableName "GeoLocationXFFHeader"
6158+
}
6159+
6160+
<#
6161+
.SYNOPSIS
6162+
Helper function for testing WAF policy custom rule removal with XFF header group-by variables.
6163+
This helper reduces code duplication across multiple test scenarios.
6164+
#>
6165+
function Test-ApplicationGatewayFirewallPolicyCustomRuleXFFHeaderRemovalInternal {
6166+
param(
6167+
[Parameter(Mandatory = $true)]
6168+
[ValidateSet("ClientAddrXFFHeader", "GeoLocationXFFHeader")]
6169+
[string]$GroupByVariableName
6170+
)
6171+
6172+
# Setup
6173+
$location = Get-ProviderLocation "Microsoft.Network/applicationGateways" "West US 2"
6174+
$rgname = Get-ResourceGroupName
6175+
$wafPolicyName = "wafPolicy1"
6176+
6177+
try {
6178+
6179+
$resourceGroup = New-AzResourceGroup -Name $rgname -Location $location -Tags @{ testtag = "APPGw tag" }
6180+
6181+
# WAF Policy with rate limiting rule custom Rule
6182+
$variable = New-AzApplicationGatewayFirewallMatchVariable -VariableName RequestHeaders -Selector Malicious-Header
6183+
$condition = New-AzApplicationGatewayFirewallCondition -MatchVariable $variable -Operator Any -NegationCondition $False
6184+
$groupbyVar = New-AzApplicationGatewayFirewallCustomRuleGroupByVariable -VariableName $GroupByVariableName
6185+
$groupbyUserSes = New-AzApplicationGatewayFirewallCustomRuleGroupByUserSession -GroupByVariable $groupbyVar
6186+
$customRule = New-AzApplicationGatewayFirewallCustomRule -Name example -Priority 2 -RateLimitDuration OneMin -RateLimitThreshold 10 -RuleType RateLimitRule -MatchCondition $condition -GroupByUserSession $groupbyUserSes -Action Block
6187+
6188+
$policySettings = New-AzApplicationGatewayFirewallPolicySetting -Mode Prevention -State Enabled -MaxFileUploadInMb 70 -MaxRequestBodySizeInKb 70
6189+
$managedRuleSet = New-AzApplicationGatewayFirewallPolicyManagedRuleSet -RuleSetType "OWASP" -RuleSetVersion "3.2"
6190+
$managedRule = New-AzApplicationGatewayFirewallPolicyManagedRule -ManagedRuleSet $managedRuleSet
6191+
New-AzApplicationGatewayFirewallPolicy -Name $wafPolicyName -ResourceGroupName $rgname -Location $location -ManagedRule $managedRule -PolicySetting $policySettings -CustomRule $customRule
6192+
6193+
$policy = Get-AzApplicationGatewayFirewallPolicy -Name $wafPolicyName -ResourceGroupName $rgname
6194+
6195+
# Check WAF policy
6196+
Assert-AreEqual $policy.CustomRules[0].Name $customRule.Name
6197+
Assert-AreEqual $policy.CustomRules[0].RuleType $customRule.RuleType
6198+
Assert-AreEqual $policy.CustomRules[0].Action $customRule.Action
6199+
Assert-AreEqual $policy.CustomRules[0].Priority $customRule.Priority
6200+
Assert-AreEqual $policy.CustomRules[0].RateLimitDuration $customRule.RateLimitDuration
6201+
Assert-AreEqual $policy.CustomRules[0].RateLimitThreshold $customRule.RateLimitThreshold
6202+
Assert-AreEqual $policy.CustomRules[0].State "Enabled"
6203+
Assert-AreEqual $policy.CustomRules[0].MatchConditions[0].OperatorProperty $customRule.MatchConditions[0].OperatorProperty
6204+
Assert-AreEqual $policy.CustomRules[0].MatchConditions[0].NegationConditon $customRule.MatchConditions[0].NegationConditon
6205+
Assert-AreEqual $policy.CustomRules[0].MatchConditions[0].MatchVariables[0].VariableName $customRule.MatchConditions[0].MatchVariables[0].VariableName
6206+
Assert-AreEqual $policy.CustomRules[0].MatchConditions[0].MatchVariables[0].Selector $customRule.MatchConditions[0].MatchVariables[0].Selector
6207+
Assert-AreEqual $policy.CustomRules[0].GroupByUserSession[0].GroupByVariables[0].VariableName $customRule.GroupByUserSession[0].GroupByVariables[0].VariableName
6208+
Assert-AreEqual $policy.PolicySettings.FileUploadLimitInMb $policySettings.FileUploadLimitInMb
6209+
Assert-AreEqual $policy.PolicySettings.MaxRequestBodySizeInKb $policySettings.MaxRequestBodySizeInKb
6210+
Assert-AreEqual $policy.PolicySettings.RequestBodyCheck $policySettings.RequestBodyCheck
6211+
Assert-AreEqual $policy.PolicySettings.Mode $policySettings.Mode
6212+
Assert-AreEqual $policy.PolicySettings.State $policySettings.State
6213+
6214+
$policy.CustomRules[0].State = "Disabled"
6215+
Set-AzApplicationGatewayFirewallPolicy -InputObject $policy
6216+
$policy1 = Get-AzApplicationGatewayFirewallPolicy -Name $wafPolicyName -ResourceGroupName $rgname
6217+
Assert-AreEqual $policy1.CustomRules[0].State "Disabled"
6218+
6219+
#Remove Custom Rule
6220+
Remove-AzApplicationGatewayFirewallCustomRule -Name $customRule.Name -ResourceGroupName $rgname -PolicyName $wafPolicyName
6221+
$policynew = Get-AzApplicationGatewayFirewallPolicy -Name $wafPolicyName -ResourceGroupName $rgname
6222+
Assert-Null $policynew.CustomRules[0]
6223+
}
6224+
finally {
6225+
# Cleanup
6226+
Clean-ResourceGroup $rgname
6227+
}
6228+
}
6229+
6230+
function Test-ApplicationGatewayFirewallPolicyCustomRuleClientAddrXFFHeaderRemoval {
6231+
Test-ApplicationGatewayFirewallPolicyCustomRuleXFFHeaderRemovalInternal -GroupByVariableName "ClientAddrXFFHeader"
6232+
}
6233+
6234+
function Test-ApplicationGatewayFirewallPolicyCustomRuleGeoLocationXFFHeaderRemoval {
6235+
Test-ApplicationGatewayFirewallPolicyCustomRuleXFFHeaderRemovalInternal -GroupByVariableName "GeoLocationXFFHeader"
6236+
}

src/Network/Network.Test/SessionRecords/Commands.Network.Test.ScenarioTests.ApplicationGatewayTests/TestApplicationGatewayFirewallPolicyCustomRuleClientAddrXFFHeaderRemoval.json

Lines changed: 1623 additions & 0 deletions
Large diffs are not rendered by default.

src/Network/Network.Test/SessionRecords/Commands.Network.Test.ScenarioTests.ApplicationGatewayTests/TestApplicationGatewayFirewallPolicyCustomRuleGeoLocationXFFHeaderRemoval.json

Lines changed: 1623 additions & 0 deletions
Large diffs are not rendered by default.

src/Network/Network.Test/SessionRecords/Commands.Network.Test.ScenarioTests.ApplicationGatewayTests/TestApplicationGatewayFirewallPolicyWithRateLimitRuleClientAddrXFFHeader.json

Lines changed: 1236 additions & 0 deletions
Large diffs are not rendered by default.

src/Network/Network.Test/SessionRecords/Commands.Network.Test.ScenarioTests.ApplicationGatewayTests/TestApplicationGatewayFirewallPolicyWithRateLimitRuleGeoLocationXFFHeader.json

Lines changed: 1236 additions & 0 deletions
Large diffs are not rendered by default.

src/Network/Network/ChangeLog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
- `Set-AzApplicationGatewayProbeConfig`
3838
- `Add-AzApplicationGatewayProbeConfig`
3939
- `New-AzApplicationGatewayProbeConfig`
40+
* Added 'GeoLocationXFFHeader' and 'ClientAddrXFFHeader' as valid VariableNames in `NewAzureApplicationGatewayFirewallCustomRuleGroupByVariable`.
4041

4142
## Version 7.21.0
4243
* Added deprecation warning for cmdlet `Invoke-AzFirewallPacketCapture`

src/Network/Network/FirewallPolicy/FirewallCustomRule/GroupByUserSession/GroupByVariable/NewAzureApplicationGatewayFirewallCustomRuleGroupByVariableCommand.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public class NewAzureApplicationGatewayFirewallCustomRuleGroupByVariableCommand
2525
Mandatory = true,
2626
HelpMessage = "User Session clause variable.")]
2727
[ValidateNotNullOrEmpty]
28-
[ValidateSet("ClientAddr", "GeoLocation", "None", IgnoreCase = true)]
28+
[ValidateSet("ClientAddr", "GeoLocation", "None", "ClientAddrXFFHeader", "GeoLocationXFFHeader", IgnoreCase = true)]
2929
public string VariableName { get; set; }
3030

3131
public override void ExecuteCmdlet()

src/Network/Network/help/New-AzApplicationGatewayFirewallCustomRuleGroupByVariable.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ User Session clause variable.
5353
Type: System.String
5454
Parameter Sets: (All)
5555
Aliases:
56-
Accepted values: ClientAddr, GeoLocation, None
56+
Accepted values: ClientAddr, GeoLocation, None, ClientAddrXFFHeader, GeoLocationXFFHeader
5757

5858
Required: True
5959
Position: Named

0 commit comments

Comments
 (0)