亚马逊AWS官方博客

在移动应用中集成 AWS WAF Bot Control 实现电商网站防护

电商网站面临着各种自动化工具的威胁,包括:

  1. 价格爬虫导致的竞争压力
  2. 库存查询机器人造成的系统负载
  3. 账号暴力破解影响用户安全
  4. 虚假订单与刷单行为

AWS WAF Bot Control 作为 AWS 提供的托管式规则组,能有效识别和管理自动化工具访问。虽然目前已有多篇关于 PC 端集成的文章,但移动端的集成方案相对较少。本文将重点介绍如何在 iOS 和 Android 应用中实现 Bot Control 防护。

AWS WAF Bot Control 概述

AWS WAF Bot Control 是 AWS WAF 提供的一项托管式规则组服务,专门用于检测和管理自动化流量访问。它通过先进的机器学习算法、行为分析和设备指纹技术,能够精确识别和分类不同类型的机器人流量,包括已验证的良性机器人(如搜索引擎爬虫)、未验证的机器人和恶意自动化工具。该服务支持多种验证机制,包括令牌验证、JavaScript 挑战和 CAPTCHA 集成,并提供灵活的响应策略,如允许、阻止、计数和验证等。

在电商场景中,Bot Control 可以有效防止价格爬取、控制库存查询、阻止批量下单和防范账号盗用等自动化攻击,同时确保合法用户访问不受影响。通过与 CloudFront、Application Load Balancer 或 API Gateway 的无缝集成,Bot Control 能够为 Web 应用程序、移动应用和 API 提供全方位的防护。此外,该服务还提供详细的监控和报告功能,帮助用户实时了解防护效果并持续优化防护策略。

Amazon WAF Bot Control 配置方法和执行流程

整体架构:

您可以阅读这篇文档了解详细的工作流和执行原理与基本配置:Protect against bots with AWS WAF Challenge and CAPTCHA actions

Amazon WAF Bot Control 配置使用方法

1. 在 AWS WAF 控制台界面创建 Web ACLs 后,增加规则“Add rules”,选择“Add managed rule groups”,再选择“AWS managed rule groups(打开标红部分,并点击编辑页面)”。

2. 修改 Bot Control inspection level 为 Targeted ,并将默认版本修改为当前最新版本(默认版本是比较旧的版本,而新版本增加了很多规则和拦截功能),再开启机器学习功能(后续会出现模拟攻击的情况,需要学习正常的用户行为,来识别区分异常的访问)。

3. 配置 rule 的 matches 规则,可以增加多个。

如果 Statement 非常多(超过 5 个),可以切换到 JSON 模式,因为当前页面可视化模式只能支持 5 个。当切换到 JSON 模式编辑,Statement 数量超过 5 个,保存之后,无法用默认的可视化界面 Rule visual editor 模式打开,会出现错误,但不影响使用,只是警告无法用可视化模式打开,需要切换到 Rule JOSN editor 模式打开阅读/编辑。例子中包含了匹配“/index”的访问。

另外增加一个 Statement 2 ,实现对于 POST 方法的匹配,因为我们这次的侧重点是在于 iOS 和安卓 POST 接口访问。

4. 配置规则执行动作

SignalNonBrowserUserAgent

检查不是来自经过验证的机器人的请求,以查找似乎不是来自网络浏览器的用户代理字符串。此类别可以包括API请求。

规则操作:Block

标签:awswaf:managed:aws:bot-control:signal:non_browser_user_agentawswaf:managed:aws:bot-control:SignalNonBrowserUserAgent

对于经过验证的机器人,规则组与该规则不匹配,并且不应用任何信号或规则标签。

注意:移动应用程序通常具有非浏览器用户代理,SignalNonBrowserUserAgent 规则在默认情况下会阻止这些代理,所以需要配置成脚本挑战。

TGT_VolumetricIpTokenAbsent

检查不是来自经过验证的机器人的请求,这些请求在过去 5 分钟内来自单个客户端 5 个或更多且不包含有效挑战令牌。有关令牌的更多信息,请参阅在 Web 请求中使用令牌 AWS WAF

注意:如果来自同一客户端的请求最近缺少令牌,则此规则可能会与具有令牌的请求相匹配。

由于延迟,此规则适用的阈值可能略有不同。

此规则对缺失令牌的处理方式与令牌标签不同:awswaf:managed:token:absent。令牌标签会标记没有令牌的单个请求。此规则会为每个客户端 IP 保留缺少令牌的请求计数,并与超过限制的客户端进行匹配。

规则操作:Challenge

标签:awswaf:managed:aws:bot-control:targeted:aggregate:volumetric:ip:token_absentawswaf:managed:aws:bot-control:TGT_VolumetricIpTokenAbsent

Amazon WAF Bot Control 工作流程

没有集成 SDK 的工作流程:

集成了 SDK 的工作流程:

自定义规则(检测缺少令牌)

1. 在指定的 Web ACLs 的 Rules 列表增加 规则,选择“Add rules”,然后选择 “Add my own rules and rule groups”,再切换到 Rule JSON editor 模式,直接将以下内容覆盖到文本框中。

