Cloud Infra Architecture (AWS)/AWS Build

[AWS WAF] AWS WAF JSON 기반 규칙 생성 [T]

seongduck 2024. 11. 1. 16:13
  • AWS WAF에서 제공하는 Rule Visual Editor를 사용하면 간편하지만 복잡한 정책을 만들 때  JSON editor를 사용한다.
  • 혹은 AND 조건과 OR 조건의 중복 적용관련해서도 JSON으로 가능하다.

 

기본 WAF 규칙으로 생성 가능한 조합

옵션 1. 특정 조건 매칭
옵션 2. 특정 조건이 아닌 경우 매칭
옵션 3. 특정 조건과(AND) 다른 특정 조건의 조합 매칭
옵션 4. 특정 조건과(AND) 특정 조건이 아닌(NOT) 조합의 매칭
옵션 5. 특정 조건이나(OR) 다른 조건의 조합 매팅
옵션 6. 특정 조건이나(OR) 특정 조건이 아닌(NOT) 조합의 매칭

=> AND, OR, AND+NOT, OR+NOT (O)
=> AND+OR, AND+OR+NOT (X)

 

하나의 가정 상황을 두고 만들어보자.

한국에서 공격 트래픽을 발생함
하지만 한국에서는 정상 트래픽도 있기에 정상 트래픽은 허용해야 함
한국에서 공격은 Request body가 비정상적으로 커서 100byte 이상이거나 header "x-value"의 값이 "bot"이나 "BOT"으로 들어옴

 

규칙 생성

1) AWS WAF -> WebACLs 접속 -> 해당 ACLs선택
2) Rules -> Add rules -> Add my own reules and rule groups
3) Rule builder -> Rule JSON editor
{
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "JSONRule"
  },
  "Statement": {
    "AndStatement": {
      "Statements": [
        {
          "GeoMatchStatement": {
            "CountryCodes": [
              "KR"
            ]
          }
        },
        {
          "OrStatement": {
            "Statements": [
              {
                "SizeConstraintStatement": {
                  "FieldToMatch": {
                    "Body": {}
                  },
                  "ComparisonOperator": "GT",
                  "Size": 100,
                  "TextTransformations": [
                    {
                      "Priority": 0,
                      "Type": "NONE"
                    }
                  ]
                }
              },
              {
                "ByteMatchStatement": {
                  "SearchString": "bot",
                  "FieldToMatch": {
                    "SingleHeader": {
                      "Name": "x-value"
                    }
                  },
                  "TextTransformations": [
                    {
                      "Priority": 0,
                      "Type": "LOWERCASE"
                    }
                  ],
                  "PositionalConstraint": "EXACTLY"
                }
              }
            ]
          }
        }
      ]
    }
  }
}
4) Add rule -> Save

 

정상 테스트 코드

# Blocked (header string match condition)
curl -i -H "x-value: bot" $ALB_URL

# Blocked (request body size condition)
curl -i -X POST -d "Amazon":"30","is":"12374934237","known":"Target 3","as":null,"one":"Configuration Deneme 3","of":null,"the":"Configuration Deneme 3","most":0,"customer-centric":3,"companies":true $ALB_URL