AWS WAF는 웹 애플리케이션 방화벽으로, 웹 애플리케이션이나 API를 다양한 웹 공격으로부터 보호하도록 설계되었습니다. 사용자는 SQL 인젝션이나 크로스 사이트 스크립팅과 같은 일반적인 공격 벡터를 완화하는 보안 규칙을 설정하여 들어오는 트래픽을 제어할 수 있습니다. 또한 사용자 정의 필터링 규칙을 정의할 수 있습니다.
주요 개념
웹 ACL (Access Control List)
웹 ACL은 웹 애플리케이션이나 API에 적용할 수 있는 규칙의 모음입니다. 웹 ACL을 리소스와 연결하면 AWS WAF는 웹 ACL에 정의된 규칙에 따라 들어오는 요청을 검사하고 지정된 작업을 수행합니다.
규칙 그룹
규칙 그룹은 여러 웹 ACL에 적용할 수 있는 재사용 가능한 규칙 모음입니다. 규칙 그룹은 다양한 웹 애플리케이션이나 API에서 일관된 규칙 세트를 관리하고 유지하는 데 도움을 줍니다.
각 규칙 그룹에는 관련된 용량이 있으며, 이는 규칙, 규칙 그룹 및 웹 ACL을 실행하는 데 사용되는 운영 리소스를 계산하고 제어하는 데 도움이 됩니다. 생성 중에 값이 설정되면 수정할 수 없습니다.
규칙
규칙은 AWS WAF가 들어오는 웹 요청을 검사하는 데 사용하는 조건 집합을 정의합니다. 규칙의 두 가지 주요 유형은 다음과 같습니다:
정규 규칙: 이 규칙 유형은 지정된 조건을 사용하여 웹 요청을 허용, 차단 또는 계산할지를 결정합니다.
비율 기반 규칙: 특정 IP 주소에서 5분 동안의 요청 수를 계산합니다. 여기서 사용자는 임계값을 정의하며, IP에서의 요청 수가 5분 이내에 이 한도를 초과하면 해당 IP에서의 후속 요청은 임계값이 하락할 때까지 차단됩니다. 비율 기반 규칙의 최소 임계값은 2000 요청입니다.
관리 규칙
AWS WAF는 AWS 및 AWS Marketplace 판매자가 유지 관리하는 사전 구성된 관리 규칙 세트를 제공합니다. 이러한 규칙 세트는 일반적인 위협으로부터 보호하며, 새로운 취약점을 해결하기 위해 정기적으로 업데이트됩니다.
IP 세트
IP 세트는 허용하거나 차단하려는 IP 주소 또는 IP 주소 범위의 목록입니다. IP 세트는 IP 기반 규칙 관리 프로세스를 단순화합니다.
정규 표현식 패턴 세트
정규 표현식 패턴 세트는 웹 요청에서 검색할 패턴을 정의하는 하나 이상의 정규 표현식(정규식)을 포함합니다. 이는 특정 문자 시퀀스를 필터링하는 것과 같은 더 복잡한 매칭 시나리오에 유용합니다.
잠금 토큰
잠금 토큰은 WAF 리소스를 업데이트할 때 동시성 제어에 사용됩니다. 이는 여러 사용자나 프로세스가 동시에 동일한 리소스를 업데이트하려고 할 때 변경 사항이 우연히 덮어쓰여지지 않도록 보장합니다.
API 키
AWS WAF의 API 키는 특정 API 작업에 대한 요청을 인증하는 데 사용됩니다. 이러한 키는 암호화되어 안전하게 관리되며, 접근을 제어하고 권한이 있는 사용자만 WAF 구성을 변경할 수 있도록 보장합니다.
예시: CAPTCHA API 통합.
권한 정책
권한 정책은 AWS WAF 리소스에서 작업을 수행할 수 있는 사람을 지정하는 IAM 정책입니다. 권한을 정의함으로써 WAF 리소스에 대한 접근을 제어하고 권한이 있는 사용자만 구성을 생성, 업데이트 또는 삭제할 수 있도록 보장할 수 있습니다.
범위
AWS WAF의 범위 매개변수는 WAF 규칙 및 구성이 지역 애플리케이션 또는 Amazon CloudFront 배포에 적용되는지를 지정합니다.
REGIONAL: Application Load Balancers (ALB), Amazon API Gateway REST API, AWS AppSync GraphQL API, Amazon Cognito 사용자 풀, AWS App Runner 서비스 및 AWS Verified Access 인스턴스와 같은 지역 서비스에 적용됩니다. 이러한 리소스가 위치한 AWS 리전을 지정합니다.
CLOUDFRONT: Amazon CloudFront 배포에 적용되며, 이는 전 세계적입니다. CloudFront에 대한 WAF 구성은 콘텐츠가 제공되는 위치와 관계없이 us-east-1 리전을 통해 관리됩니다.
주요 기능
모니터링 기준 (조건)
조건은 AWS WAF가 모니터링하는 들어오는 HTTP/HTTPS 요청의 요소를 지정하며, 여기에는 XSS, 지리적 위치(GEO), IP 주소, 크기 제약, SQL 인젝션 및 패턴(문자열 및 정규식 매칭)이 포함됩니다. 국가에 따라 CloudFront 수준에서 제한된 요청은 WAF에 도달하지 않는다는 점에 유의해야 합니다.
각 AWS 계정은 다음을 구성할 수 있습니다:
각 유형에 대해 100 조건 (정규식의 경우 10 조건만 허용되지만 이 한도는 증가할 수 있습니다).
100 규칙 및 50 웹 ACL.
최대 5개의 비율 기반 규칙.
애플리케이션 로드 밸런서와 함께 WAF가 구현될 때 초당 10,000 요청의 처리량.
규칙 작업
작업은 각 규칙에 할당되며, 옵션은 다음과 같습니다:
허용: 요청이 적절한 CloudFront 배포 또는 애플리케이션 로드 밸런서로 전달됩니다.
차단: 요청이 즉시 종료됩니다.
계산: 규칙의 조건을 충족하는 요청을 집계합니다. 이는 규칙 테스트에 유용하며, 허용 또는 차단으로 설정하기 전에 규칙의 정확성을 확인합니다.
CAPTCHA 및 챌린지: CAPTCHA 퍼즐 및 침묵 챌린지를 사용하여 요청이 봇에서 오지 않는지 확인합니다.
웹 ACL 내의 어떤 규칙과도 일치하지 않는 요청은 기본 작업(허용 또는 차단)을 수행합니다. 웹 ACL 내에서 정의된 규칙 실행 순서는 중요하며 일반적으로 다음 순서를 따릅니다:
화이트리스트에 있는 IP 허용.
블랙리스트에 있는 IP 차단.
해로운 서명과 일치하는 요청 차단.
CloudWatch 통합
AWS WAF는 모니터링을 위해 CloudWatch와 통합되어 있으며, 허용된 요청, 차단된 요청, 계산된 요청 및 통과된 요청과 같은 메트릭을 제공합니다. 이러한 메트릭은 기본적으로 매분 보고되며, 2주 동안 보존됩니다.
열거
CloudFront 배포와 상호작용하려면 US East (N. Virginia) 리전을 지정해야 합니다:
CLI - CloudFront 범위를 사용할 때 US East 리전을 지정합니다: --scope CLOUDFRONT --region=us-east-1 .
# Web ACLs ### Retrieve a list of web access control lists (Web ACLs) available in your AWS accountawswafv2list-web-acls--scope<REGIONAL--region=<value>|CLOUDFRONT--region=us-east-1>## Retrieve details about the specified Web ACLawswafv2get-web-acl--name<value>--id<value>--scope<REGIONAL--region=<value>|CLOUDFRONT--region=us-east-1>## Retrieve a list of resources associated with a specific web access control list (Web ACL)aws wafv2 list-resources-for-web-acl --web-acl-arn <value> # Additional permissions needed depending on the protected resource type: cognito-idp:ListResourcesForWebACL, ec2:DescribeVerifiedAccessInstanceWebAclAssociations or apprunner:ListAssociatedServicesForWebAcl
## Retrieve the Web ACL associated with the specified AWS resourceaws wafv2 get-web-acl-for-resource --resource-arn <arn> # Additional permissions needed depending on the protected resource type: cognito-idp:GetWebACLForResource, ec2:GetVerifiedAccessInstanceWebAcl, wafv2:GetWebACL or apprunner:DescribeWebAclForService
# Rule groups ### List of the rule groups available in your AWS accountawswafv2list-rule-groups--scope<REGIONAL--region=<value>|CLOUDFRONT--region=us-east-1>## Retrieve the details of a specific rule groupaws wafv2 get-rule-group [--name <value>] [--id <value>] [--arn <value>] [--scope <REGIONAL --region=<value> | CLOUDFRONT --region=us-east-1>]
## Retrieve the IAM policy attached to the specified rule groupaws wafv2 get-permission-policy --resource-arn <rule-group-arn> # Just the owner of the Rule Group can do this operation
# Managed rule groups (by AWS or by a third-party) ### List the managed rule groups that are availableawswafv2list-available-managed-rule-groups--scope<REGIONAL--region=<value>|CLOUDFRONT--region=us-east-1>## List the available versions of the specified managed rule groupaws wafv2 list-available-managed-rule-group-versions --vendor-name <value> --name <value> --scope <REGIONAL --region=<value> | CLOUDFRONT --region=us-east-1>
## Retrieve high-level information about a specific managed rule groupaws wafv2 describe-managed-rule-group --vendor-name <value> --name <value> --scope <REGIONAL --region=<value> | CLOUDFRONT --region=us-east-1> [--version-name <value>]
## Retrieve high-level information about all managed rule groupsawswafv2describe-all-managed-products--scope<REGIONAL--region=<value>|CLOUDFRONT--region=us-east-1>## Retrieve high-level information about all managed rule groups from a specific vendoraws wafv2 describe-managed-products-by-vendor --vendor-name <value> --scope <REGIONAL --region=<value> | CLOUDFRONT --region=us-east-1>
# IP sets ### List the IP sets that are available in your AWS accountawswafv2list-ip-sets--scope<REGIONAL--region=<value>|CLOUDFRONT--region=us-east-1>## Retrieve the specific IP setawswafv2get-ip-set--name<value>--id<value>--scope<REGIONAL--region=<value>|CLOUDFRONT--region=us-east-1>## Retrieve the keys that are currently being managed by a rate-based rule.awswafv2get-rate-based-statement-managed-keys--scope<REGIONAL--region=<value>|CLOUDFRONT--region=us-east-1>\--web-acl-name<value>--web-acl-id<value>--rule-name<value> [--rule-group-rule-name <value>]# Regex pattern sets ### List all the regex pattern sets that you manageawswafv2list-regex-pattern-sets--scope<REGIONAL--region=<value>|CLOUDFRONT--region=us-east-1>## Retrieves the specified regex pattern setsaws wafv2 get-regex-pattern-set --name <value> --id <value> --scope <REGIONAL --region=<value> | CLOUDFRONT --region=us-east-1>
# API Keys ### List API keys for the specified scopeawswafv2list-api-keys--scope<REGIONAL--region=<value>|CLOUDFRONT--region=us-east-1>## Retrieve decrypted API keyawswafv2get-decrypted-api-key--scope<REGIONAL--region=<value>|CLOUDFRONT--region=us-east-1>--api-key<value># Logs ### List of logging configurations (storage location of the logs)aws wafv2 list-logging-configurations --scope <REGIONAL --region=<value> | CLOUDFRONT --region=us-east-1> [--log-scope <value>]
## Retrieve the logging configuration settings associated with a specific web ACLaws wafv2 get-logging-configuration --resource-arn <value> [--log-scope <CUSTOMER | SECURITY_LAKE>] [--log-type <value>]
# Miscelaneous ### Retrieve a list of the tags associated to the specified resourceawswafv2list-tags-for-resourceresource-arn<value>## Retrieve a sample of web requests that match a specified rule within a WebACL during a specified time rangeaws wafv2 get-sampled-requests --web-acl-arn <value> --rule-metric-name <value> --time-window <value> --max-items <1-500> --scope <value>
## Obtains the web ACL capacity unit (WCU) requirements for a specified scope and rulesetawswafv2check-capacity--scope<REGIONAL--region=<value>|CLOUDFRONT--region=us-east-1>--rules<value>## List of available releases for the AWS WAFv2 mobile SDKawswafv2list-mobile-sdk-releases--platform<IOS|ANDROID>## Retrieves information for the specified mobile SDK releaseawswafv2get-mobile-sdk-release--platform<value>--release-version<value>
Post Exploitation / Bypass
공격자의 관점에서 이 서비스는 공격자가 WAF 보호 및 다른 웹을 손상시키는 데 도움이 될 수 있는 네트워크 노출을 식별하는 데 도움을 줄 수 있습니다.
그러나 공격자는 이 서비스를 방해하여 웹이 WAF에 의해 보호되지 않도록 할 수도 있습니다.
많은 Delete 및 Update 작업에서 lock token을 제공해야 할 필요가 있습니다. 이 토큰은 리소스에 대한 동시성 제어에 사용되며, 여러 사용자 또는 프로세스가 동시에 동일한 리소스를 업데이트하려고 할 때 변경 사항이 우연히 덮어쓰여지지 않도록 보장합니다. 이 토큰을 얻기 위해 특정 리소스에 대해 해당 list 또는 get 작업을 수행할 수 있습니다.
wafv2:AssociateWebACL 권한은 공격자가 웹 ACL(액세스 제어 목록)을 리소스와 연결할 수 있게 하여 보안 제어를 우회하고 무단 트래픽이 애플리케이션에 도달하도록 허용하여 SQL 인젝션 또는 교차 사이트 스크립팅(XSS)과 같은 취약점으로 이어질 수 있습니다. 반대로, wafv2:DisassociateWebACL 권한을 통해 공격자는 보안 보호 기능을 일시적으로 비활성화하여 리소스를 탐지 없이 취약점에 노출시킬 수 있습니다.
공격자는 AWS WAF에서 관리하는 IP 세트를 생성, 업데이트 및 삭제할 수 있습니다. 이는 악성 트래픽을 허용하기 위해 새로운 IP 세트를 생성하거나, 합법적인 트래픽을 차단하기 위해 IP 세트를 수정하거나, 악성 IP 주소를 포함하도록 기존 IP 세트를 업데이트하거나, 신뢰할 수 있는 IP 주소를 제거하거나, 중요한 자원을 보호하기 위해 설계된 중요한 IP 세트를 삭제할 수 있기 때문에 위험할 수 있습니다.
wafv2:DeleteLoggingConfiguration 권한을 가진 공격자는 지정된 Web ACL에서 로깅 구성을 제거할 수 있습니다. 이후 wavf2:PutLoggingConfiguration 및 iam:CreateServiceLinkedRole 권한을 통해 공격자는 로깅 구성을 생성하거나 교체할 수 있으며(삭제한 후), 로깅을 완전히 방지하거나 Amazon S3 버킷, Amazon CloudWatch Logs 로그 그룹 또는 제어하에 있는 Amazon Kinesis Data Firehose와 같은 무단 목적지로 로그를 리디렉션할 수 있습니다.
생성 과정에서 서비스는 지정된 로깅 목적지에 로그를 기록할 수 있도록 필요한 권한을 자동으로 설정합니다:
Amazon CloudWatch Logs: AWS WAF는 지정된 CloudWatch Logs 로그 그룹에 리소스 정책을 생성합니다. 이 정책은 AWS WAF가 로그 그룹에 로그를 기록하는 데 필요한 권한을 갖도록 보장합니다.
Amazon S3 Bucket: AWS WAF는 지정된 S3 버킷에 버킷 정책을 생성합니다. 이 정책은 AWS WAF가 지정된 버킷에 로그를 업로드하는 데 필요한 권한을 부여합니다.
Amazon Kinesis Data Firehose: AWS WAF는 Kinesis Data Firehose와 상호작용하기 위해 특별히 서비스 연결 역할을 생성합니다. 이 역할은 AWS WAF가 구성된 Firehose 스트림에 로그를 전달할 수 있도록 합니다.
잠재적 영향: 보안 이벤트에 대한 가시성을 모호하게 하고, 사고 대응 프로세스를 어렵게 하며, AWS WAF로 보호된 환경 내에서 은밀한 악의적 활동을 촉진합니다.
wafv2:DeleteAPIKey
이 권한을 가진 공격자는 기존 API 키를 삭제할 수 있어 CAPTCHA를 무효화하고, 양식 제출 및 접근 제어와 같은 기능에 지장을 줄 수 있습니다. 이 CAPTCHA의 구현에 따라, 이는 CAPTCHA 우회로 이어지거나 자원이 오류 관리가 제대로 설정되지 않은 경우 DoS로 이어질 수 있습니다.
# Delete API keyawswafv2delete-api-key--api-key<value>--scope<REGIONAL--region=<value>|CLOUDFRONT--region=us-east-1>
잠재적 영향: CAPTCHA 보호를 비활성화하거나 애플리케이션 기능을 방해하여 보안 위반 및 잠재적인 데이터 도난으로 이어질 수 있습니다.
wafv2:TagResource, wafv2:UntagResource
공격자는 Web ACL, 규칙 그룹, IP 세트, 정규 표현식 패턴 세트 및 로깅 구성과 같은 AWS WAFv2 리소스에서 태그를 추가, 수정 또는 제거할 수 있습니다.