AWS Elastic Beanstalk 인스턴스에 원치 않는 호스트 이름의 요청이 들어옵니다.
해결 방법
Application Load Balancer가 있는 Elastic Beanstalk 환경에서 AWS WAF를 사용자 지정 리소스로 사용하여 공격으로부터 인스턴스를 보호합니다. 하나의 호스트 이름을 차단하거나 여러 호스트 이름을 차단하도록 선택할 수 있습니다.
호스트 이름 하나 차단
1. .ebextensions 디렉터리에 waf.config 구성 파일을 생성합니다.
2. 이 예시를 참고하여 waf.config 파일을 업데이트합니다.
option_settings:
aws:elasticbeanstalk:environment:
LoadBalancerType: application
aws:elasticbeanstalk:customoption:
BlockedHost1: 'exampletoblock.com'
Resources:
BlockedHostnames:
Type: "AWS::WAFv2::RegexPatternSet"
Properties:
Description: 'List of Hostnames to be block by WebACL'
Name: BlockedHostsSet
RegularExpressionList:
- { "Fn::GetOptionSetting" : {"OptionName" : "BlockedHost1" }}
Scope: REGIONAL
WafAcl:
Type: "AWS::WAFv2::WebACL"
Properties:
Description: "Web ACL to Block requests from unknown hosts on AWSEBV2LoadBalancer"
Name: "BlockHostACL"
Scope: REGIONAL
DefaultAction:
Allow: {}
VisibilityConfig:
SampledRequestsEnabled: true
CloudWatchMetricsEnabled: true
MetricName: BlockHostACLMetric
Rules:
- Name: BlockedHostsRule
Priority: 1
Action:
Block: {}
VisibilityConfig:
SampledRequestsEnabled: true
CloudWatchMetricsEnabled: true
MetricName: UnknownHostRule1
Statement:
RegexPatternSetReferenceStatement:
Arn: '`{ "Fn::GetAtt" : ["BlockedHostnames", "Arn" ]}`'
FieldToMatch:
SingleHeader:
Name: Host
TextTransformations:
- Priority: 0
Type: NONE
WebACLAssociation:
Type: AWS::WAFv2::WebACLAssociation
Properties:
ResourceArn: '`{ "Ref" : "AWSEBV2LoadBalancer" }`'
WebACLArn: '`{ "Fn::GetAtt" : ["WafAcl", "Arn" ]}`'
참고: Elastic Beanstalk 환경에서 차단하려는 호스트 이름으로 BlockedHost1을 바꿉니다.
3. 이전 단계의 waf.config 파일을 사용하여 Elastic Beanstalk 환경을 생성하거나 업데이트합니다.
중요: Application Load Balancer가 없는 기존 Elastic Beanstalk 환경에서 waf.config 파일을 실행하면 오류가 발생합니다. 환경 생성 과정에만 로드 밸런서 유형을 정의할 수 있기 때문에 오류가 발생합니다. 로드 밸런서 유형을 블루/그린 배포로 변경합니다. 자세한 내용은 Application Load Balancer 구성을 참조하세요.
4. BlockedHost1이 Elastic Beanstalk 환경으로 요청을 보내는 것이 차단되었는지 확인하려면 먼저 터미널을 엽니다. 그리고, 다음 명령을 실행하여 exampletoblock.com에서 시작된 요청을 시뮬레이션합니다.
$ curl -I -H 'host: exampletoblock.com' http://YOUR-ENV-NAME.YOUR-ENV-ID.AWS-REGION.elasticbeanstalk.com
참고: waf.config에서 차단하려고 구성한 호스트 이름으로 exampletoblock.com을 바꿉니다. 자신의 Elastic Beanstalk 환경 URL로 http://YOUR-ENV-NAME.YOUR-ENV-ID.AWS-REGION.elasticbeanstalk.com을 바꿉니다.
호스트 이름이 차단되면 다음 예시와 비슷한 결과가 출력됩니다.
> HTTP/1.1 403 Forbidden
Server: awselb/2.0
Date: Mon, 20 Apr 2020 17:31:14 GMT
Content-Type: text/html
Content-Length: 134
Connection: keep-alive
5. 정상 요청을 시뮬레이션하려면 다음 명령을 실행합니다.
$ curl -I http://ENV-NAME.ENV-ID.eu-west-1.elasticbeanstalk.com
요청이 성공하면 200 상태 코드가 표시됩니다. 이 예시와 비슷하게 출력됩니다.
> HTTP/1.1 200 OK
Date: Mon, 20 Apr 2020 17:38:04 GMT
Content-Type: text/html
Content-Length: 3352
Connection: keep-alive
Server: nginx/1.16.1
여러 호스트 이름 차단
여러 호스트 이름을 차단하려면 RegexPatternSet을 사용하는 웹 액세스 제어 목록(WEB ACL)에 호스트 이름을 추가합니다. waf.config 파일에서 사용자 지정 옵션으로 RegularExpressionList에 호스트 이름을 추가합니다.
option_settings:
aws:elasticbeanstalk:environment:
LoadBalancerType: application
aws:elasticbeanstalk:customoption:
BlockedHost1: 'exampletoblock.com'
BlockedHost2: 'anothertoblock.com'
Resources:
BlockedHostnames:
Type: "AWS::WAFv2::RegexPatternSet"
Properties:
Description: 'List of Hostnames to be block by WebACL'
Name: BlockedHostsSet
RegularExpressionList:
- { "Fn::GetOptionSetting" : {"OptionName" : "BlockedHost1" }}
- { "Fn::GetOptionSetting" : {"OptionName" : "BlockedHost2" }}
Scope: REGIONAL
관련 정보
Elastic Beanstalk 환경 리소스 추가 및 사용자 지정