2024 SWLUG/클라우드

AWS WAF를 이용한 방어(심화)

un_plugged 2024. 11. 12. 00:33

RULE 백업

AWS WAF v2 에서 새롭게 제공되는 Rule 설정 방식인 JSON 기반 Rule 생성에 관한 실습이다.

  • 간단한 Rule은 AWS 콘솔의 Rule visual editor를 사용하는 것이 가장 간편한 방법이지만, 모든 웹 ACL에는 JSON 형식 표현이 있다.
  • 복잡한 규칙의 경우 JSON 편집기를 사용하여 웹 ACL을 관리하는 것이 가장 쉬운 방법
  • JSON 형식의 웹 ACL에 대한 전체 구성을 검색하고 필요에 따라 수정한 다음, 콘솔, API 또는 CLI를 통해 제공

새로운 Rule을 작성해보기 전에 현재까지 생성된 Rule 을 JSON 기반 문서로 백업해야 한다.

기존의 Rule을 다운로드하기 위하여 Web ACL 의 화면 우측 상단의 “Download web ACL as JSON” 버튼을 클릭한 후 파일을 저장한다.

{
  "Name": "MyWAF",
  "Id": "2997fbaa-2fb9-49da-858d-3b829eab44dc",
  "ARN": "arn:aws:wafv2:ap-northeast-2:248189949420:regional/webacl/MyWAF/2997fbaa-2fb9-49da-858d-3b829eab44dc",
  "DefaultAction": {
    "Allow": {}
  },
  "Description": "",
  "Rules": [
    {
      "Name": "SG-Block",
      "Priority": 0,
      "Statement": {
        "GeoMatchStatement": {
          "CountryCodes": [
            "SG"
          ]
        }
      },
      "Action": {
        "Block": {}
      },
      "VisibilityConfig": {
        "SampledRequestsEnabled": true,
        "CloudWatchMetricsEnabled": true,
        "MetricName": "SG-Block"
      }
    },
    {
      "Name": "iphone-Block",
      "Priority": 1,
      "Statement": {
        "ByteMatchStatement": {
          "SearchString": "iphone",
          "FieldToMatch": {
            "SingleHeader": {
              "Name": "user-agent"
            }
          },
          "TextTransformations": [
            {
              "Priority": 0,
              "Type": "LOWERCASE"
            }
          ],
          "PositionalConstraint": "CONTAINS"
        }
      },
      "Action": {
        "Block": {}
      },
      "VisibilityConfig": {
        "SampledRequestsEnabled": true,
        "CloudWatchMetricsEnabled": true,
        "MetricName": "iphone-Block"
      }
    }
  ],
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "MyWAF"
  },
  "Capacity": 21,
  "ManagedByFirewallManager": false,
  "LabelNamespace": "awswaf:248189949420:webacl:MyWAF:",
  "RetrofittedByFirewallManager": false
}

다운로드한 파일의 내용은 위와 같다. 

 

Rule 설정을 백업하였으니 이번에는 Web ACL 에서 사용하고 있는 Rule 들을 모두 삭제한다. Web ACL 의 Rules 탭으로 이동한 후 아래와 같이 현재 설정되어 있는 Rule 을 모두 선택한 후 “Delete” 버튼을 클릭하여 삭제한다.

이제 모든 Rule 이 삭제된 상태에서 지금까지 사용했던 공격 방법 및 Singapore 에서의 접속 등이 모두 차단되지 않고 정상적으로 접속된다.

 

JSON 기반 Rule 설정

아래와 같은 가상 상황을 설정하여 실습을 진행한다. 

  • 공격의 대부분은 한국에서 온 공격이다. 하지만 한국에서는 실제 고객들이 요청하는 정상 트래픽도 있다.
  • 한국에서 오는 공격은 request body가 비정상적으로 커서 100byte 이상이거나 header “x-value” 의 값이 “bot“이나 “BOT“으로 들어온다.

 이제 JSON 기반 Rule 설정을 해본다.

Rule Builder에서 Rule JSON editor를 클릭했을 때의 모습이다. 

{
"Name": "TestRule",
"Priority": 0,
"Action": {
"Block": {}
},
"VisibilityConfig": {
"SampledRequestsEnabled": true,
"CloudWatchMetricsEnabled": true,
"MetricName": "TestRule"
},
"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"
            }
          }
        ]
      }
    }
  ]
}
}
}

위와 같이 중첩 구조로 작성한다. AND 문안에 OR문이 중첩되어있다.

  • 국가기반 일치 조건: “GeoMatchStatement” 
  • 한국의 “CountryCodes“: “KR"
  • 크기제약 조건: “SizeConstraintStatement” 
  • 비교연산자 “ComparisonOperator” : “GT“
  • 문자열일치 조건: “ByteMatchStatement” 
  • “bot“이나 “BOT” 을 모두 걸러낼 수 있는 TextTransformations: “LowerCase”

이렇게 요청을 차단하도록 JSON 룰을 작성하였다.

 

이제 좀 더 다양한 파라미터를 전달할 수 있도록 CLI 를 사용하여 적용한 Rule을 테스트한다.

그 전에 DVWA 웹의 endpoint 값을 알아야하는데 . endpoint값은 CloudFormation Stack “MyDVWA”의 Output 탭에서 찾을 수 있는 “AlbEndpoint” 값이다.

 

DVWA 웹의 endpoint 값을 변수로 export한다.

x-value 헤더에 'bot' 문자열을 포함하는 요청을 전송한다. JSON 룰에서 두 번째 or 조건을 설정했기 때문에 WAF가 이를 감지하여 요청을 차단한다. 

POST 요청 본문의 데이터 크기가 설정된 조건인 100바이트를 초과하여 WAF에 의해 차단된다.

위와 같이 x-value에 "notbot"이라는 값과 크기가 작은 데이터 본문의 요청을 보내면 WAF가 허용한다. 

'2024 SWLUG > 클라우드' 카테고리의 다른 글

AWS 아키텍처 정리  (0) 2024.11.18
AWS WAF를 이용한 방어  (0) 2024.11.12
무차별 입력 공격  (0) 2024.11.05
Backdoor  (0) 2024.11.05
Command Injection  (0) 2024.10.29