🛡️

開発環境のCognitoにWAFを導入した時の注意点

に公開

開発中のCognitoではよく以下の設定をすると思います。localhostをCallbackに設定するヤツですね。

しかし、この設定をするとWAFの設定によっては403エラーが出ます。
WAFでのエラーなので、403エラーの相談をClaudeやChatGPTに聞いても全然解決しません。

WAFのルールは一般的な以下

この中の、AWS-AWSManagedRulesCommonRuleSetの中にあるEC2MetaDataSSRF_QUERYARGUMENTS によってWAFの挙動としてBlockされ、403が返ってきます。

これは、「リクエストクエリ引数から Amazon EC2 メタデータを盗み出す試みがないかを検査します。」ってやつですね。
参考:https://docs.aws.amazon.com/waf/latest/developerguide/aws-managed-rule-groups-baseline.html

なので、開発中の環境ではこれをCountにしてあげた方がいいと思います。
これをCountにするだけでlocalhostをCallbackにするのは成功します。

早まって全部CountにするとWAF入れてるのにガバガバになるのでなんでWAF入れてるのか分からなくなっちゃいますよねー。

また、localhostでの検証が終わったらちゃんとBlockに戻すのを忘れないようにしてくださいー。

参考までに僕が使用した開発中のCognitoで使うWAFのTerraformファイルを置いておきます。

resource "aws_wafv2_web_acl" "this" {
  name        = "${var.service_name}-cognito-waf-${var.environment}"
  description = "WAF on Cognito UserPool ${var.service_name}-${var.environment}"

  〜省略〜

  rule {
    name     = "AWS-AWSManagedRulesCommonRuleSet"
    priority = 2

    override_action {
      none {}
    }

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

          action_to_use {
            count {}
          }
        }
      }
    }

    visibility_config {
      cloudwatch_metrics_enabled = true
      metric_name                = "AWS-AWSManagedRulesCommonRuleSet"
      sampled_requests_enabled   = true
    }
  }

  〜省略〜
}

Discussion