Search

WAF

WAF
HTTP / HTTPS 트래픽을 모니터링하고 차단함으로써 고객의 웹 어플리케이션을 보호하는 도구
관리형 웹 방화벽 서비스
OWASP TOP 10 (SQL Injection, XSS 등) 대응
Cloudfront / ALB 배포
AWS 관리 규칙 / 사용자 지정 규칙
IP / 국가 / 헤더 / 문자열 / 요청 길이 기반 차단
실시간 웹 보안 모니터링 (Cloudwatch)
AWS 서비스를 활용한 로그통합 (Kinesis Data FirehoseS3)
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 제한을 정의합니다.