AWS WAF: Как блокировать запросы, не содержащие определенного заголовка, с помощью Terraform

#terraform #terraform-provider-aws #amazon-waf

#terraform #terraform-provider-aws #amazon-waf

Вопрос:

Я хочу блокировать запросы, которые не содержат заголовка авторизации. Я придумал следующее правило, но я вижу, что запросы, которые не содержат этого заголовка, также разрешены. Как правильно указать это условие?

 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
    }
  }
  

Комментарии:

1. Также может быть полезно уточнить, что вы подразумеваете под «похоже, не работает». Как вы это тестировали и каков был результат?

2. Вы пробовали отправлять запрос с Authorization заголовком, но со значением нулевой длины? Мне интересно, пропускается ли это правило, если заголовок авторизации не существует. Возможно, было бы проще протестировать с ограничением размера, скажем, 3, и отправлять запросы с короткими и длинными значениями заголовка для проверки поведения

Ответ №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
    }
  }
...