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