알려진 원치 않는 호스트의 공격으로부터 Elastic Beanstalk 환경을 보호하려면 어떻게 해야 하나요?

3분 분량
0

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 환경 URLhttp://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 환경 리소스 추가 및 사용자 지정

AWS 공식
AWS 공식업데이트됨 6달 전