WAF
•
HTTP / HTTPS 트래픽을 모니터링하고 차단함으로써 고객의 웹 어플리케이션을 보호하는 도구
•
관리형 웹 방화벽 서비스
•
OWASP TOP 10 (SQL Injection, XSS 등) 대응
•
Cloudfront / ALB 배포
•
AWS 관리 규칙 / 사용자 지정 규칙
•
IP / 국가 / 헤더 / 문자열 / 요청 길이 기반 차단
•
실시간 웹 보안 모니터링 (Cloudwatch)
•
AWS 서비스를 활용한 로그통합 (Kinesis Data Firehose 및 S3)
WAF Architecture
Rate-based Rule
Rate-based Rule
•
AWS WAF의 Rate-based Rule은 AWS를 위한 Rate Limit 기능이다.
•
Rate-based Rule를 통해 서버에 대한 Request(요청)을 제한할 수 있다.
•
Condition을 설정할 수 있다. (설정하지 않을 경우 모든 요청에 대해 제한된다)
•
트래픽이 과도하게 몰리는 상황, 특히 DDoS 공격을 완화하거나 악의적인 사용자의 요청을 제한할 수 있다.
Rate-based Rule 설정 방법
Web ACL → Add rules → Add my own rules and rule groups → Rule builder → Rule type: Rate-based rule
5분 동안 요청 수가 2000을 초과하면 요청이 제한되도록 하기
•
Rate limit : 요청 제한 값을 입력 (예: 2000 요청)
•
Evaluation widonw: 요청 제한 시간 값을 입력 (예: 5분)
AWS WAF 규칙 구조
AWS WAF 규칙 구조
•
Web ACL (액세스 제어 목록) : 트래픽 검사 및 제어를 위한 최상위 컨테이너
•
Rules (규칙) : 트래픽을 검사하는 조건문
•
Statements (명령문) : 규칙 내에서 검사할 조건 정의
일치 규칙 문 사용
GeoMatchStatement
•
특정 국가나 지역에서 오는 트래픽을 필터링
•
특정 지역의 트래픽을 차단하거나 허용할 때 사용
•
ISO 3166 국제 표준의 alpha-2 국가 ISO 코드에서 나온 2자리 국가 코드를 사용
오레곤 및 워싱턴에서 들어오는 트래픽을 제외하고 미국에서 들어오는 모든 트래픽을 차단
•
차단 작업을 포함하는 AND 문
◦
차단하려는 국가에 대해 레이블을 지정하는 레이블 일치 문
◦
NOT 명령문
▪
허용하려는 국가에 대해 레이블을 지정하는 레이블 일치 문
{
"Name": "geoMatchForLabels",
"Priority": 10,
"Statement": {
"GeoMatchStatement": {
"CountryCodes": [
"US"
],
"ForwardedIPConfig": {
"HeaderName": "X-Forwarded-For",
"FallbackBehavior": "MATCH"
}
}
},
"Action": {
"Count": {}
},
"VisibilityConfig": {
"SampledRequestsEnabled": true,
"CloudWatchMetricsEnabled": true,
"MetricName": "geoMatchForLabels"
}
},
{
"Name": "blockUSButNotOROrWA",
"Priority": 11,
"Statement": {
"AndStatement": {
"Statements": [
{
"LabelMatchStatement": {
"Scope": "LABEL",
"Key": "awswaf:forwardedip:geo:country:US"
}
},
{
"NotStatement": {
"Statement": {
"OrStatement": {
"Statements": [
{
"LabelMatchStatement": {
"Scope": "LABEL",
"Key": "awswaf:forwardedip:geo:region:US-OR"
}
},
{
"LabelMatchStatement": {
"Scope": "LABEL",
"Key": "awswaf:forwardedip:geo:region:US-WA"
}
}
]
}
}
}
}
]
}
},
"Action": {
"Block": {}
},
"VisibilityConfig": {
"SampledRequestsEnabled": true,
"CloudWatchMetricsEnabled": true,
"MetricName": "blockUSButNotOROrWA"
}
}
JSON
복사
출발지 국가가 중국일 경우, 차단
{
"Name": "COUNTRY_BLOCK_CHINA",
"Priority": 0,
"Action": {
"Block": {}
},
"VisibilityConfig": {
"SampledRequestsEnabled": true,
"CloudWatchMetricsEnabled": true,
"MetricName": "COUNTRY_BLOCK_CHINA"
},
"Statement": {
"GeoMatchStatement": {
"CountryCodes": [
"CN"
]
}
}
}
JSON
복사
IPSetReferenceStatement
•
IP 주소 집합에 기반한 필터링
•
정의된 IP 주소 또는 CIDR 범위와 일치하는 요청을 관리
•
특정 IP 주소나 범위를 화이트리스트 또는 블랙리스트로 관리할 때 유용
•
IP 주소 및 주소 범위의 집합에 대한 웹 요청의 IP 주소를 검사
AWS WAF에 IP 집합 생성 및 관리
LabelMatchStatement
•
레이블 일치 문은 문자열 사양을 기준으로 웹 요청의 레이블을 검사
•
이전 규칙에서 추가된 레이블과 일치하는 요청을 평가
•
다른 규칙과 연계하여 복잡한 규칙 체인을 만들 때 사용
RegexMatchStatement
•
단일 정규표현식 패턴과 일치하는 요청을 필터링
•
특정 패턴의 문자열을 검색할 때 사용
RegexPatternSetReferenceStatement
•
여러 정규표현식 패턴을 하나의 세트로 관리
•
다양한 패턴을 동시에 검사할 때 효율적
SizeConstraintStatement
•
요청 구성 요소의 크기 제한
•
요청의 특정 부분(헤더, 쿼리 문자열 등)의 크기를 제한
•
비정상적으로 큰 요청을 차단하여 버퍼 오버플로우 공격 방지
SqliMatchStatement
•
SQL 인젝션 공격 탐지
•
SQL 명령어가 포함된 악의적인 요청을 감지
•
데이터베이스 손상을 방지하는 데 중요
ByteMatchStatement
•
요청의 특정 부분에서 문자열 검색
•
간단한 패턴 매칭에 사용
매칭을 시도할 헤더는 "User-Agent" 이고, 해당 헤더 내 대소문자 구분없이 "python" 문자열이 포함되어 있을 경우, 차단
{
"Name": "USERAGENT_BLOCK_PYTHON",
"Priority": 0,
"Action": {
"Block": {}
},
"VisibilityConfig": {
"SampledRequestsEnabled": true,
"CloudWatchMetricsEnabled": true,
"MetricName": "USERAGENT_BLOCK_PYTHON"
},
"Statement": {
"ByteMatchStatement": {
"FieldToMatch": {
"SingleHeader": {
"Name": "User-Agent"
}
},
"PositionalConstraint": "CONTAINS",
"SearchString": "python",
"TextTransformations": [
{
"Type": "LOWERCASE",
"Priority": 0
}
]
}
}
}
JSON
복사
XssMatchStatement
•
크로스 사이트 스크립팅(XSS) 공격 탐지
•
악의적인 스크립트가 포함된 요청을 감지
•
사용자 브라우저에서 실행될 수 있는 스크립트 공격 방지
논리적 규칙 문 사용
AND 규칙 문
•
여러 명령문이 모두 일치해야 함
SQL 명령어 삽입 공격 문에 대한 일치 항목에서 거짓 긍정을 제거
{
"Name": "SQLiExcludeFalsePositives",
"Priority": 0,
"Statement": {
"AndStatement": {
"Statements": [
{
"NotStatement": {
"Statement": {
"ByteMatchStatement": {
"SearchString": "string identifying a false positive",
"FieldToMatch": {
"Body": {
"OversizeHandling": "MATCH"
}
},
"TextTransformations": [
{
"Priority": 0,
"Type": "NONE"
}
],
"PositionalConstraint": "CONTAINS"
}
}
}
},
{
"SqliMatchStatement": {
"FieldToMatch": {
"Body": {
"OversizeHandling": "MATCH"
}
},
"TextTransformations": [
{
"Priority": 0,
"Type": "NONE"
}
]
}
}
]
}
},
"Action": {
"Block": {}
},
"VisibilityConfig": {
"SampledRequestsEnabled": true,
"CloudWatchMetricsEnabled": true,
"MetricName": "SQLiExcludeFalsePositives"
}
}
JSON
복사
NOT 규칙 문
•
포함된 명령문과 일치하지 않아야 함
{
"Name": "SQLiExcludeFalsePositives",
"Priority": 0,
"Statement": {
"AndStatement": {
"Statements": [
{
"NotStatement": {
"Statement": {
"ByteMatchStatement": {
"SearchString": "string identifying a false positive",
"FieldToMatch": {
"Body": {
"OversizeHandling": "MATCH"
}
},
"TextTransformations": [
{
"Priority": 0,
"Type": "NONE"
}
],
"PositionalConstraint": "CONTAINS"
}
}
}
},
{
"SqliMatchStatement": {
"FieldToMatch": {
"Body": {
"OversizeHandling": "MATCH"
}
},
"TextTransformations": [
{
"Priority": 0,
"Type": "NONE"
}
]
}
}
]
}
},
"Action": {
"Block": {}
},
"VisibilityConfig": {
"SampledRequestsEnabled": true,
"CloudWatchMetricsEnabled": true,
"MetricName": "SQLiExcludeFalsePositives"
}
}
JSON
복사
OR 규칙 문
•
여러 명령문 중 하나라도 일치하면 됨
{
"Name": "neitherOfTwo",
"Priority": 1,
"Action": {
"Block": {}
},
"VisibilityConfig": {
"SampledRequestsEnabled": true,
"CloudWatchMetricsEnabled": true,
"MetricName": "neitherOfTwo"
},
"Statement": {
"OrStatement": {
"Statements": [
{
"GeoMatchStatement": {
"CountryCodes": [
"CA"
]
}
},
{
"IPSetReferenceStatement": {
"ARN": "arn:aws:wafv2:us-east-1:111111111111:regional/ipset/test-ip-set-22222222/33333333-4444-5555-6666-777777777777"
}
}
]
}
}
}
JSON
복사
속도 기반 규칙 문 사용
속도 기반 규칙 문 사용
•
요청이 너무 빠른 속도로 수신될 때 수신 요청 수를 계산하고 요청 속도를 제한
특정 출발지 주소에서 5분 동안 1,000번 이상 웹 요청 시, 차단
{
"Name": "MAX_REQUEST_1000",
"Priority": 0,
"Action": {
"Block": {}
},
"VisibilityConfig": {
"SampledRequestsEnabled": true,
"CloudWatchMetricsEnabled": true,
"MetricName": "MAX_REQUEST_1000"
},
"Statement": {
"RateBasedStatement": {
"Limit": "1000",
"AggregateKeyType": "IP"
}
}
}
JSON
복사
규칙 그룹 규칙 문 사용
규칙 그룹 규칙 문 사용
규칙 그룹 문 | 설명 | WCU |
지정된 관리형 규칙 그룹에 정의된 규칙을 실행합니다.
범위 축소 문을 추가하여 규칙 그룹이 평가하는 요청 범위를 좁힐 수 있습니다.
관리형 규칙 그룹 문을 다른 문 유형 안에 중첩할 수 없습니다. | 규칙 그룹과 범위 축소 문에 대한 모든 추가 WCU에 의해 정의됩니다. | |
관리하는 규칙 그룹에 정의된 규칙을 실행합니다.
사용자 고유의 규칙 그룹 대한 규칙 그룹 참조 문에는 범위 축소 문을 추가할 수 없습니다.
규칙 그룹 문을 다른 문 유형 안에 중첩할 수 없습니다. | 규칙 그룹을 생성할 때 규칙 그룹에 대해 WCU 제한을 정의합니다. |







