Azure应用网关WAF自定义规则PowerShell更新问题求助
Azure Application Gateway WAF自定义规则更新问题解决
问题背景
已实现Azure Application Gateway WAF自定义规则创建自动化,但更新现有自定义规则时会自动删除所有其他规则。Azure PowerShell暂无单独更新自定义规则的命令,官方已确认此情况。尝试通过.Add和.Remove操作修改规则时遇到以下错误:
错误1:添加IP时提示集合为固定大小
执行以下命令尝试向IPRestrict规则添加恶意IP时报错:
PS C:\Users\japuthiyakath> $policy = Get-AzApplicationGatewayFirewallPolicy -Name $policyName -ResourceGroupName $policyRG PS C:\Users\japuthiyakath> (($policy.CustomRules | Where-Object {$_.Name -match "IPRestrict"}).MatchConditions.MatchValues).Add('2.3.6.9')
报错信息:
MethodInvocationException: Exception calling "Add" with "1" argument(s): "Collection was of a fixed size."
原因:通过Get-AzApplicationGatewayFirewallPolicy获取的MatchValues是固定大小的只读集合,无法直接调用.Add方法修改。
解决方法:将固定大小集合转换为可修改的ArrayList,添加IP后重新赋值回规则:
# 获取WAF策略对象 $policy = Get-AzApplicationGatewayFirewallPolicy -Name $policyName -ResourceGroupName $policyRG # 定位目标自定义规则 $targetRule = $policy.CustomRules | Where-Object {$_.Name -match "IPRestrict"} # 将MatchValues转为可修改的ArrayList $matchValues = [System.Collections.ArrayList]$targetRule.MatchConditions.MatchValues # 添加新IP(用Out-Null屏蔽Add操作的返回值) $matchValues.Add('2.3.6.9') | Out-Null # 将修改后的集合赋值回规则 $targetRule.MatchConditions.MatchValues = $matchValues # 保存更新后的策略 Set-AzApplicationGatewayFirewallPolicy -InputObject $policy
错误2:无法通过.Remove移除指定规则
执行以下命令尝试移除IPRestrict规则时,无报错但规则未被移除:
PS C:\Users\japuthiyakath> ($policy.CustomRules | Where-Object {$_.Name -match "IPRestrict"}).Remove
而使用.RemoveAt(0)虽有效,但无法确定目标规则的索引位置。
原因:$policy.CustomRules同样是固定大小集合,直接对筛选后的规则调用.Remove不生效,需通过索引操作或重新构建规则集合。
解决方法1:通过索引移除并替换规则
# 获取WAF策略对象 $policy = Get-AzApplicationGatewayFirewallPolicy -Name $policyName -ResourceGroupName $policyRG # 找到目标规则的索引 $ruleIndex = ($policy.CustomRules | Where-Object {$_.Name -match "IPRestrict"}).Index # 移除指定索引的规则 $policy.CustomRules.RemoveAt($ruleIndex) # 创建修改后的新规则(根据实际需求调整参数) $newRule = New-AzApplicationGatewayFirewallCustomRule ` -Name "IPRestrict" ` -Priority 100 ` -RuleType MatchRule ` -MatchCondition (New-AzApplicationGatewayFirewallMatchCondition ` -MatchValue "2.3.6.9","原有IP地址..." ` -Operator IPMatch ` -MatchVariable RemoteAddr) ` -Action Block # 将新规则添加到策略中 $policy.CustomRules.Add($newRule) | Out-Null # 保存更新后的策略 Set-AzApplicationGatewayFirewallPolicy -InputObject $policy
解决方法2:重新构建规则集合
直接生成排除目标规则的新集合,再添加修改后的规则:
# 获取WAF策略对象 $policy = Get-AzApplicationGatewayFirewallPolicy -Name $policyName -ResourceGroupName $policyRG # 生成排除目标规则的新集合 $updatedRules = $policy.CustomRules | Where-Object {$_.Name -notmatch "IPRestrict"} # 创建修改后的新规则 $newRule = New-AzApplicationGatewayFirewallCustomRule ` -Name "IPRestrict" ` -Priority 100 ` -RuleType MatchRule ` -MatchCondition (New-AzApplicationGatewayFirewallMatchCondition ` -MatchValue "2.3.6.9","原有IP地址..." ` -Operator IPMatch ` -MatchVariable RemoteAddr) ` -Action Block # 将新规则加入集合并赋值回策略 $policy.CustomRules = $updatedRules + $newRule # 保存更新后的策略 Set-AzApplicationGatewayFirewallPolicy -InputObject $policy
内容的提问来源于stack exchange,提问作者jawad846
相关产品推荐
相关产品推荐

