Skip to content

Commit fbdfa2f

Browse files
Ptnan7Jingnan Xu
andauthored
{FrontDoor} Add Ddos ruleset support (#9390)
* generate * runtest * update changelog --------- Co-authored-by: Jingnan Xu <[email protected]>
1 parent a2ecd95 commit fbdfa2f

32 files changed

+2654
-5241
lines changed

src/front-door/HISTORY.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22
33
Release History
44
===============
5+
6+
1.4.0
7+
++++++
8+
* Bump swagger version to 2025-10-01
9+
* Add support for DDos RuleSet
10+
511
1.3.0
612
++++++
713
* Add support for captcha

src/front-door/azext_front_door/aaz/latest/network/front_door/waf_policy/_create.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,15 @@
1616
)
1717
class Create(AAZCommand):
1818
"""Create policy with specified rule set name within a resource group.
19+
20+
:example: Creates specific policy
21+
az network front-door waf-policy create --resource-group rg1 --policy-name Policy1 --location WestUs --enabled-state Enabled --mode Prevention --redirect-url http://www.bing.com --custom-block-response-status-code 429 --custom-block-response-body PGh0bWw+CjxoZWFkZXI+PHRpdGxlPkhlbGxvPC90aXRsZT48L2hlYWRlcj4KPGJvZHk+CkhlbGxvIHdvcmxkCjwvYm9keT4KPC9odG1sPg== --request-body-check Disabled --javascript-challenge-expiration-in-minutes 30 --captcha-expiration-in-minutes 30 --log-scrubbing "{state:Enabled,scrubbing-rules:[{match-variable:RequestIPAddress,selector-match-operator:EqualsAny,selector:null,state:Enabled}]}" --custom-rules "{rules:[{name:Rule1,priority:1,rule-type:RateLimitRule,rate-limit-threshold:1000,match-conditions:[{match-variable:RemoteAddr,operator:IPMatch,match-value:[192.168.1.0/24,10.0.0.0/24]}],action:Block},{name:Rule2,priority:2,rule-type:MatchRule,match-conditions:[{match-variable:RemoteAddr,operator:GeoMatch,match-value:[CH]},{match-variable:RequestHeader,operator:Contains,selector:UserAgent,match-value:[windows],transforms:[Lowercase]}],action:Block},{name:Rule3,priority:1,rule-type:RateLimitRule,rate-limit-threshold:1000,match-conditions:[{match-variable:RemoteAddr,operator:ServiceTagMatch,match-value:[AzureBackup,AzureBotService]}],action:CAPTCHA}]}" --managed-rules "{managed-rule-sets:[{rule-set-type:DefaultRuleSet,rule-set-version:1.0,rule-set-action:Block,exclusions:[{matchVariable:RequestHeaderNames,selectorMatchOperator:Equals,selector:User-Agent}],rule-group-overrides:[{rule-group-name:SQLI,exclusions:[{matchVariable:RequestCookieNames,selectorMatchOperator:StartsWith,selector:token}],rules:[{rule-id:942100,enabled-state:Enabled,action:Redirect,exclusions:[{matchVariable:QueryStringArgNames,selectorMatchOperator:Equals,selector:query}]},{rule-id:942110,enabled-state:Disabled}]}]},{rule-set-type:Microsoft_HTTPDDoSRuleSet,rule-set-version:1.0,rule-group-overrides:[{rule-group-name:ExcessiveRequests,rules:[{rule-id:500100,enabled-state:Enabled,action:Block,sensitivity:High}]}]}]}" --sku Premium_AzureFrontDoor
1922
"""
2023

2124
_aaz_info = {
22-
"version": "2025-03-01",
25+
"version": "2025-10-01",
2326
"resources": [
24-
["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.network/frontdoorwebapplicationfirewallpolicies/{}", "2025-03-01"],
27+
["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.network/frontdoorwebapplicationfirewallpolicies/{}", "2025-10-01"],
2528
]
2629
}
2730

