限制访问 Application Load Balancer - Amazon CloudFront

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

限制访问 Application Load Balancer

对于由 Elastic Load Balancing 中的应用程序负载均衡器提供的 Web 应用程序或其他内容, CloudFront 可以缓存对象并将其直接提供给用户(查看者),从而减少应用程序负载均衡器的负载。 CloudFront还可以帮助减少延迟,甚至可以吸收一些分布式拒绝服务 (DDoS) 攻击。但是,如果用户可以绕过 CloudFront 并直接访问您的 Application Load Balancer,那么您将无法获得这些好处。但是,您可以配置 Amazon CloudFront 和您的应用程序负载均衡器,以防止用户直接访问应用程序负载均衡器。这允许用户仅通过访问Application Load Balancer CloudFront,从而确保您获得使用的好处 CloudFront。

要防止用户直接访问 Application Load Balancer 并仅允许通过访问 CloudFront,请完成以下高级步骤:

  1. 配置 CloudFront 为向其发送到 Application Load Balancer 的请求添加自定义 HTTP 标头。

  2. 将 Application Load Balancer 配置为仅转发包含自定义 HTTP 标头的请求。

  3. (可选)需要 HTTPS 来提高此解决方案的安全性。

有关更多信息,请参阅以下主题。完成这些步骤后,用户只能通过访问您的 Application Load Balancer CloudFront。

配置 CloudFront 为向请求添加自定义 HTTP 标头

您可以配置 CloudFront 为向其发送到您的源(在本例中为 Application Load Balancer)的请求中添加自定义 HTTP 标头。

重要

此使用案例依赖于对自定义标头名称和值保密。如果标头名称和值没有保密,其他 HTTP 客户端可能会将它们包含在直接发送到 Application Load Balancer 的请求中。这可能会导致 Application Load Balancer 的行为就像 CloudFront 请求来自而不是请求一样。为防止这种情况,请将自定义标头名称和值保密。

您可以配置 CloudFront 为使用 CloudFront控制台或 CloudFront API 向源请求添加自定义 HTTP 标头。AWS CloudFormation

添加自定义 HTTP 标头(CloudFront 控制台)

在 CloudFront 控制台中,使用 Origin 设置中的 Origin 自定义标头设置。输入标头名称及其,如以下示例所示。

注意

本示例中的标头名称和值仅用于演示。在生产中,使用随机生成的值。将标题名称和值视为安全凭证,如用户名和密码。


                             CloudFront控制台中的 Origin 自定义标题字段。

在为现有 CloudFront 分配创建或编辑来源以及创建新分配时,您可以编辑 Origin Custom Headers 设置。有关更多信息,请参阅 更新分配创建分配

要添加自定义 HTTP 标头 (AWS CloudFormation)

在 AWS 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'

有关更多信息,请参阅《AWS CloudFormation用户指南》中的 OriginOriginCustomHeader属性。

添加自定义 HTTP 标头 (CloudFront API)

在 CloudFront API 中,使用里面的CustomHeaders对象Origin。有关更多信息,请参阅 Amazon CloudFront API 参考UpdateDistribution中的CreateDistribution和,以及您的软件开发工具包或其他 API 客户端的文档。

有些标头名称不能指定为源自定义标头。有关更多信息,请参阅 CloudFront 无法添加到原始请求的自定义标头

将 Application Load Balancer 配置为仅转发包含特定标头的请求

在配置 CloudFront 为向其发送到 Application Load Balancer 的请求中添加自定义 HTTP 标头后(参见上一节),您可以将负载均衡器配置为仅转发包含此自定义标头的请求。您可以通过添加新规则并在负载均衡器的侦听器中修改默认规则来完成此操作。

先决条件

要使用以下过程,您需要至少具有一个侦听器的 Application Load Balancer。如果您尚未创建应用程序负载均衡器,请参阅《应用程序负载均衡器用户指南》中的 “创建应用程序负载均衡器”。

以下过程将修改 HTTPS 侦听器。您可以使用相同的过程来修改 HTTP 侦听器。

