본문 바로가기
AWS

[클라우드 보안] WAF DVWA 미니프로젝트 -하편-

by Nirah 2023. 2. 21.

 

클라우드 보안 상-중-하편 목록

https://raid-1.tistory.com/185

https://raid-1.tistory.com/189

https://raid-1.tistory.com/190

 

10. Rule 백업

AWS WAF 에서 제공하는 JSON Editor 를 이용하여 조금 더 복잡한 Rule 을 생성하고 적용해보자.

 

JSON 기반 Rule

이번에는 AWS WAF v2 에서 새롭게 제공되는 Rule 설정 방식인 JSON 기반 Rule 생성을 해본다.

간단한 Rule은 AWS 콘솔의 Rule visual editor를 사용하는 것이 가장 간편한 방법이지만,

모든 웹 ACL에는 JSON 형식 표현이 있습니다. 복잡한 규칙의 경우 JSON 편집기를 사용하여 웹 ACL을 관리하는 것이 가장 쉬운 방법이다.

JSON 형식의 웹 ACL에 대한 전체 구성을 검색하고 필요에 따라 수정한 다음, 콘솔, API 또는 CLI를 통해 제공할 수 있다.

 

 

기존의 Rule 백업

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

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

 

저장된 파일은 지금까지 생성하였던 Rule 정보들을 포함하고 있다.

MyWAF.json
0.00MB

 

Rule 설정을 백업하였으니 이번에는 Web ACL 에서 사용하고 있는 Rule 들을 모두 삭제한다.

Web ACL 의 Rules 탭으로 이동한 후 아래와 같이 현재 설정되어 있는 Rule 을 모두 선택한 후 “Delete” 버튼을 클릭

 

 

 

 

11. AWS WAF를 이용한 방어 시나리오

 

Attack !!

가상의 상황을 가정해보도록 한다. 당신은 팀의 보안 담당자다.

서비스 하고 있는 웹 어플리케이션에서 최근에 한국IP로 지속적으로 공격이 들어오고 있어 확인을 해보니 다음과 같은 특징이 있었다.

 

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

 

이제 당신은 새로운 규칙을 작성해서 정상 요청을 막지 않는 선에서 악의적인 공격을 막아야 한다.

 

 

 

JSON 기반 Rule 작성

※ 중첩문 (nested statement)를 포함하는 Rule은 Rule visual editor에서 편집할 수 없기때문에 해당 시나리오에서는 JSON editor를 사용해서 Rule을 작성한다.

 

로운 Rule 을 추가하기 위하여 “Add my own rules and rule gruops” 버튼을 클릭한다.

 

우선 JSON 문서에 Rule name 과 MetricName을 추가한다. 둘다 “TESTRule“로 지정한다.

시나리오의 요구사항을 맞추기 위해서는 중첩 구조가 필요하므로 대략 다음과 같은 틀을 만들어본다.

 

일단 한국에서 온 트레픽이어야하고(and), 크기가 100바이트 이상이거나 (or) 헤더중 x-value 값이 bot이나 Bot이다.

 

{
"Name": "TestRule",
"Priority": 0,
"Action": {
"Block": {}
},
"VisibilityConfig": {
"SampledRequestsEnabled": true,
"CloudWatchMetricsEnabled": true,
"MetricName": "TestRule"
},
"Statements": {
"AndStatement": {
  "Statements": [
    {
      //한국에서 들어오는 요청 조건 
    },
    {
      "OrStatement": {
        "Statements": [
          {
            //Request Body 크기에 대한 조건 
          },
          {
            //요청 헤더에 대한 조건 
          }
        ]
      }
    }
  ]
}
}
}

 

다음과 같이 AND 문안에 OR문이 중첩되어 있는 것을 확인할 수 있다.

 

틀에 넣어줄 내용으론 다음과 같은 요소가 있다.

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

 

틀을 기반으로 json파일을 완성시켜보자.

{
"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"
            }
          }
        ]
      }
    }
  ]
}
}
}

 

Validate로 문제없는지 확인해보고 완료

 

 

적용한 Rule 테스트

 PC의 Terminal로 접속

윈도우에서 진행하는 경우, curl.se/download.html 에서 최신버전을 내 컴에 맞는걸로 다운받아주자

압축만 풀어주면 사용 준비는 끝

 

curl은 명령행 기반 웹 요청 도구인데, 아무래도 리눅스 기반 명령어다보니 cmd에서는 뭐가 많이 다르고 오류가 난다

 

 

3-3) 차단 확인

 

curl -i -H "x-value: bot" $waf_url
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 $waf_url

 

403 Forbidden이 뜬다 (차단 성공)

 

 

 

 

 

====================================================================================

 

12. AWS WAF 로깅 확인

AWS WAF에서 발생하는 로그들을 조회하고 활용해보자.

이전 -상- 편에서 로깅을 활성화시켰다. 그후 여러 실습이 있었으니 로그가 충분히 쌓였을것이다.

S3 콘솔로 이동한 뒤 “mydvwa-“로 시작하는 버킷을 찾은 뒤 가장 하위 경로로 내려가면\

다음과 같이 로그가 쌓인 것을 확인할 수 있다.

 

 

년도와 월,일 별로 폴더가 생성돼어있고, 그 안에 순서대로 일어난 트레픽 흐름이 기록돼있다. 

03번 폴더를 보았다.

 

생성된 파일 중 하나를 다운로드 하여 가장 익숙한 editor로 실행하고 살펴본다.

비쥬얼 스튜디오로 여니까 말도 안되게 가로로 길어서 보기 힘들었는데

마우스 오른쪽버튼 누르고 포멧 다큐먼트 누르니까 세로로 잘 정렬이 됐다.

 

 

 

아래는 해당 요청이 TestRule에 의해 차단이 되었는지에 대한 내용 및 관련 자세한 사항을 확인 할 수 있다.

가장 최근 파일을 받아봤다

 

 

첫번째줄은 curl -i -H "x-value: bot" $waf_url 명령의 결과라서 x-value값이 bot이다

 

 

두번째줄은 curl -i -X POST -d ... 명령의 결과라서 메소드 형태가 POST이다 (파라미터 값은 안보임)

 

 

 

 

13. AWS 자원 삭제

1. Web ACL 삭제

2. S3 bucket 삭제

3. CloudFormation 삭제