限制访问 Application Load Balancer
对于 Web 应用程序或由 Elastic Load Balancing 中的 Application Load Balancer 提供的其他内容,CloudFront 可以缓存对象并将它们直接提供给用户(查看者),从而减少 Application Load Balancer 的负载。CloudFront 还可以帮助减少延迟,甚至吸收一些分布式拒绝服务 (DDoS) 攻击。但是,如果用户可以绕过 CloudFront 并直接访问 Application Load Balancer,则无法获得这些益处。但是,您可以配置 Amazon CloudFront 和 Application Load Balancer,以防止用户直接访问 Application Load Balancer。这使得用户只能通过 CloudFront 访问 Application Load Balancer,从而确保您获得使用 CloudFront 的益处。
要防止用户直接访问 Application Load Balancer 并仅允许通过 CloudFront 进行访问,请完成以下高级步骤:
-
将 CloudFront 配置为将自定义 HTTP 标头添加到向 Application Load Balancer 发送的请求中。
-
将 Application Load Balancer 配置为仅转发包含自定义 HTTP 标头的请求。
-
(可选)需要 HTTPS 来提高此解决方案的安全性。
有关更多信息,请参阅以下主题。完成这些步骤后,用户只能通过 CloudFront 访问您的 Application Load Balancer。
配置 CloudFront 以向请求添加自定义 HTTP 标头
您可以将 CloudFront 配置为将自定义 HTTP 标头添加到向您的源(在本例中为 Application Load Balancer)发送的请求中。
此使用案例依赖于对自定义标头名称和值保密。如果标头名称和值没有保密,其他 HTTP 客户端可能会将它们包含在直接发送到 Application Load Balancer 的请求中。这可能会导致 Application Load Balancer 的行为看起来就好像请求来自 CloudFront,但实际上请求并非来自 CloudFront。为防止这种情况,请将自定义标头名称和值保密。
您可以将 CloudFront 配置为使用 CloudFront 控制台、Amazon CloudFormation 或 CloudFront API 向源请求添加自定义 HTTP 标头。
- 要添加自定义 HTTP 标头(CloudFront 控制台)
-
在 CloudFront 控制台中,使用源设置中的源自定义标题设置。输入标头名称及其值,如以下示例所示。
注意 本示例中的标头名称和值仅用于演示。在生产中,使用随机生成的值。将标题名称和值视为安全凭证,如用户名和密码。
当您为现有的 CloudFront 分配创建或编辑源时,以及当您创建新分配时,您可以编辑源自定义标头设置。有关更多信息,请参阅 更新分配 和 创建分配。
- 要添加自定义 HTTP 标头 (Amazon CloudFormation)
-
在 Amazon CloudFormation 模板中,使用
OriginCustomHeaders
属性,如以下示例所示。注意 本示例中的标头名称和值仅用于演示。在生产中,使用随机生成的值。将标题名称和值视为安全凭证,如用户名和密码。
AWSTemplateFormatVersion: '2010-09-09' Resources: TestDistribution: Type: 'AWS::CloudFront::Distribution' Properties: DistributionConfig: Origins: - DomainName: app-load-balancer.example.com Id: Example-ALB CustomOriginConfig: OriginProtocolPolicy: https-only OriginSSLProtocols: - TLSv1.2 OriginCustomHeaders: - HeaderName: X-Custom-Header HeaderValue: random-value-1234567890 Enabled: 'true' DefaultCacheBehavior: TargetOriginId: Example-ALB ViewerProtocolPolicy: allow-all CachePolicyId: 658327ea-f89d-4fab-a63d-7e88639e58f6 PriceClass: PriceClass_All ViewerCertificate: CloudFrontDefaultCertificate: 'true'
有关更多信息,请参阅 Amazon CloudFormation 用户指南中的 Origin 和 OriginCustomHeader 属性。
- 要添加自定义 HTTP 标头 (CloudFront API)
-
在 CloudFront API 中,使用
Origin
中的CustomHeaders
对象。有关更多信息,请参阅 Amazon CloudFront API 参考中的 CreateDistribution 和 UpdateDistribution,以及适用于开发工具包或其他 API 客户端的文档。
有些标头名称不能指定为源自定义标头。有关更多信息,请参阅 CloudFront 无法添加到源请求的自定义标头。
将 Application Load Balancer 配置为仅转发包含特定标头的请求
将 CloudFront 配置为将自定义 HTTP 标头添加到向 Application Load Balancer 发送的请求中后(请参阅上一部分),您可以将负载均衡器配置为仅转发包含此自定义标头的请求。您可以通过添加新规则并在负载均衡器的侦听器中修改默认规则来完成此操作。
先决条件
要使用以下过程,您需要至少具有一个侦听器的 Application Load Balancer。如果您尚未创建 Application Load Balancer,请参阅 适用于 Application Load Balancers 的用户指南中的创建 Application Load Balancer。
以下过程将修改 HTTPS 侦听器。您可以使用相同的过程来修改 HTTP 侦听器。
要在 Application Load Balancer 侦听器中更新规则
-
在 Amazon EC2 控制台中打开负载均衡器页面
。 -
选择作为 CloudFront 分配源的负载均衡器,然后选择侦听器选项卡。
-
对于正在修改的侦听器,请选择查看/编辑规则。
-
选择图标以添加规则。
-
选择 Insert Rule。
-
对于新规则,请执行以下操作:
-
选择添加条件,然后选择 Http 标头。在 CloudFront 中指定作为源自定义标头添加的 HTTP 标头名称和值。
-
选择添加操作,然后选择转发到。选择要转发请求的目标组。
-
选择保存以创建新规则。
-
-
选择图标以编辑规则。
-
选择默认规则的编辑图标。
-
对于默认规则,请执行以下操作:
-
删除默认操作。
-
选择添加操作,然后选择返回固定响应。
-
对于响应代码,输入
403
。 -
对于响应正文,输入
Access denied
。 -
选择更新以更新默认规则。
-
完成这些步骤后,负载均衡器侦听器会有两个规则,如下图所示。第一条规则转发包含 HTTP 标头的请求(来自 CloudFront 的请求)。第二条规则向所有其他请求(并非来自 CloudFront 的请求)发送固定响应。

