如何创建含多条托管规则语句的AWS WAF ACL(Terraform排错)
问题根因
报错由两个核心问题导致:
- 你配置的
AWSManagedRulesATPRuleSet(AWS账户接管防护托管规则组)属于高级付费规则集,AWS API强制要求传入规则集专属配置ManagedRuleSetConfig,你当前代码完全缺失该配置块。 - 第三个规则的自定义名称存在拼写错误:
acccount-takeover-rules多写了一个c,虽然不会直接触发API报错,但会导致后续运维时指标名、规则名不匹配,增加排查成本。
你当前的规则执行顺序逻辑是符合WAF规则的:WAF优先级数值越小越先执行,现有0:通用规则集 -> 1:IP信誉规则集 -> 2:ATP规则集的配置会按顺序完成评估。如果需要优先级从1开始编号,直接修改priority数值即可,WAF不要求优先级编号从0开始或连续。
修正方案
- 给ATP规则组添加必填的
managed_rule_group_configs配置块,明确指定业务实际的登录接口路径,可按需补充请求字段、响应状态码的匹配规则,提升撞库、暴力破解检测的准确率。 - 如果你使用5.0及以上版本的AWS Terraform Provider,给另外两个普通托管规则组加上空的
managed_rule_group_configs块,适配新版API的参数校验要求。 - 修正第三个规则的名称拼写错误。
修正后的完整代码
resource "aws_wafv2_web_acl" "acl" { name = "us-blog-production-waf-acl" scope = "REGIONAL" default_action { allow {} } rule { name = "managed-common-rules" # 如果需要优先级从1开始,把三个规则的priority依次改为1、2、3即可 priority = 0 override_action { none {} } statement { managed_rule_group_statement { name = "AWSManagedRulesCommonRuleSet" vendor_name = "AWS" # 高版本Provider需加空配置块适配API校验 managed_rule_group_configs {} } } visibility_config { cloudwatch_metrics_enabled = true metric_name = "us-blog-production-managed-common-rules" sampled_requests_enabled = true } } rule { name = "ip-reputation-rules" priority = 1 override_action { none {} } statement { managed_rule_group_statement { name = "AWSManagedRulesAmazonIpReputationList" vendor_name = "AWS" # 高版本Provider需加空配置块适配API校验 managed_rule_group_configs {} } } visibility_config { cloudwatch_metrics_enabled = true metric_name = "us-blog-production-ip-reputation-rules" sampled_requests_enabled = true } } rule { # 修正拼写错误 name = "account-takeover-rules" priority = 2 override_action { none {} } statement { managed_rule_group_statement { name = "AWSManagedRulesATPRuleSet" vendor_name = "AWS" # ATP规则组必填配置 managed_rule_group_configs { aws_managed_rules_atp_rule_set { # 替换为你站点实际的登录路径,WordPress站点默认是/wp-login.php login_path = "/wp-login.php" # 以下可选配置按需开启,适配站点登录表单的实际参数 # request_inspection { # payload_type = "FORM_ENCODED" # username_field { # identifier = "log" # } # password_field { # identifier = "pwd" # } # } # response_inspection { # status_code { # success_codes = [200, 302] # failure_codes = [401, 403] # } # } } } } } visibility_config { cloudwatch_metrics_enabled = true metric_name = "us-blog-production-account-takeover-rules" sampled_requests_enabled = true } } visibility_config { cloudwatch_metrics_enabled = false metric_name = "us-blog-production-waf" sampled_requests_enabled = false } }
上线注意事项
AWSManagedRulesATPRuleSet是按请求量计费的付费规则集,正式上线前请确认对应计费标准,避免产生非预期成本。- 如果该WAF是为CloudFront分发配置的,需要把
scope参数改为CLOUDFRONT,并且将该资源部署在us-east-1区域。 - 规则上线初期建议先把所有规则的
override_action从none {}改为count {}跑1-3天观察日志,确认无误杀正常请求后再切回none {}开启正式拦截。
内容的提问来源于stack exchange,提问作者diegoaguilar
相关产品推荐
相关产品推荐

