使用 AWS WAF 挑战和 CAPTC

使用 AWS WAF 防范机器人攻击

关键要点

  • AWS WAF 使用 CAPTCHA 和 Challenge 动作来保护应用程序免受机器人的威胁。
  • Challenge 动作要求客户端完成计算密集型任务,而 CAPTCHA 动作则要求用户解答谜题。
  • 这两种动作提高了对请求客户端环境的可见性,以更好地管理机器人流量,并减少对合法用户的影响。
  • 本文将介绍 Challenge 和 CAPTCHA 动作的工作原理及如何利用它们来减轻特定的机器人威胁。

保护免受机器人攻击需要深入分析客户端环境,而不仅仅依赖于请求的网络级特征,如 TCP 或 HTTP 负载签名。AWS WAF 利用 CAPTCHA 和 Challenge 动作,与客户端进行互动,以了解其环境,从而决定是否允许该请求进入。Challenge动作要求客户端(浏览器或移动设备)在继续之前解决一个问题,而 CAPTCHA 则在用户的浏览器上呈现需要人类解决的难题。

这些动作补充了允许、计数和阻止的功能,提供了请求客户端环境的额外可见性,从而便于识别和管理机器人流量,同时最小化对合法用户的影响。

本文将介绍 Challenge 和 CAPTCHA 动作的工作原理,以及如何使用它们减轻特定的机器人威胁。

Challenge 和 CAPTCHA 动作如何识别和管理机器人

Challenge 和 CAPTCHA 动作涉及浏览器或移动设备的互动过程,包括三个阶段:

  1. 要求客户端(Challenge)静默完成一个计算任务,或通过人类交互解决一个谜题(CAPTCHA)。
  2. 通过客户端脚本对客户端环境进行询问并生成指纹。
  3. AWS WAF 验证问题的解决方案,并使用指纹生成一个唯一标识客户端会话的 Token。此 Token 将包含在后续请求中,以验证请求是否可以通过 CAPTCHA 或 Challenge 动作。

此互动可以通过以下两种方式进行处理:

  • AWS WAF 集成 SDK: 将应用程序与 AWS WAF 集成,使您可以明确控制这些阶段与应用程序及用户体验的关系。AWS 推荐这种方法。
  • 插页式互动: AWS WAF 通过在页面载入期间提供包含挑战内容的自定义响应,完成交互阶段。

接下来,我们将说明 Challenge 和 CAPTCHA 动作如何与最终用户和客户端进行互动。

Challenge 动作如何与客户端互动

Challenge动作在客户端环境中执行一个静默挑战,不需要用户交互,对用户体验没有明显影响。挑战要求客户端完成一个计算密集型任务(工作证明)。此方法旨在为合法用户提供一种顺畅的机制,以验证他们的环境,同时增加机器人运营者与您的应用程序交互的成本。

无集成 SDK 使用 Challenge 动作(插页式互动)

Challenge 动作默认以 JavaScript 挑战负载响应 HTML 请求( Accept: text/html ),无声地完成挑战。然后,用户将自动重定向回原始页面,并带有允许他们的请求通过后续需要 Challenge 的规则的 Token。下面的图 1说明了该互动的工作流程。

![图 1: 用户、浏览器与 AWS WAF删除)

使用应用集成 SDK 的 Challenge 动作

如果未与应用集成 SDK 集成,则触发 Challenge 动作的非 HTML 请求将返回 HTTP 202 响应,这会中断资源和 fetch 请求。因此,我们建议您将应用程序与应用集成 SDK 集成,以便客户端在提交请求之前完成挑战并获取 Token。图 2 说明了这种互动的工作流程。

![图 2: 用户、浏览器与 AWS WAF 保护资源之间挑战 SDK删除)

集成应用程序 SDK 需要您使用至少一个来自 AWS WAF Bot Control for Targeted Bots 或 AWS WAF FraudControl 的 Amazon 托管规则。有关详细信息,请阅读我们的文章, ,以及我们的文章 。有两种应用集成 SDK 可供使用:

  1. JavaScript SDK: 此 适用于基于浏览器的应用程序,特别是使用 AWS WAF 规则保护 API 端点的单页应用程序(SPA)。集成 JavaScript SDK 的三个部分确保为每个请求生成并提供 Token:
    • 必需:在 HTML 头中嵌入 JavaScript。此操作在页面加载期间运行挑战。
    • 推荐:将您的 fetch 调用更新为使用应用集成 : AwsWafIntegration.fetch 。这确保您在发出请求之前始终拥有 Token。您也可以通过调用 方法 AwsWafIntegration.getToken() 来设置 x-aws-waf-token 请求头。
    • 推荐:如果您的应用程序跨域请求, 请 (例如,www.example.com 向 api.example.com 发出 API 请求)。
  2. 移动 SDK: 此 SDK 适用于 Android 和 iOS。其底层工作流程与 JavaScript SDK 类似,详细信息请参见 。

