我如何保护 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
阻止多个主机名
通过将主机名添加到使用 RegexPatternSet 的 Web 访问控制列表 (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