一、背景
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即将支持)。然后点击右上角的创建按钮。如下截图。
![](https://blogimg.bitipcman.com/workshop/WAFcaptcha/WAFcaptcha-01.png)
在创建规则组第一步,输入名称,确保区域正确,然后点击下一步继续。如下截图。
![](https://blogimg.bitipcman.com/workshop/WAFcaptcha/WAFcaptcha-02.png)
在创建向导第二步,点击Add
按钮。如下截图。
![](https://blogimg.bitipcman.com/workshop/WAFcaptcha/WAFcaptcha-03.png)
在Rule Builder
界面,点击右上角的Rule visual editor
,在Name
名称位置输入希望使用的名称,在Type
位置选中Regular rule
。在页面下方请求条件If a request
位置选择matches the statement
。如下截图。
![](https://blogimg.bitipcman.com/workshop/WAFcaptcha/WAFcaptcha-04.png)
在配置规则的下方,选择Inspect
类型是URI path
,即对访问路径做检查。在Match type
匹配类型位置,选择Contains string
表示包含如下字符。在String to match
位置输入要匹配的关键路径,例如输入/admin
。在下方Text transformation
位置选择None
表示不变换。继续向下滚动页面。如下截图。
![](https://blogimg.bitipcman.com/workshop/WAFcaptcha/WAFcaptcha-05.png)
在页面上的Action
位置选择类型是CAPTCHA
,选中Set a custom immunity time for this rule
选中这个选项,在Immunity time
位置输入86400
秒,表示认证通过的token有24小时有效。最后点击右下角Add rule
位置。如下截图。
![](https://blogimg.bitipcman.com/workshop/WAFcaptcha/WAFcaptcha-06.png)
返回向导界面,在页面上的Rule
清单下已经可以看到这条规则。在Capacity
位置无需修改,保持默认的数字即可,点击右下角的Next
按钮。如下截图。
![](https://blogimg.bitipcman.com/workshop/WAFcaptcha/WAFcaptcha-07.png)
在向导第三步设置优先级位置,保持默认,点击Next
按钮继续。如下截图。
![](https://blogimg.bitipcman.com/workshop/WAFcaptcha/WAFcaptcha-08.png)
在创建向导最后一步,点击右下角的Create rule group
完成创建。如下截图。
![](https://blogimg.bitipcman.com/workshop/WAFcaptcha/WAFcaptcha-09.png)
至此规则组创建完成。界面上显示绿色的表示创建完成。如下截图。
![](https://blogimg.bitipcman.com/workshop/WAFcaptcha/WAFcaptcha-10.png)
2、与现有的WEB ACL绑定
进入到WAF & Shield
界面下,点击左侧AWS WAF
菜单中的Web ACLs
菜单。点击页面上方中央切换Region的下拉框,默认显示为US East(N.Virginia)
,点击这个下拉框切换到已经支持WAF验证码的区域。这将列出当前已经存在的ACL。点击当前的Web ACL的名字继续。如下截图。
![](https://blogimg.bitipcman.com/workshop/WAFcaptcha/WAFcaptcha-11.png)
进入Web ACL配置详情,点击第二个标签页Rules
,点击右上角的Add rules
按钮,选择下拉菜单Add my own rules and rule groups
。如下截图。
![](https://blogimg.bitipcman.com/workshop/WAFcaptcha/WAFcaptcha-12.png)
进入添加规则界面,点击最右侧的Rule group
按钮,在下方名称位置输入自定义名称,然后向下滚动屏幕。如下截图。
![](https://blogimg.bitipcman.com/workshop/WAFcaptcha/WAFcaptcha-13.png)
在页面下方的Rule group
位置,选择本文前一步创建好的规则组的名字。然后点击右下角的Add rule
按钮。最后一个选项Override rule group action - optional
里边对应的Enable
不要选中。如下截图。
![](https://blogimg.bitipcman.com/workshop/WAFcaptcha/WAFcaptcha-14.png)
在设置规则优先级界面,可根据需要调整策略执行的优先级。也可以保持默认。如下截图。
![](https://blogimg.bitipcman.com/workshop/WAFcaptcha/WAFcaptcha-15.png)
配置完成。现在Web ACL中已经可以看到。如下截图。
![](https://blogimg.bitipcman.com/workshop/WAFcaptcha/WAFcaptcha-16.png)
至此WAF规则配置完成。
三、访问测试
现在访问WAF防护的资源,在网址中包含/admin
路径触发验证规则。点击Begin
按钮即可开始人机验证。如下截图。可看到如下截图。
![](https://blogimg.bitipcman.com/workshop/WAFcaptcha/WAFcaptcha-17.png)
人机验证的几种形式包括拼图。如下截图。
![](https://blogimg.bitipcman.com/workshop/WAFcaptcha/WAFcaptcha-18.png)
路径解谜。如下截图。
![](https://blogimg.bitipcman.com/workshop/WAFcaptcha/WAFcaptcha-19.png)
听录音输入单词等。如下截图。
![](https://blogimg.bitipcman.com/workshop/WAFcaptcha/WAFcaptcha-20.png)
通过验证后,即可显示验证成功。如下截图。
![](https://blogimg.bitipcman.com/workshop/WAFcaptcha/WAFcaptcha-21.png)
随后页面会自动跳转到正常的网页访问。
至此WAF Captcha验证码配置完成。
四、参考文档
参考文档:
https://docs.aws.amazon.com/waf/latest/developerguide/waf-captcha.html