Closed9

AWS WAF で使用している Managed Rule を特定の path へのアクセスについて無効にしたい

snakasnaka

前述の記事を参考にやってみる

  • Rule set : AWSManagedRulesSQLiRuleSet
  • Rule : SQLi_BODY

こういう状態にしたい

snakasnaka

Terraform での Override 方法を確認する

resource "aws_wafv2_web_acl" "example" {
  ... (snip) ...
  rule {
    name     = "rule-1"
    priority = 1

    override_action {
      count {}
    }

    statement {
      managed_rule_group_statement {
        name        = "AWSManagedRulesCommonRuleSet"
        vendor_name = "AWS"

        rule_action_override {
          action_to_use {
            count {}
          }

          name = "SizeRestrictions_QUERYSTRING"
        }
      }
    }

aws_wafv2_web_acl リソースの rule_action_override でよさそう

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/wafv2_web_acl#override_action-block

snakasnaka

AWSManagedRulesSQLiRuleSet マネージドルールセットのうち SQLi_BODY ルールについて
COUNT に変更する

  rule {
    name     = "AWS-AWSManagedRulesSQLiRuleSet"
    priority = 6

    override_action {
      none {}
    }

    statement {
      managed_rule_group_statement {
        name        = "AWSManagedRulesSQLiRuleSet"
        vendor_name = "AWS"

        // ファイルアップロードが失敗する可能性があるので COUNT に変更する
        rule_action_override {
          action_to_use {
            count {}
          }
          name = "SQLi_BODY"
        }
      }
    }
snakasnaka

ただ、この方法だと SQLi_BODY がすべての箇所で無効化されてしまう

snakasnaka

特定の path の場合のみ特定のRuleを除外する

前述の設定だけだと、 SQLi_BODY のルールがすべての箇所で無効化されてしまうので、特定の path 以外ではブロックしたい。

https://dev.classmethod.jp/articles/aws-waf-managed-rule-group-exception-conditions/

上の記事にあるように

  • COUNT モードで検知されたアクセスには「ラベル」が付与される
  • 追加のルールで「ラベル」を検知して、特定の path 以外へのアクセスの場合には BLOCK する

という動きにするとよさそう

snakasnaka

COUNT 設定した rule の後に以下のような rule を追加。
Path が /hoge 以外の場合に SQLi_BODY のラベルが付与されたものを BLOCK し、 /hoge の場合はスルーする。

waf/main.tf
  // SQLi_BODY にマッチしたアクセスのうち /upload_file 以外のリクエストをブロックする
  rule {
    name     = "Custom-SQLi_BODY"
    priority = 10

    action {
      block {}
    }

    statement {
      and_statement {
        statement {
          label_match_statement {
            scope = "LABEL"
            key   = "awswaf:managed:aws:sql-database:SQLi_Body"
          }
        }

        statement {
          not_statement {
            statement {
              byte_match_statement {
                field_to_match {
                  uri_path {}
                }
                positional_constraint = "STARTS_WITH"
                search_string         = "/upload_file"
                text_transformation {
                  priority = 0
                  type     = "NONE"
                }
              }
            }
          }
        }
      }
    }
  }
  // 主要な部分だけを抜粋
}
snakasnaka

結果、コンソールでみると以下のような rule になる

このスクラップは4ヶ月前にクローズされました