保护应用程序免受 DDoS 威胁的示例

机器人操作者可以利用成千上万的机器人同时向应用程序发起少量请求。所有机器人的并发请求总数可能仍然会压垮应用程序,因为每个 IP 的请求低于 AWS WAF的速率限制规则阈值(每分钟 100 个请求)。

您可以通过配置 AWS WAF规则,要求在请求转发到您的应用程序之前完成挑战,从而减轻这些威胁的影响。这要求机器人操作者完成工作证明,从而增加操作者的成本。要设置一个通用的 AWSWAF 规则以要求在请求对端点 /account 时完成挑战,请按以下步骤操作:

  1. 打开 ,然后执行以下任一操作:
    • 若要创建新的 Web ACL,选择 创建 Web ACL
    • 若要编辑现有 Web ACL,选择 ACL 的名称。
  2. 规则 选项卡下,针对 添加规则 下拉菜单,选择 添加我自己的规则和规则组
  3. 对于 规则 配置:
    • 输入规则的 名称
    • 将规则保持为 常规规则
  4. 对于 语句 配置,提供下列信息,如图 3 所示:
    • 检查 中,选择 URI 路径
    • 匹配类型 中,选择 完全匹配字符串
    • 对于 匹配字符串 ,输入 /account。
  5. 对于 动作 配置,选择 挑战

![图 3: AWS WAF删除)

  1. 若要将规则添加到您的 Web ACL,选择 添加规则
  2. 配置 Web ACL 的规则优先级,并选择 保存
  3. 可选:如果您还使用了 AWS WAF Bot Control 或 AWS WAF Fraud Control 规则组,则将应用程序集成与 AWS WAF 应用集成 SDK。

CAPTCHA 动作如何与客户端互动

CAPTCHA 动作要求有人在请求成功之前完成谜题。这个谜题的目的是证明用户是人类。图 4 显示了用户需要解决的两种谜题。

![图 4: AWS WAF CAPTCHA删除)

无集成使用 CAPTCHA 动作

如果您的应用程序未与 CAPTCHA 动作集成,则触发 CAPTCHA 动作的 HTML 请求( Accept: text/html )会返回一个页面,该页面呈现 CAPTCHA 谜题并在后台解决 Challenge。解决 CAPTCHA 后,AWS WAF 会发出一个 Token,允许后续请求通过带有 CAPTCHA 动作的规则,直到 Token 过期。图 5 说明了用户、浏览器与 AWS WAF 之间的互动。

![图 5: 用户、浏览器与 AWS WAF 保护资源间插页式 CAPTCHA删除)

使用 CAPTCHA JavaScript API 的 CAPTCHA 动作

CAPTCHA JavaScript API 使您能够在请求发送到受 CAPTCHA 动作保护的资源之前,在前端网页应用程序的任何时刻显示 CAPTCHA谜题。这也会在后台完成 Challenge。推荐这种方法,因为非 text/html 的资产(图片、JavaScript)和 fetch 请求会收到 HTTP 405 响应,这可能会破坏您的前端网页应用程序,从而影响用户体验。图 6 展示了 AWS WAF Token 生成所需的互动流程。

我们发布了一篇文章,,详述了将 CAPTCHAJavaScript API 集成到应用程序中的过程,并提供了一个代码示例,供将 CAPTCHA JavaScript SDK 集成到您的 React前端使用。AWS WAF CAPTCHA 不支持移动设备。

![图 6: 用户、浏览器与 AWS WAF 保护资源间 CAPTCHA SDK删除)

示例:根据 IP 声誉选择性要求人类完成 CAPTCHA