@@ -290,7 +293,7 @@ def _build_arguments_schema(cls, *args, **kwargs):
290293
options=["operator"],
291294
help="Comparison type to use for matching with the variable value.",
292295
required=True,
293-
enum={"Any": "Any", "BeginsWith": "BeginsWith", "Contains": "Contains", "EndsWith": "EndsWith", "Equal": "Equal", "GeoMatch": "GeoMatch", "GreaterThan": "GreaterThan", "GreaterThanOrEqual": "GreaterThanOrEqual", "IPMatch": "IPMatch", "LessThan": "LessThan", "LessThanOrEqual": "LessThanOrEqual", "RegEx": "RegEx"},
296+
enum={"Any": "Any", "BeginsWith": "BeginsWith", "Contains": "Contains", "EndsWith": "EndsWith", "Equal": "Equal", "GeoMatch": "GeoMatch", "GreaterThan": "GreaterThan", "GreaterThanOrEqual": "GreaterThanOrEqual", "IPMatch": "IPMatch", "LessThan": "LessThan", "LessThanOrEqual": "LessThanOrEqual", "RegEx": "RegEx", "ServiceTagMatch": "ServiceTagMatch"},
294297
)
295298
_element.selector = AAZStrArg(
296299
options=["selector"],
@@ -392,6 +395,11 @@ def _build_arguments_schema(cls, *args, **kwargs):
392395
help="Identifier for the managed rule.",
393396
required=True,
394397
)
398+
_element.sensitivity = AAZStrArg(
399+
options=["sensitivity"],
400+
help="Describes the override sensitivity to be applied when rule matches.",
401+
enum={"High": "High", "Low": "Low", "Medium": "Medium"},
402+
)
395403

396404
exclusions = cls._args_schema.managed_rules.managed_rule_sets.Element.rule_group_overrides.Element.rules.Element.exclusions
397405
exclusions.Element = AAZObjectArg()
@@ -525,7 +533,7 @@ def url_parameters(self):
525533
def query_parameters(self):
526534
parameters = {
527535
**self.serialize_query_param(
528-
"api-version", "2025-03-01",
536+
"api-version", "2025-10-01",
529537
required=True,
530538
),
531539
}
@@ -655,6 +663,7 @@ def content(self):
655663
_elements.set_prop("enabledState", AAZStrType, ".enabled_state")
656664
_elements.set_prop("exclusions", AAZListType, ".exclusions")
657665
_elements.set_prop("ruleId", AAZStrType, ".rule_id", typ_kwargs={"flags": {"required": True}})
666+
_elements.set_prop("sensitivity", AAZStrType, ".sensitivity")
658667

659668
exclusions = _builder.get(".properties.managedRules.managedRuleSets[].ruleGroupOverrides[].rules[].exclusions")
660669
if exclusions is not None:
@@ -961,6 +970,7 @@ def _build_schema_web_application_firewall_policy_read(cls, _schema):
961970
serialized_name="ruleId",
962971
flags={"required": True},
963972
)
973+
_element.sensitivity = AAZStrType()
964974

965975
exclusions = _schema_web_application_firewall_policy_read.properties.managed_rules.managed_rule_sets.Element.rule_group_overrides.Element.rules.Element.exclusions
966976
exclusions.Element = AAZObjectType()

src/front-door/azext_front_door/aaz/latest/network/front_door/waf_policy/_delete.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,15 @@
1616
)
1717
class Delete(AAZCommand):
1818
"""Delete Policy
19+
20+
:example: Delete protection policy
21+
az network front-door waf-policy delete --resource-group rg1 --policy-name Policy1
1922
"""
2023

2124
_aaz_info = {
22-
"version": "2025-03-01",
25+
"version": "2025-10-01",
2326
"resources": [
24-
["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.network/frontdoorwebapplicationfirewallpolicies/{}", "2025-03-01"],
27+
["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.network/frontdoorwebapplicationfirewallpolicies/{}", "2025-10-01"],
2528
]
2629
}
2730