{
  "Name": "Block-Requests-With-Missing-Or-Rejected-Token-Label",
  "Priority": 1,
  "Statement": {
    "AndStatement": {
      "Statements": [
        {
          "OrStatement": {
            "Statements": [
              {
                "LabelMatchStatement": {
                  "Scope": "LABEL",
                  "Key": "awswaf:managed:token:absent"
                }
              },
              {
                "LabelMatchStatement": {
                  "Scope": "LABEL",
                  "Key": "awswaf:managed:token:rejected"
                }
              }
            ]
          }
        },
        {
          "NotStatement": {
            "Statement": {
              "ByteMatchStatement": {
                "SearchString": "POST",
                "FieldToMatch": {
                  "Method": {}
                },
                "TextTransformations": [
                  {
                    "Priority": 0,
                    "Type": "NONE"
                  }
                ],
                "PositionalConstraint": "EXACTLY"
              }
            }
          }
        }
      ]
    }
  },
  "Action": {
    "Block": {}
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "Block-Requests-With-Missing-Or-Rejected-Token-Label"
  }
}

如下图所示,保存出现警告提示正常,打开出现警告就是代表不能用可视化界面展示,需要切换到 Rule JSON editor 模式查看/编辑。

移动端集成

通常集成的客户端会包含 Android 和 iOS,为了让代码更通用,以下例子采用 Kotlin/Swift 编码。

注意事项

移动端的 SDK 集成需要提 case,需要两天左右才能申请下来,最终会以 URL 的形式交付,每一种客户端会有一个对应的 URL ,通过 URL 下载相应的 sdk,每一种会有多个版本,尽量下载最新的版本进行集成。

iOS 版本

获取到 token 之后,增加请求地址的参数: “aws-waf-token=$token”

以下是获取 token 的简单例子:

let url: URL = URL(string: "Web ACL integration URL")!
let configuration = WAFConfiguration(applicationIntegrationUrl: url, domainName: "Domain name")
let tokenProvider = WAFTokenProvider(configuration)
//onTokenReady can be add as an observer for UIApplication.willEnterForegroundNotification
self.tokenProvider.onTokenReady() { token, error in
        if let token = token {
        //token available
        }
        if let error = error {
        //error occurred after exhausting all retries
        }
}
//getToken()
let token = tokenProvider.getToken()

Android 版本

同样,获取到 token 之后,增加请求地址的参数: awsWafApi.awsWafPostWithHeader(“aws-waf-token=$token”)

import com.amazonaws.waf.mobilesdk.token.WAFConfiguration
import com.amazonaws.waf.mobilesdk.token.WAFTokenProvider
private lateinit var wafConfiguration: WAFConfiguration
private lateinit var wafTokenProvider: WAFTokenProvider
private val WAF_INTEGRATION_URL = "Web ACL integration URL"
private val WAF_DOMAIN_NAME = "Domain name"
fun initWaf() {
        // Initialize the tokenprovider instance
        val applicationIntegrationURL = URL(WAF_INTEGRATION_URL)
        wafConfiguration =
                WAFConfiguration.builder().applicationIntegrationURL(applicationIntegrationURL)
                        .domainName(WAF_DOMAIN_NAME).backgroundRefreshEnabled(true).build()
        wafTokenProvider = WAFTokenProvider(getApplication(), wafConfiguration)

                // getToken from tokenprovider object
                println("WAF: "+ wafTokenProvider.token.value)

                // implement callback for where token will be used
                wafTokenProvider.onTokenReady {
                        wafToken, sdkError ->
                run {
                        println("WAF Token:" + wafToken.value)
                }
        }
}

关于移动端集成 Amazon WAF,可以参考官方博客

注意事项

即使在客户端集成了 Amazon WAF Bot Control 的专用 SDK 获取 Token,但是如果攻击者采用相同的方式获取到 Token,然后手动将参数传递到脚本中,再执行自动化脚本攻击,同样可以完成请求。为了尽可能降低此项风险,可以参考参考材料中的:WAF 部署小指南(九)利用 Amazon WAF Bot Control 增强网站安全与搜索引擎优化(SEO)表现

总结

通过在移动应用中集成 AWS WAF Bot Control,我们成功构建了一套完整的自动化访问防护体系,在技术层面实现了精确的流量识别和高效的性能表现;在业务价值方面,显著降低了爬虫影响、系统负载和安全事件发生率,有效提升了平台的安全性和稳定性。实施过程中,我们总结出渐进式部署策略、定期密钥轮换、特殊时期规则调整等关键经验。展望未来,我们将持续优化系统,包括引入机器学习模型提升识别准确率、开发自定义规则引擎应对特定场景、优化 Token 管理机制提升可扩展性,并加强与其他安全服务的集成以构建纵深防御体系。此外,我们也将在业务层面建立更细粒度的访问控制策略,完善商业智能分析,探索新的应用场景,最终打造一个更安全、更高效的电商平台。

参考链接

Amazon AWF Bot Control 在 JS 端的集成与配置

WAF 部署小指南(九)利用 Amazon WAF Bot Control 增强网站安全与搜索引擎优化(SEO)表现

本篇作者

廖子洋

亚马逊云科技解决方案架构师,目前在智能家居行业担任解决方案架构师。在入职亚马逊云科技之前,专注于大数据领域,有 10 年开发和架构经验,针对数据湖和海量数据平台以及实时计算有丰富的实操经验。