IP 声誉规则有助于识别和阻止通常与机器人和其他威胁流量相关联的 IP 地址。例如,您可以使用 AWSManagedIPDDoSList 规则来阻止 AWS威胁情报识别为进行 DDoS 活动的 IP 流量。如果一个合法用户恰好与该 IP地址共享(可能是因为网络上的另一个设备被机器人操作者控制),这可能会造成问题。您可以通过要求合法用户在能够向应用程序发送请求之前解决 CAPTCHA来允许他们通过此规则:

  1. 打开 ,然后执行以下任一操作:
    • 若要创建新的 Web ACL,选择 创建 Web ACL
    • 若要编辑现有 Web ACL,选择 ACL 的名称。
  2. 规则 选项卡下,针对 添加规则 下拉菜单,选择 添加托管规则组
  3. Amazon IP 声誉列表 规则集添加到 Web ACL。然后选择 编辑 来编辑规则配置。
  4. 对于 Amazon IP 声誉列表规则
    • 对于 AWSManagedIPDDoSList ,选择 CAPTCHA ,如图 7 所示。

![图 7: 带 CAPTCHA 覆盖的 Amazon IP删除)

  1. 若要保存配置,选择 保存
  2. 要将 Amazon IP 声誉列表规则 规则组添加到您的 Web ACL,请选择 添加规则
  3. 配置 Web ACL 的规则优先级,并选择 保存
  4. 可选:将应用程序集成与 CAPTCHA JavaScript SDK 相集成。

Token 的工作原理

AWS WAF 在执行 Challenge 和 CAPTCHA 动作后会生成一个 Token。该 Token 本身是加密的,不可篡改的,并作为名为 aws-waf-token 的 cookie 实现。该 Token 对用户是不可见的,但包含的详细信息有助于识别客户端会话。其中一些细节包括:

  • 时间戳: 生成 Token 的时间。默认情况下,客户端在 5 分钟内免受重新挑战。您可以在 中找到有关设置免疫时间段的信息。
  • 浏览器指纹: 由客户端浏览器环境的多个数据点生成的哈希,包括浏览器插件、JavaScript 环境和其他特征。
  • 已解决的谜题类型: 完成了 Challenge 还是 CAPTCHA(或两者)的问题。
  • Token 域: 这是 AWS WAF 接收请求的域。默认情况下,基于客户端主机名设置,例如 www.example.com ,并使用作 Token cookie 的 domain 设置。在每个请求中,此 cookie 及其 Token 将发送到 www.example.com 。您可以根据 在前端应用程序和 Web ACL 中更新 Token 域。这在您有一个运行在 www.example.com 的单页应用程序(SPA)和一个运行在 api.example.com 的 API 时尤为有用——将 Token 域设置为 .example.com 将使浏览器为所有 example.com 的子域发送 Token/cookie。有关配置 Token 域的更多详细信息,请参考我们的 。

Challenge、CAPTCHA 和 Token 如何用于管理机器人流量

这些动作及其生成的 Token 具有辨识和管理机器人流量的以下特性:

  1. 需要完整的客户端: Challenge 和 CAPTCHA 动作都要求客户端能够执行客户端脚本。这减少了简单的 HTTP 请求驱动的机器人,它们无法运行 JavaScript。
  2. 增加机器人操作者的成本: 解决 Challenge 和 CAPTCHA 谜题要求机器人操作者在构建和运行复杂机器人方面投入更多成本。这构成了对机器人使用您应用程序的另一个进入障碍。
  3. 唯一识别客户端: 共享同一 IP 地址或在多个 IP 地址之间切换的客户端可以通过唯一 Token 进行区分,这意味着机器人无法轻易模仿来自单一主机/IP 的多个客户端。
  4. 指纹识别客户端环境: Token 中提供的指纹可用于识别可能表明存在机器人自动化的浏览器和移动设备配置。

结论

在本文中,我们向您展示了 Challenge 和 CAPTCHA 动作在 AWS WAF 中如何运作,以及如何使用这些动作减轻特定的机器人威胁。我们有关 的文档提供了进一步的指南,帮助您充分利用这些动作。

关于作者

![David删除)

David MacDonald

David 是一名高级解决方案架构师,专注于帮助新西兰初创企业构建安全且可扩展的解决方案。他的大部分职业生涯都致力于构建和运营服务于多种行业的 SaaS产品。

![JessIzen](https://d2908q01vomqb2.cloudfront.net/5b384ce32d8cdef02bc3a139d4cac0a22bb029e8/2024/05/20/AuthorImage- 删除)

Jess Izen

Jess Izen 是 AWS WAF 的高级软件开发工程师,负责构建 Bot Control 和 Fraud Control等产品。她喜欢处理对性能敏感的,高度并发的 Rust 服务,以及涉及 Kafka 和 Redis/Valkey等技术的分布式系统。在业余时间,她骑自行车并参加业余泰拳比赛。您可以在 [LinkedIn](https://

Leave a Reply

Required fields are marked *