@@ -142,7 +145,7 @@ def url_parameters(self):
142145
def query_parameters(self):
143146
parameters = {
144147
**self.serialize_query_param(
145-
"api-version", "2025-03-01",
148+
"api-version", "2025-10-01",
146149
required=True,
147150
),
148151
}

src/front-door/azext_front_door/aaz/latest/network/front_door/waf_policy/_list.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,15 @@
1616
)
1717
class List(AAZCommand):
1818
"""List all of the protection policies within a resource group.
19+
20+
:example: Get all Policies in a Resource Group
21+
az network front-door waf-policy list --resource-group rg1
1922
"""
2023

2124
_aaz_info = {
22-
"version": "2025-03-01",
25+
"version": "2025-10-01",
2326
"resources": [
24-
["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.network/frontdoorwebapplicationfirewallpolicies", "2025-03-01"],
27+
["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.network/frontdoorwebapplicationfirewallpolicies", "2025-10-01"],
2528
]
2629
}
2730

@@ -109,7 +112,7 @@ def url_parameters(self):
109112
def query_parameters(self):
110113
parameters = {
111114
**self.serialize_query_param(
112-
"api-version", "2025-03-01",
115+
"api-version", "2025-10-01",
113116
required=True,
114117
),
115118
}
@@ -337,6 +340,7 @@ def _build_schema_on_200(cls):
337340
serialized_name="ruleId",
338341
flags={"required": True},
339342
)
343+
_element.sensitivity = AAZStrType()
340344

341345
exclusions = cls._schema_on_200.value.Element.properties.managed_rules.managed_rule_sets.Element.rule_group_overrides.Element.rules.Element.exclusions
342346
exclusions.Element = AAZObjectType()

src/front-door/azext_front_door/aaz/latest/network/front_door/waf_policy/_show.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,15 @@
1616
)
1717
class Show(AAZCommand):
1818
"""Get protection policy with specified name within a resource group.
19+
20+
:example: Get Policy
21+
az network front-door waf-policy show --resource-group rg1 --policy-name Policy1
1922
"""
2023

2124
_aaz_info = {
22-
"version": "2025-03-01",
25+
"version": "2025-10-01",
2326
"resources": [
24-
["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.network/frontdoorwebapplicationfirewallpolicies/{}", "2025-03-01"],
27+
["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.network/frontdoorwebapplicationfirewallpolicies/{}", "2025-10-01"],
2528
]
2629
}
2730

@@ -120,7 +123,7 @@ def url_parameters(self):
120123
def query_parameters(self):
121124
parameters = {
122125
**self.serialize_query_param(
123-
"api-version", "2025-03-01",
126+
"api-version", "2025-10-01",
124127
required=True,
125128
),
126129
}
@@ -337,6 +340,7 @@ def _build_schema_on_200(cls):
337340
serialized_name="ruleId",
338341
flags={"required": True},
339342
)
343+
_element.sensitivity = AAZStrType()
340344

341345
exclusions = cls._schema_on_200.properties.managed_rules.managed_rule_sets.Element.rule_group_overrides.Element.rules.Element.exclusions
342346
exclusions.Element = AAZObjectType()

