如何利用 AWS WAF 控制 CloudFront 内容访问

前言

AWS CloudFront 提供多种保护选项,以确保其传输内容的安全性。您可以通过以下手段保护和限制内容访问:

  • 配置 HTTPS 连接
  • 阻止特定地理位置的用户访问内容
  • 要求用户使用 CloudFront 签名 URL 或签名 Cookie 进行访问
  • 对特定内容字段实施字段级加密
  • 使用 AWS WAF 管控内容访问

使用 AWS WAF 控制内容访问的介绍

接下来我们将详细介绍如何**“使用 AWS WAF 管控内容访问”**。

AWS WAF 是一种网络应用防火墙,能够监控传送至 CloudFront 的 HTTP 和 HTTPS 请求,并控制对内容的访问。

图片

步骤 01:准备 CloudFront 分配

图片

图片

请注意:确保将复制的策略添加到 S3 存储桶策略中。

图片

图片

步骤 02:创建 WAF

1. 创建 Web ACL

  1. 登陆 AWS WAF 控制台,在主页选择“创建 Web ACL”。
  2. 在名称字段中输入此 Web ACL 的标识名称。
  3. (可选)填写描述字段。
  4. (可选)更改 CloudWatch 指标名称(如果适用),该名称不能包含 AWS WAF 保留的特殊字符、空格或指标名称(如“All”和“Default_Action”)。
  5. 选择“CloudFront 分配”作为资源类型,该选项将自动填充为 Global (CloudFront)。
  6. (可选)添加 AWS 资源,选择您希望关联的资源,然后点击“添加”。
  7. 选择“下一步”。

注意:

【1】创建 Web ACL 后无法更改名称。
【2】创建 Web ACL 后无法更改 CloudWatch 指标名称。

图片

图片

2. 添加字符串匹配规则

  1. 在“添加规则和规则组”页面上,选择“添加规则”、“添加我自己的规则和规则组”,然后选择“规则可视化编辑器”。
  2. 在名称字段输入标识此规则的名称。
  3. 在类型中,选择“常规规则”。

图片

图片

  1. 在“如果请求”下,选择“与语句匹配”。
  2. 在声明中,选择 AWS WAF 要检查的 Web 请求组件。在此示例中,选择“标头”。同时,指定希望 AWS WAF 检查的标头,输入User-Agent(不区分大小写)。
  3. 对于匹配类型,选择“完全匹配字符串”,意味着 AWS WAF 将检查每个 Web 请求中的 User-Agent 标头,确认其是否与指定字符串相符。
  4. 在“要匹配的字符串”字段输入 AWS WAF 要搜索的字符串,最大长度是 200 个字符。在此示例中,输入MyAgent
  5. 将文本转换设置保留为“无”。

图片

  1. 在操作中,选择您希望规则在与 Web 请求匹配时执行的操作。在此示例中,选择“计数”,并保持其他选项不变。此操作会为符合规则的 Web 请求创建指标,但不会影响请求是否被允许或阻止。有关操作选择的更多信息,请参考 AWS WAF 规则操作和 Web ACL 规则及规则组评估。
  2. 选择“添加规则”。

图片

3. 添加 AWS 托管规则组

  1. 在“添加规则和规则组”页面上,选择“添加规则”,然后选择“添加托管规则组”。

图片

  1. 展开 AWS 托管规则组列表,选择要添加的规则组:
    • 在“操作”列中,启用“添加到 Web ACL”。
    • 选择“编辑”,在规则组的规则列表中选择“覆盖所有规则操作”下拉列表,选择“计数”。这将把规则组中所有规则的操作设置为仅计数,以便您在使用 Web 请求之前查看规则组中的所有规则是如何处理的。
    • 选择“保存规则”。

图片

图片

图片

  1. 在添加托管规则组页面中,选择“添加规则”,这将返回“添加规则和规则组”页面。

4. 完成 Web ACL 配置

完成向 Web ACL 配置中添加规则和规则组后,您将通过管理 Web ACL 中规则的优先级及配置监控指标、标记和日志记录等设置来结束。

  1. 在“添加规则和规则组”页面上,选择“下一步”。

图片

  1. 在设置规则优先级页面上,您可以查看 Web ACL 中规则和规则组的处理顺序。 AWS WAF 将从列表的顶部开始处理。您可以通过向上或向下移动规则来更改处理顺序。要更改顺序,请在列表中选择一个规则,然后选择“上移”或“下移”。
  2. 选择“下一步”。

图片

  1. 在配置指标页面,您可以查看规则和规则组的计划指标及网络请求抽样选项。

  2. 选择“下一步”。

图片

  1. 在“审核和创建 Web ACL”页面查看您的设置,选择“创建 Web ACL”。

图片

图片

向导将返回到 Web ACL 页面,您可以在该页面看到您的新 Web ACL 列表。

图片

步骤 03:修改 WAF 对内容的访问控制

创建 AWS WAF Web 访问控制列表 (Web ACL) 后,您可以创建或更新 Web 分配并将其与 Web ACL 关联。您可以将多个 CloudFront 分配关联至同一 Web ACL 或不同的 Web ACL。

