如何创建复杂的自定义 AWS WAF JSON 规则?
上次更新日期:2022 年 7月 21 日
如何创建复杂的自定义 AWS WAF JSON 规则?
解决方法
添加适用于 AWS WAF 的自定义规则时,在规则 JSON 编辑器中创建复杂的自定义规则。在 AWS WAF 控制台的 Web ACL 和规则组中创建和管理规则。您可以在定义规则的规则组或 Web ACL 中按名称访问规则。
如果您的使用案例要求自定义规则需要 AND、OR 或 NOT 逻辑(嵌套语句)的组合,则必须使用 JSON 编辑器创建规则。有关更多信息,请参阅 AWS WAF 规则语句。
提示:您可以使用位于 AWS WAF 控制台的规则可视化编辑器来创建与您的使用案例类似的规则语句。然后,要查看 JSON 语句,请选择规则 JSON 编辑器并在 JSON 编辑器中进行必要的更改。
以下示例提供了可用于创建自己的自定义规则逻辑的参考:
示例 1
这是一个自定义规则语句,如果请求源自 美国 – US 且 URI 为 /wp-admin/ 或 /wp-login/,则允许此请求:
规则逻辑:如果请求是(来自美国)且 URI 为(/a 或 /b)。
{
"Name": "test",
"Priority": 100,
"Statement": {
"AndStatement": {
"Statements": [
{
"GeoMatchStatement": {
"CountryCodes": [
"US"
]
}
},
{
"OrStatement": {
"Statements": [
{
"ByteMatchStatement": {
"SearchString": "/wp-admin/",
"FieldToMatch": {
"UriPath": {}
},
"TextTransformations": [
{
"Priority": 0,
"Type": "NONE"
}
],
"PositionalConstraint": "CONTAINS"
}
},
{
"ByteMatchStatement": {
"SearchString": "/wp-login/",
"FieldToMatch": {
"UriPath": {}
},
"TextTransformations": [
{
"Priority": 0,
"Type": "NONE"
}
],
"PositionalConstraint": "CONTAINS"
}
}
]
}
}
]
}
},
"Action": {
"Allow": {}
},
"VisibilityConfig": {
"SampledRequestsEnabled": true,
"CloudWatchMetricsEnabled": true,
"MetricName": "test"
}
}
示例 2
这是一个自定义规则语句,如果请求的正文中有 XSS 签名,它将阻止此请求,但从检查中排除 URI /test、/login 和 /admin:
规则逻辑:如果请求具有(正文中的 XSS 签名)且 URI 不是(/a、/b 或 /c)。
{
"Name": "XSS_Block_Allow_Uploads",
"Priority": 100,
"Statement": {
"AndStatement": {
"Statements": [
{
"XssMatchStatement": {
"FieldToMatch": {
"Body": {}
},
"TextTransformations": [
{
"Priority": 0,
"Type": "NONE"
}
]
}
},
{
"NotStatement": {
"Statement": {
"OrStatement": {
"Statements": [
{
"ByteMatchStatement": {
"SearchString": "/test",
"FieldToMatch": {
"UriPath": {}
},
"TextTransformations": [
{
"Priority": 0,
"Type": "NONE"
}
],
"PositionalConstraint": "EXACTLY"
}
},
{
"ByteMatchStatement": {
"SearchString": "/admin",
"FieldToMatch": {
"UriPath": {}
},
"TextTransformations": [
{
"Priority": 0,
"Type": "NONE"
}
],
"PositionalConstraint": "EXACTLY"
}
},
{
"ByteMatchStatement": {
"SearchString": "/login",
"FieldToMatch": {
"UriPath": {}
},
"TextTransformations": [
{
"Priority": 0,
"Type": "NONE"
}
],
"PositionalConstraint": "EXACTLY"
}
}
]
}
}
}
}
]
}
},
"Action": {
"Block": {}
},
"VisibilityConfig": {
"SampledRequestsEnabled": true,
"CloudWatchMetricsEnabled": true,
"MetricName": "XSS_Block_Allow_Uploads"
}
}
示例 3
这是一个自定义规则语句,如果请求包含自定义标签内部,但主机、IP 和 URI 不是特定的组合,则此语句会阻止请求:
规则逻辑:如果请求(包含标签),但不是(URI、IP 和主机),则阻止。
{
"Name": "Block_internal_unauthorized",
"Priority": 100,
"Statement": {
"AndStatement": {
"Statements": [
{
"LabelMatchStatement": {
"Scope": "LABEL",
"Key": "internal"
}
},
{
"NotStatement": {
"Statement": {
"AndStatement": {
"Statements": [
{
"ByteMatchStatement": {
"FieldToMatch": {
"UriPath": {}
},
"PositionalConstraint": "EXACTLY",
"SearchString": "/test",
"TextTransformations": [{
"Type": "NONE",
"Priority": 0
}]
}
},
{
"IPSetReferenceStatement": {
"ARN": "arn:aws:wafv2:us-east-1:xxxxxxxxxxxx:regional/ipset/internal_IPs/xxx-xx-xxx"
}
},
{
"ByteMatchStatement": {
"FieldToMatch": {
"SingleHeader": {
"Name": "host"
}
},
"PositionalConstraint": "EXACTLY",
"SearchString": "example.com",
"TextTransformations": [{
"Type": "NONE",
"Priority": 0
}]
}
}
]
}
}
}
}
]
}
},
"Action": {
"Block": {}
},
"VisibilityConfig": {
"SampledRequestsEnabled": true,
"CloudWatchMetricsEnabled": true,
"MetricName": "Block_internal_unauthorized"
}
}