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 |