使用AWS WAF进行Captcha人机验证

一、背景

2021年的re-Invent大会发布了AWS WAF验证码功能即Captcha。Captcha是Completely Automated Public Turing test to tell Computers and Humans Apart(全自动区分计算机和人类的图灵测试)的首字母缩写,通常用于区分机器人和人类访客,以防止 Web 抓取、凭证填充和垃圾邮件等恶意活动。

本文编写时候AWS WAF Captcha已经在部分Region的区域级的WAF上推出,未来将在CloudFront以及更多Region获得支持。有关信息可以参考如下网址(中文):https://aws.amazon.com/cn/about-aws/whats-new/2021/11/aws-waf-captcha-support/?nc1=h_ls

WAF验证码的使用场景包括但不限于:

  • 用户/管理员的登录页等Landing Page
  • 被高频引用的界面,有被DDOS可能的页面
  • 有被Bot提交信息的风险的页面
  • 其他关键操作页面

WAF验证码的实现方式是在现有WAF规则处理中在Action行为可选择允许Allow、阻止Block和计数Count的基础上,增加了选项Captcha,即验证码规则。这就意味着当这条规则被触发时候,之前只能选择通过或者拒绝,现在可以选择跳转到验证码页面进行人机验证,认证通过则可以访问,认证失败则阻断访问。由于WAF验证码成为了Action选项的一部分,因此意味着验证码规则可单独使用也可组合其他规则使用。

本文描述配置一个直接防护场景,对管理员路径访问如 https://xxx.com/admin/ 进行验证码防护。

二、为特定规则开启验证码

本文假设已经有一个正在运行的WAF规则,接下来新增验证码防护。

1、设置自定义规则组(Rule Group)

进入到WAF & Shield界面下,点击左侧AWS WAF菜单中的Rule groups菜单,显示当前已经存在的规则组。点击页面上方中央切换Region的下拉框,默认显示为US East(N.Virginia),点击这个下拉框切换到已经支持WAF验证码的区域(CloudFront WAF和更多支持Region即将支持)。然后点击右上角的创建按钮。如下截图。

在创建规则组第一步,输入名称,确保区域正确,然后点击下一步继续。如下截图。

在创建向导第二步,点击Add按钮。如下截图。

Rule Builder界面,点击右上角的Rule visual editor,在Name名称位置输入希望使用的名称,在Type位置选中Regular rule。在页面下方请求条件If a request位置选择matches the statement。如下截图。

在配置规则的下方,选择Inspect类型是URI path,即对访问路径做检查。在Match type匹配类型位置,选择Contains string表示包含如下字符。在String to match位置输入要匹配的关键路径,例如输入/admin。在下方Text transformation位置选择None表示不变换。继续向下滚动页面。如下截图。

在页面上的Action位置选择类型是CAPTCHA,选中Set a custom immunity time for this rule选中这个选项,在Immunity time位置输入86400秒,表示认证通过的token有24小时有效。最后点击右下角Add rule位置。如下截图。

返回向导界面,在页面上的Rule清单下已经可以看到这条规则。在Capacity位置无需修改,保持默认的数字即可,点击右下角的Next按钮。如下截图。

在向导第三步设置优先级位置,保持默认,点击Next按钮继续。如下截图。

在创建向导最后一步,点击右下角的Create rule group完成创建。如下截图。

至此规则组创建完成。界面上显示绿色的表示创建完成。如下截图。

2、与现有的WEB ACL绑定

进入到WAF & Shield界面下,点击左侧AWS WAF菜单中的Web ACLs菜单。点击页面上方中央切换Region的下拉框,默认显示为US East(N.Virginia),点击这个下拉框切换到已经支持WAF验证码的区域。这将列出当前已经存在的ACL。点击当前的Web ACL的名字继续。如下截图。

进入Web ACL配置详情,点击第二个标签页Rules,点击右上角的Add rules按钮,选择下拉菜单Add my own rules and rule groups。如下截图。

进入添加规则界面,点击最右侧的Rule group按钮,在下方名称位置输入自定义名称,然后向下滚动屏幕。如下截图。

在页面下方的Rule group位置,选择本文前一步创建好的规则组的名字。然后点击右下角的Add rule按钮。最后一个选项Override rule group action - optional里边对应的Enable不要选中。如下截图。

在设置规则优先级界面,可根据需要调整策略执行的优先级。也可以保持默认。如下截图。

配置完成。现在Web ACL中已经可以看到。如下截图。

至此WAF规则配置完成。

三、访问测试

现在访问WAF防护的资源,在网址中包含/admin路径触发验证规则。点击Begin按钮即可开始人机验证。如下截图。可看到如下截图。

人机验证的几种形式包括拼图。如下截图。

路径解谜。如下截图。

听录音输入单词等。如下截图。

通过验证后,即可显示验证成功。如下截图。

随后页面会自动跳转到正常的网页访问。

至此WAF Captcha验证码配置完成。

四、参考文档

参考文档:

https://docs.aws.amazon.com/waf/latest/developerguide/waf-captcha.html