步骤:

  1. 登录 CloudFront 控制台,选择要更新的分配 ID。
  2. 在“常规”选项卡上,选择“编辑”。
  3. 在分配设置页面上的 AWS WAF Web ACL 列表中,选择要与该分配关联的 Web ACL。
    • 如果您希望从所有 Web ACL 取消关联,请选择“无”。
    • 如果希望将分配与其他 Web ACL 关联,请选择新的 Web ACL。
  4. 选择“是”以确认编辑。

图片

图片

在更改设置后,CloudFront 会将更改传播到边缘站点,此时更新的分配状态将显示为“进行中”。一旦分配的状态变为“已部署”,即表示分配准备好在处理请求时使用 AWS WAF(该状态也必须为“已启用”)。此过程可能需要不到 15 分钟的时间。

步骤 04:利用 AWS WAF 管控对内容的访问

根据指定条件(例如查询字符串的值或请求来源的 IP 地址),CloudFront 可以选择使用所请求的内容响应请求,或返回 HTTP 状态代码 403(禁止)。此外,您还可以配置 CloudFront 来返回自定义错误页面。

1. AWS WAF 与 CloudFront 自定义错误页面的结合

默认情况下,当 AWS WAF 根据您指定条件阻止 Web 请求时,它将返回 HTTP 状态代码 403(禁止),并将其传递给 CloudFront,随后 CloudFront 将该状态码返回给用户。用户将看到一条简洁且格式简略的默认消息,例如:

Forbidden: You don't have permission to access /myfilename.html on this server.

通过在 AWS WAF Web ACL 规则中定义自定义响应,您可以替换该行为。

注意: AWS WAF 规则中自定义的响应将优先于您在 CloudFront 自定义错误页面中定义的任何响应规范。

如果您希望通过显示自定义错误消息来保持与网站其他部分相同的格式,可以配置 CloudFront 返回包含自定义错误消息的对象(例如 HTML 文件)。

注意: CloudFront 无法区分源返回的 HTTP 状态码 403 和请求被 AWS WAF 阻止时返回的状态码 403。也就是说,您无法根据 HTTP 状态码 403 的不同原因返回不同的自定义错误页面。

例如:阻止操作的自定义响应

您可以设置 AWS WAF 将自定义 HTTP 响应发送回客户端,这适用于设置为“阻止”的规则操作或 Web ACL 默认操作。

自定义响应的用例包括:

  • 将非默认状态码返回给客户端。
  • 向客户端发送静态错误页面。
  • 将客户端重定向到不同的 URL。您需要指定一个 3xx 重定向状态码(例如 301(永久移动)或 302(已找到)),并指定新 URL 的 Location 头。

对于 AWS WAF 阻止的 Web 请求,以下是优先级的展示:

  1. AWS WAF 自定义响应 - 如果启用了自定义响应,受保护资源将发送配置的自定义响应给客户端。这适用于 AWS WAF 中定义的自定义响应,无论其是否仅指定 HTTP 代码、自定义页面或两者。
  2. 受保护资源中定义的自定义响应 - 否则,如果受保护资源指定了自定义响应设置,将使用这些设置响应客户端。
  3. AWS WAF 默认阻止响应 - 否则,受保护资源将使用 AWS WAF 默认的 403(禁止)响应客户端。

2. 结合 AWS WAF 与您自有的 HTTP 服务器使用 CloudFront

利用 AWS WAF 结合 CloudFront,您可以保护任何在 HTTP Web 服务器上运行的应用程序,无论该服务器是在亚马逊弹性计算云 (Amazon EC2) 中运行还是您自己管理的 Web 服务器。同时,您还可以配置 CloudFront 要求在 CloudFront 和您自己的 Web 服务器之间以及查看者与 CloudFront 之间使用 HTTPS。

  • 在 CloudFront 和您自己的网络服务器之间要求 HTTPS

您可以通过 CloudFront 自定义源功能,为特定源配置源协议策略和源域名设置,以在二者之间要求 HTTPS。

  • 在查看者和 CloudFront 之间要求 HTTPS

您可以在 CloudFront 分配中更改一个或多个缓存行为的查看者协议策略,以要求在二者之间使用 HTTPS。

3. 选择 CloudFront 响应的 HTTP 方法

创建 Amazon CloudFront Web 分配时,您可以选择通过 CloudFront 处理并转发到源的 HTTP 方法,选项包括:

  • GET、HEAD - 只能从源中获取对象或对象标头。
  • GET、HEAD、OPTIONS - 允许从源中获取对象、对象标头或检索源服务器支持的选项列表。
  • GET、HEAD、OPTIONS、PUT、POST、PATCH、DELETE - 允许获取、添加、更新和删除对象,以及获取对象标头。此外,您还可以执行其他 POST 操作,例如从 Web 表单提交数据。

您还可以使用 AWS WAF 字节匹配规则语句来控制基于 HTTP 方法的请求,如字符串匹配规则语句中所述。

如果您希望组合使用 CloudFront 支持的方法,例如 GET 和 HEAD,则无需配置 AWS WAF 来阻止其他方法的请求。

如果您希望允许 CloudFront 不支持的方法组合(例如 GET、HEAD 和 POST),则可以将 CloudFront 配置为响应所有方法,并使用 AWS WAF 阻止其他方法的请求。

参考链接:

[1] https://docs.aws.amazon.com/zh_cn/waf/latest/developerguide/getting-started.html

[2] https://docs.aws.amazon.com/zh_cn/waf/latest/developerguide/cloudfront-features.html