【问题标题】:AWS WAF: How to block requests that do not contain a particular header using TerraformAWS WAF:如何使用 Terraform 阻止不包含特定标头的请求
【发布时间】:2021-01-13 15:27:47
【问题描述】:

我想阻止不包含授权标头的请求。我想出了以下规则,但我看到不包含此标头的请求也被允许。指定此条件的正确方法是什么?

rule {
    name = "restrict-requests-without-authorization-header"
    priority = 2

    action {
      block {}
    }

    statement {
      size_constraint_statement {
        field_to_match {
          single_header {
            name = "authorization"
          }
        }

        comparison_operator = "LE"
        size = 0
        text_transformation {
          priority = 0
          type = "NONE"
        }
      }
    }

    visibility_config {
      cloudwatch_metrics_enabled = true
      metric_name = "restrict-requests-without-authorization-header-metrics"
      sampled_requests_enabled = true
    }
  }

【问题讨论】:

  • 明确您所说的“似乎不起作用”可能也很有用。你是如何测试它的,结果如何?
  • 您是否尝试过发出 确实 具有 Authorization 标头但长度值为零的请求?我想知道如果 Authorization 标头不存在,是否会跳过此规则。使用例如 3 的大小限制并发送带有短和长标头值的请求来检查行为可能会更容易

标签: terraform terraform-provider-aws amazon-waf


【解决方案1】:

您需要像这样创建规则和正则表达式模式(可以是通配符):

规则:

rule {
    name     = "AuthorizationHeaderRule"
    priority = 1

    action {
      allow {}
    }

        statement {
          regex_pattern_set_reference_statement {
            arn = aws_wafv2_regex_pattern_set.your_regex_pattern.arn

            field_to_match {
              single_header {
                name = "authorization"
              }
            }

            text_transformation {
              priority = 2
              type     = "NONE"
            }
          }
      }

这可以是正则表达式模式:

resource "aws_wafv2_regex_pattern_set" "your_regex_pattern" {
  name  = "your-regex-pattern"
  scope = "REGIONAL"

  regular_expression {
    regex_string = "prefix-.*"
  }
}

【讨论】:

    【解决方案2】:
    http_headers_val_to_block = ["header01", "header02"]
    
    resource "aws_wafv2_regex_pattern_set" "http_headers" {
      name        = "HTTP_headers"
      description = "HTTP headers regex pattern set"
      scope       = "REGIONAL"
      tags        = var.tags
    
      dynamic "regular_expression" {
        for_each = var.http_headers_val_to_block
        content {
          regex_string = regular_expression.value
        }
      }
    }
    
    ...
    rule {
        name     = "IPs_and_HTTP_Header_Based_Rule"
        priority = 8
    
        action {
          block {}
        }
    
        statement {
    
          or_statement {
            statement {
    
              ip_set_reference_statement {
                arn = aws_wafv2_ip_set.toblock.arn
              }
            }
    
            statement {
    
              regex_pattern_set_reference_statement {
                arn = aws_wafv2_regex_pattern_set.http_headers.arn
    
                field_to_match {
                  single_header {
                    name = "referer"
                  }
                }
    
                text_transformation {
                  priority = 2
                  type     = "LOWERCASE"
                }
              }
            }
          }
        }
    
        visibility_config {
          cloudwatch_metrics_enabled = false
          metric_name                = "IPs-and-HTTP-Header-Based-Rule-metric"
          sampled_requests_enabled   = false
        }
      }
    ...
    

    【讨论】:

      猜你喜欢
      • 2021-06-25
      • 1970-01-01
      • 2020-04-04
      • 1970-01-01
      • 2021-01-01
      • 2017-01-13
      • 2021-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多