您可以通过向 CloudFront 分配发送请求和向 Application Load Balancer 发送一个请求来验证该解决方案是否有效。对 CloudFront 的请求将返回您的 Web 应用程序或内容,直接发送到 Application Load Balancer 的请求将返回403
带有纯文本消息的响应Access denied
。
(可选)提高此解决方案的安全性
为了提高此解决方案的安全性,您可以将 CloudFront 分配配置为在向 Application Load Balancer 发送请求时始终使用 HTTPS。请记住,此解决方案仅在您对自定义标头名称和值保密时才有效。使用 HTTPS 可以帮助防止窃听者发现标头名称和值。我们还建议定期轮换标头名称和值。
使用 HTTPS 进行源请求
要将 CloudFront 配置为使用 HTTPS 处理源请求,请将源协议策略设置设为仅限 HTTPS。此设置可在 CloudFront 控制台、Amazon CloudFormation 和 CloudFront API 中使用。有关更多信息,请参阅 协议(仅自定义源)。
当您将 CloudFront 配置为使用 HTTPS 处理源请求时,您需要确保 Application Load Balancer 具有 HTTPS 侦听器(如上一部分所示)。这要求您拥有与路由到 Application Load Balancer 的域名匹配的 SSL/TLS 证书。有关更多信息,请参阅适用于 Application Load Balancers 的用户指南中的创建 HTTPS 侦听器。
如果 Web 应用程序的最终用户(也称为查看器或客户端)可以使用 HTTPS,则还可以将 CloudFront 配置为首选(甚至需要)来自最终用户的 HTTPS 连接。为此,请使用查看器协议策略设置。您可以将其设置为将最终用户从 HTTP 重定向到 HTTPS,或拒绝使用 HTTP 的请求。此设置可在 CloudFront 控制台、Amazon CloudFormation 和 CloudFront API 中使用。有关更多信息,请参阅 查看器协议策略。
轮换标头名称和值
除了使用 HTTPS 之外,我们还建议定期轮换标头名称和值。执行此操作的高级步骤如下:
-
将 CloudFront 配置为将另一个自定义 HTTP 标头添加到向 Application Load Balancer 发送的请求中。
-
更新 Application Load Balancer 侦听器规则,以转发包含另一个自定义 HTTP 标头的请求。
-
配置 CloudFront 以停止将原始自定义 HTTP 标头添加到向 Application Load Balancer 发送的请求中。
-
更新 Application Load Balancer 侦听器规则,以停止转发包含原始自定义 HTTP 标头的请求。
有关完成这些步骤的更多信息,请参阅前面的部分。