要在 Application Load Balancer 侦听器中更新规则
  1. 在 Amazon EC2 控制台中打开负载均衡器页面

  2. 选择作为 CloudFront 分配来源的负载均衡器,然后选择 Li steners 选项卡。

  3. 对于正在修改的侦听器,请选择查看/编辑规则

    
                        在 Amazon EC2 控制台中@@ 查看/编辑负载均衡器的规则链接。
  4. 选择图标以添加规则。

    
                        在 Amazon EC2 控制台中添加规则到负载均衡器中。
  5. 选择 Insert Rule

    
                        在 Amazon EC2 控制台插入规则到负载均衡器中。
  6. 对于新规则,请执行以下操作:

    1. 选择添加条件,然后选择 Http 标头。指定您在中作为原始自定义标头添加的 HTTP 标头名称和值 CloudFront。

    2. 选择添加操作,然后选择转发到。选择要转发请求的目标组。

    3. 选择保存以创建新规则。

    
                        Amazon EC2 控制台中负载均衡器中的新规则。
  7. 选择图标以编辑规则。

    
                        在 Amazon EC2 控制台中为负载均衡器编辑规则。
  8. 选择默认规则的编辑图标。

    
                        在 Amazon EC2 控制台中为负载均衡器编辑默认规则。
  9. 对于默认规则,请执行以下操作:

    1. 删除默认操作。

      
                                在 Amazon EC2 控制台中删除负载均衡器的默认规则。
    2. 选择添加操作,然后选择返回固定响应

    3. 对于响应代码,输入 403

    4. 对于响应正文,输入 Access denied

    5. 选择更新以更新默认规则。

    
                        在 Amazon EC2 控制台中更新负载均衡器的默认规则。

完成这些步骤后,负载均衡器侦听器会有两个规则,如下图所示。第一条规则转发包含 HTTP 标头的请求(来自的请求 CloudFront)。第二条规则向所有其他请求(不是来自的请求 CloudFront)发送固定响应。


                已在 Amazon EC2 控制台中更新了负载均衡器的规则。

您可以通过向您的 CloudFront 分配和您的 Application Load Balancer 发送请求来验证解决方案是否有效。 CloudFront 返回您的 Web 应用程序或内容的请求以及直接发送到您的 Application Load Balancer 的请求会返回包含纯文本消息的403响应Access denied

(可选)提高此解决方案的安全性

为了提高此解决方案的安全性,您可以将 CloudFront 分配配置为在向 Application Load Balancer 发送请求时始终使用 HTTPS。请记住,此解决方案仅在您对自定义标头名称和值保密时才有效。使用 HTTPS 可以帮助防止窃听者发现标头名称和值。我们还建议定期轮换标头名称和值。

使用 HTTPS 进行源请求

CloudFront 要配置为对源请求使用 HTTPS,请将 “源协议策略” 设置设置为 “仅限 HTTPS”。此设置可在 CloudFront 控制台AWS CloudFormation、和 CloudFront API 中找到。有关更多信息,请参阅协议(仅自定义源)

当您配置 CloudFront 为对源请求使用 HTTPS 时,需要确保您的 Application Load Balancer 具有 HTTPS 侦听器(如上一节所示)。这要求您拥有与路由到 Application Load Balancer 的域名匹配的 SSL/TLS 证书。有关更多信息,请参阅《应用程序负载均衡器用户指南》中的创建 HTTPS 侦听器。

如果您的 Web 应用程序的最终用户(也称为查看者客户端)可以使用 HTTPS,您也可以配置 CloudFront 为首选(甚至要求)最终用户的 HTTPS 连接。为此,请使用查看器协议策略设置。您可以将其设置为将最终用户从 HTTP 重定向到 HTTPS,或拒绝使用 HTTP 的请求。此设置可在 CloudFront 控制台AWS CloudFormation、和 CloudFront API 中找到。有关更多信息,请参阅查看器协议策略

轮换标头名称和值

除了使用 HTTPS 之外,我们还建议定期轮换标头名称和值。执行此操作的高级步骤如下:

  1. 配置 CloudFront 为向其发送到 Application Load Balancer 的请求添加额外的自定义 HTTP 标头。

  2. 更新 Application Load Balancer 侦听器规则,以转发包含另一个自定义 HTTP 标头的请求。

  3. 配置 CloudFront 为停止向其发送到 Application Load Balancer 的请求中添加原始自定义 HTTP 标头。

  4. 更新 Application Load Balancer 侦听器规则,以停止转发包含原始自定义 HTTP 标头的请求。

有关完成这些步骤的更多信息,请参阅前面的部分。