我如何保护 Elastic Beanstalk 环境免受不需要的未知主机的攻击?

上次更新时间:2020 年 5 月 28 日

我的 AWS Elastic Beanstalk 实例正在从不需要的主机名获取请求。我如何防止 Elastic Beanstalk 实例从此主机名获取请求?

简短描述

在具有 Application Load Balancer 的 Elastic Beanstalk 环境中,您可以将 AWS WAF 用作自定义资源,以保护您的实例免受不需要的主机名的攻击

要让您的 Elastic Beanstalk 环境阻止不需要的主机名,请完成以下任一部分中的步骤:

  • 阻止一个主机名
  • 阻止多个主机名

解决方法

阻止一个主机名

1.    在 .ebextensions 目录中创建 waf.config 配置文件。

2.    按照下面的示例更新 waf.config 文件。确保将 BlockedHost1 替换为要从 Elastic Beanstalk 环境中阻止的主机名。

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" ]}`'

3.    使用步骤 2 中的 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

注意:请将 exampletoblock.com 替换为 waf.config 上配置的要阻止的主机名。请将命令上的 URL 替换为您的 Elastic Beanstalk 环境 URL

如果主机名被阻止,您会收到以下类似输出:

> 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

阻止多个主机名

通过将主机名添加到使用 RegexPatternSetWeb 访问控制列表 (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

这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?