src/front-door/azext_front_door/aaz/latest/network/front_door/waf_policy/_update.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,15 @@ class Update(AAZCommand):
2121
az network front-door waf-policy update -g rg -n n1 --log-scrubbing "{scrubbing-rules:[{match-variable:QueryStringArgNames,selector-match-operator:EqualsAny}],state:Enabled}"
2222
az network front-door waf-policy update -g rg -n n1 --log-scrubbing scrubbing-rules[1]="{match-variable:RequestUri,selector-match-operator:Equals}"
2323
az network front-door waf-policy update -g rg -n n1 --log-scrubbing "{scrubbing-rules:[{match-variable:RequestBodyJsonArgNames,selector-match-operator:EqualsAny}],state:Enabled}" scrubbing-rules[1]="{match-variable:RequestUri,selector-match-operator:EqualsAny}"
24+
25+
:example: Update specific policy
26+
az network front-door waf-policy update --resource-group rg1 --policy-name Policy1 --location WestUs --enabled-state Enabled --mode Prevention --redirect-url http://www.bing.com --custom-block-response-status-code 429 --custom-block-response-body PGh0bWw+CjxoZWFkZXI+PHRpdGxlPkhlbGxvPC90aXRsZT48L2hlYWRlcj4KPGJvZHk+CkhlbGxvIHdvcmxkCjwvYm9keT4KPC9odG1sPg== --request-body-check Disabled --javascript-challenge-expiration-in-minutes 30 --captcha-expiration-in-minutes 30 --log-scrubbing "{state:Enabled,scrubbing-rules:[{match-variable:RequestIPAddress,selector-match-operator:EqualsAny,selector:null,state:Enabled}]}" --custom-rules "{rules:[{name:Rule1,priority:1,rule-type:RateLimitRule,rate-limit-threshold:1000,match-conditions:[{match-variable:RemoteAddr,operator:IPMatch,match-value:[192.168.1.0/24,10.0.0.0/24]}],action:Block},{name:Rule2,priority:2,rule-type:MatchRule,match-conditions:[{match-variable:RemoteAddr,operator:GeoMatch,match-value:[CH]},{match-variable:RequestHeader,operator:Contains,selector:UserAgent,match-value:[windows],transforms:[Lowercase]}],action:Block},{name:Rule3,priority:1,rule-type:RateLimitRule,rate-limit-threshold:1000,match-conditions:[{match-variable:RemoteAddr,operator:ServiceTagMatch,match-value:[AzureBackup,AzureBotService]}],action:CAPTCHA}]}" --managed-rules "{managed-rule-sets:[{rule-set-type:DefaultRuleSet,rule-set-version:1.0,rule-set-action:Block,exclusions:[{matchVariable:RequestHeaderNames,selectorMatchOperator:Equals,selector:User-Agent}],rule-group-overrides:[{rule-group-name:SQLI,exclusions:[{matchVariable:RequestCookieNames,selectorMatchOperator:StartsWith,selector:token}],rules:[{rule-id:942100,enabled-state:Enabled,action:Redirect,exclusions:[{matchVariable:QueryStringArgNames,selectorMatchOperator:Equals,selector:query}]},{rule-id:942110,enabled-state:Disabled}]}]},{rule-set-type:Microsoft_HTTPDDoSRuleSet,rule-set-version:1.0,rule-group-overrides:[{rule-group-name:ExcessiveRequests,rules:[{rule-id:500100,enabled-state:Enabled,action:Block,sensitivity:High}]}]}]}" --sku Premium_AzureFrontDoor
2427
"""
2528

2629
_aaz_info = {
27-
"version": "2025-03-01",
30+
"version": "2025-10-01",
2831
"resources": [
29-
["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.network/frontdoorwebapplicationfirewallpolicies/{}", "2025-03-01"],
32+
["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.network/frontdoorwebapplicationfirewallpolicies/{}", "2025-10-01"],
3033
]
3134
}
3235

@@ -320,7 +323,7 @@ def _build_arguments_schema(cls, *args, **kwargs):
320323
_element.operator = AAZStrArg(
321324
options=["operator"],
322325
help="Comparison type to use for matching with the variable value.",
323-
enum={"Any": "Any", "BeginsWith": "BeginsWith", "Contains": "Contains", "EndsWith": "EndsWith", "Equal": "Equal", "GeoMatch": "GeoMatch", "GreaterThan": "GreaterThan", "GreaterThanOrEqual": "GreaterThanOrEqual", "IPMatch": "IPMatch", "LessThan": "LessThan", "LessThanOrEqual": "LessThanOrEqual", "RegEx": "RegEx"},
326+
enum={"Any": "Any", "BeginsWith": "BeginsWith", "Contains": "Contains", "EndsWith": "EndsWith", "Equal": "Equal", "GeoMatch": "GeoMatch", "GreaterThan": "GreaterThan", "GreaterThanOrEqual": "GreaterThanOrEqual", "IPMatch": "IPMatch", "LessThan": "LessThan", "LessThanOrEqual": "LessThanOrEqual", "RegEx": "RegEx", "ServiceTagMatch": "ServiceTagMatch"},
324327
)
325328
_element.selector = AAZStrArg(
326329
options=["selector"],
@@ -442,6 +445,12 @@ def _build_arguments_schema(cls, *args, **kwargs):
442445
options=["rule-id"],
443446
help="Identifier for the managed rule.",
444447
)
448+
_element.sensitivity = AAZStrArg(
449+
options=["sensitivity"],
450+
help="Describes the override sensitivity to be applied when rule matches.",
451+
nullable=True,
452+
enum={"High": "High", "Low": "Low", "Medium": "Medium"},
453+
)
445454

446455
exclusions = cls._args_schema.managed_rules.managed_rule_sets.Element.rule_group_overrides.Element.rules.Element.exclusions
447456
exclusions.Element = AAZObjectArg(
@@ -573,7 +582,7 @@ def url_parameters(self):
573582
def query_parameters(self):
574583
parameters = {
575584
**self.serialize_query_param(
576-
"api-version", "2025-03-01",
585+
"api-version", "2025-10-01",
577586
required=True,
578587
),
579588
}
@@ -672,7 +681,7 @@ def url_parameters(self):
672681
def query_parameters(self):
673682
parameters = {
674683
**self.serialize_query_param(
675-
"api-version", "2025-03-01",
684+
"api-version", "2025-10-01",
676685
required=True,
677686
),
678687
}
@@ -835,6 +844,7 @@ def _update_instance(self, instance):
835844
_elements.set_prop("enabledState", AAZStrType, ".enabled_state")
836845
_elements.set_prop("exclusions", AAZListType, ".exclusions")
837846
_elements.set_prop("ruleId", AAZStrType, ".rule_id", typ_kwargs={"flags": {"required": True}})
847+
_elements.set_prop("sensitivity", AAZStrType, ".sensitivity")
838848

839849
exclusions = _builder.get(".properties.managedRules.managedRuleSets[].ruleGroupOverrides[].rules[].exclusions")
840850
if exclusions is not None:
@@ -1129,6 +1139,7 @@ def _build_schema_web_application_firewall_policy_read(cls, _schema):
11291139
serialized_name="ruleId",
11301140
flags={"required": True},
11311141
)
1142+
_element.sensitivity = AAZStrType()
11321143

11331144
exclusions = _schema_web_application_firewall_policy_read.properties.managed_rules.managed_rule_sets.Element.rule_group_overrides.Element.rules.Element.exclusions
11341145
exclusions.Element = AAZObjectType()

src/front-door/azext_front_door/aaz/latest/network/front_door/waf_policy/_wait.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class Wait(AAZWaitCommand):
2020

2121
_aaz_info = {
2222
"resources": [
23-
["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.network/frontdoorwebapplicationfirewallpolicies/{}", "2025-03-01"],
23+
["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/microsoft.network/frontdoorwebapplicationfirewallpolicies/{}", "2025-10-01"],
2424
]
2525
}
2626

@@ -119,7 +119,7 @@ def url_parameters(self):
119119
def query_parameters(self):
120120
parameters = {
121121
**self.serialize_query_param(
122-
"api-version", "2025-03-01",
122+
"api-version", "2025-10-01",
123123
required=True,
124124
),
125125
}
@@ -336,6 +336,7 @@ def _build_schema_on_200(cls):
336336
serialized_name="ruleId",
337337
flags={"required": True},
338338
)
339+
_element.sensitivity = AAZStrType()
339340

340341
exclusions = cls._schema_on_200.properties.managed_rules.managed_rule_sets.Element.rule_group_overrides.Element.rules.Element.exclusions
341342
exclusions.Element = AAZObjectType()
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
"azext.minCliCoreVersion": "2.67.0"
2+
"azext.minCliCoreVersion": "2.70.0"
33
}

0 commit comments

Comments
 (0)