|
@@ -11,6 +11,46 @@
|
|
|
|
|
|
locals {
|
|
|
waf_name = replace(var.fqdns[0], ".", "_")
|
|
|
+
|
|
|
+ # A complicated building of managed rules. Each one builds on the previous.
|
|
|
+ managed_rules_0 = []
|
|
|
+ managed_rules_1 = var.excluded_set_AWSManagedRulesCommonRuleSet ? local.managed_rules_0 : concat(local.managed_rules_0, [{
|
|
|
+ "excluded_rules" : var.excluded_rules_AWSManagedRulesCommonRuleSet,
|
|
|
+ "name" : "AWSManagedRulesCommonRuleSet",
|
|
|
+ "override_action" : var.block_settings["AWSManagedRulesCommonRuleSet"] ? "none" : "count",
|
|
|
+ "priority" : 510
|
|
|
+ }])
|
|
|
+ managed_rules_2 = var.excluded_set_AWSManagedRulesAmazonIpReputationList ? local.managed_rules_1 : concat(local.managed_rules_1, [{
|
|
|
+ "excluded_rules" : var.excluded_rules_AWSManagedRulesAmazonIpReputationList,
|
|
|
+ "name" : "AWSManagedRulesAmazonIpReputationList",
|
|
|
+ "override_action" : var.block_settings["AWSManagedRulesAmazonIpReputationList"] ? "none" : "count",
|
|
|
+ "priority" : 520
|
|
|
+ }])
|
|
|
+ managed_rules_3 = var.excluded_set_AWSManagedRulesKnownBadInputsRuleSet ? local.managed_rules_2 : concat(local.managed_rules_2, [{
|
|
|
+ "excluded_rules" : var.excluded_rules_AWSManagedRulesKnownBadInputsRuleSet,
|
|
|
+ "name" : "AWSManagedRulesKnownBadInputsRuleSet",
|
|
|
+ "override_action" : var.block_settings["AWSManagedRulesKnownBadInputsRuleSet"] ? "none" : "count",
|
|
|
+ "priority" : 530
|
|
|
+ }])
|
|
|
+ managed_rules_4 = var.excluded_set_AWSManagedRulesSQLiRuleSet ? local.managed_rules_3 : concat(local.managed_rules_3, [{
|
|
|
+ "excluded_rules" : var.excluded_rules_AWSManagedRulesSQLiRuleSet,
|
|
|
+ "name" : "AWSManagedRulesSQLiRuleSet",
|
|
|
+ "override_action" : var.block_settings["AWSManagedRulesSQLiRuleSet"] ? "none" : "count",
|
|
|
+ "priority" : 540
|
|
|
+ }])
|
|
|
+ managed_rules_5 = var.excluded_set_AWSManagedRulesLinuxRuleSet ? local.managed_rules_4 : concat(local.managed_rules_4, [{
|
|
|
+ "excluded_rules" : var.excluded_rules_AWSManagedRulesLinuxRuleSet,
|
|
|
+ "name" : "AWSManagedRulesLinuxRuleSet",
|
|
|
+ "override_action" : var.block_settings["AWSManagedRulesLinuxRuleSet"] ? "none" : "count",
|
|
|
+ "priority" : 550
|
|
|
+ }])
|
|
|
+ managed_rules_6 = var.excluded_set_AWSManagedRulesUnixRuleSet ? local.managed_rules_5 : concat(local.managed_rules_5, [{
|
|
|
+ "excluded_rules" : var.excluded_rules_AWSManagedRulesUnixRuleSet,
|
|
|
+ "name" : "AWSManagedRulesUnixRuleSet",
|
|
|
+ "override_action" : var.block_settings["AWSManagedRulesUnixRuleSet"] ? "none" : "count",
|
|
|
+ "priority" : 560
|
|
|
+ }])
|
|
|
+ managed_rules = local.managed_rules_6
|
|
|
}
|
|
|
|
|
|
resource "aws_wafv2_ip_set" "blocked" {
|
|
@@ -70,7 +110,17 @@ resource "aws_wafv2_rule_group" "xdr_custom_rules" {
|
|
|
priority = 100
|
|
|
|
|
|
action {
|
|
|
- block {}
|
|
|
+ # WAF rule's strange data format makes this a little complex,
|
|
|
+ # but the end result is that if block_settings["custom"] is
|
|
|
+ # set to true, it will block. Otherwise, it will count.
|
|
|
+ dynamic "block" {
|
|
|
+ for_each = var.block_settings["custom"] ? ["block"] : []
|
|
|
+ content {}
|
|
|
+ }
|
|
|
+ dynamic "count" {
|
|
|
+ for_each = var.block_settings["custom"] ? [] : ["count"]
|
|
|
+ content {}
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
statement {
|
|
@@ -102,7 +152,17 @@ resource "aws_wafv2_rule_group" "xdr_custom_rules" {
|
|
|
priority = 110
|
|
|
|
|
|
action {
|
|
|
- block {}
|
|
|
+ # WAF rule's strange data format makes this a little complex,
|
|
|
+ # but the end result is that if block_settings["custom"] is
|
|
|
+ # set to true, it will block. Otherwise, it will count.
|
|
|
+ dynamic "block" {
|
|
|
+ for_each = var.block_settings["admin"] ? ["block"] : []
|
|
|
+ content {}
|
|
|
+ }
|
|
|
+ dynamic "count" {
|
|
|
+ for_each = var.block_settings["admin"] ? [] : ["count"]
|
|
|
+ content {}
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
statement {
|
|
@@ -137,7 +197,6 @@ resource "aws_wafv2_rule_group" "xdr_custom_rules" {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -291,7 +350,7 @@ module "wafv2" {
|
|
|
|
|
|
alb_arn = var.resource_arn
|
|
|
associate_alb = true
|
|
|
- default_action = "block" # Note: The final action is actually to 'allow', provided the host header is correct
|
|
|
+ default_action = var.block_settings["default"] ? "block" : "allow" # Note: Even in block, the final action is actually to 'allow' if the host header is correct
|
|
|
|
|
|
filtered_header_rule = {
|
|
|
header_types = var.fqdns
|
|
@@ -324,7 +383,7 @@ module "wafv2" {
|
|
|
name = aws_wafv2_rule_group.xdr_custom_rules.name
|
|
|
arn = aws_wafv2_rule_group.xdr_custom_rules.arn
|
|
|
priority = 100
|
|
|
- override_action = "none"
|
|
|
+ override_action = var.block_settings["custom"] ? "none" : "count"
|
|
|
excluded_rules = []
|
|
|
}
|
|
|
]
|
|
@@ -340,44 +399,7 @@ module "wafv2" {
|
|
|
|
|
|
# AWS managed rulesets
|
|
|
# Baseline was from trussworks/wafv2/aws, but copied here to be customized for our use and renumbered.
|
|
|
- managed_rules = [
|
|
|
- {
|
|
|
- "excluded_rules" : var.excluded_rules_AWSManagedRulesCommonRuleSet,
|
|
|
- "name" : "AWSManagedRulesCommonRuleSet",
|
|
|
- "override_action" : "none",
|
|
|
- "priority" : 510
|
|
|
- },
|
|
|
- {
|
|
|
- "excluded_rules" : var.excluded_rules_AWSManagedRulesAmazonIpReputationList,
|
|
|
- "name" : "AWSManagedRulesAmazonIpReputationList",
|
|
|
- "override_action" : "none",
|
|
|
- "priority" : 520
|
|
|
- },
|
|
|
- {
|
|
|
- "excluded_rules" : var.excluded_rules_AWSManagedRulesKnownBadInputsRuleSet,
|
|
|
- "name" : "AWSManagedRulesKnownBadInputsRuleSet",
|
|
|
- "override_action" : "none",
|
|
|
- "priority" : 530
|
|
|
- },
|
|
|
- {
|
|
|
- "excluded_rules" : var.excluded_rules_AWSManagedRulesSQLiRuleSet,
|
|
|
- "name" : "AWSManagedRulesSQLiRuleSet",
|
|
|
- "override_action" : "none",
|
|
|
- "priority" : 540
|
|
|
- },
|
|
|
- {
|
|
|
- "excluded_rules" : var.excluded_rules_AWSManagedRulesLinuxRuleSet,
|
|
|
- "name" : "AWSManagedRulesLinuxRuleSet",
|
|
|
- "override_action" : "none",
|
|
|
- "priority" : 550
|
|
|
- },
|
|
|
- {
|
|
|
- "excluded_rules" : var.excluded_rules_AWSManagedRulesUnixRuleSet,
|
|
|
- "name" : "AWSManagedRulesUnixRuleSet",
|
|
|
- "override_action" : "none",
|
|
|
- "priority" : 560
|
|
|
- }
|
|
|
- ]
|
|
|
+ managed_rules = local.managed_rules
|
|
|
|
|
|
depends_on = [aws_wafv2_rule_group.xdr_custom_rules]
|
|
|
tags = var.tags
|