使用基于速率的 AWS WAF 规则保护网站和服务
1. 背景介绍
AWS WAF ,全称是Web Application Firewall ,即Web 应用程序防火墙,可以帮助用户保护Web 应用程序免受常见的Web漏洞攻击。通常这些攻击会损害Web应用的安全性,影响可用性,消耗过多的资源,增加成本,还降低响应速度和用户体验。
WAF可以让用户创建定制规则进行流量筛选,阻隔恶意访问,保障正常请求。比如,可以根据 IP 地址、HTTP 标头、HTTP 正文或 URI 字符串来筛选 Web 请求,这样便能阻止诸如 SQL 注入或跨站点脚本等常见攻击模式。
和其它诸多 AWS 服务一样,WAF 的所有功能也可以通过AWS管理控制台或API进行配置。这便利了用户团队的不同角色,不论是开发人员、DevOps工程师还是安全审查专家都可以方便使用,从开发到部署的全过程系统地管理Web应用的安全。
WAF 和AWS的Web相关服务紧密结合,目前支持CloudFront和Application Load Balancer。AWS WAF 让您能够创建集中化的规则集合,而后部署到多个网站上。用户通常有多个网站和 Web 应用程序,使用WAF可以只定义一组规则并复用于多个应用程序上。WAF也是AWS全托管的服务,用户无需担心其扩展和可用性。只需在正确的资源上启用WAF,无需部署任何额外软件即可完成部署。并且只需要部署一次,即可以全球的边缘节点全部生效。
作为防火墙,WAF当然也少不了监控和报警。WAF 可以让用户设置条件来监视哪些请求。提供准实时地 Web 流量监测报告,并以此信息来创建新的规则或使用 Amazon CloudWatch 的进行报警。
今天,我们以WAF实现防盗图这个常见应用场景,帮助大家快速上手,体验其强大和便捷。
2. 部署与配置WAF
现在主流的Web应用都使用了无cookie域名来加速静态内容,我们这里也进行类似的部署,如网站域名是 example.com,图片服务使用另一个域名 example_img.com。禁止盗图的效果可以从下表来概述。
调用图片的域名 | 响应效果 |
*.example.com | 200 OK |
其它非法域名 | 403 Forbidden |
WAF目前支持CloudFront和Application Load Balancer,我们这个例子中防盗图要保护的是图片服务器,这里我们所使用的就是CloudFront提供的CDN。我们用一个现成的CloudFront分发来作演示,使用AWS 的DNS服务Route 53 配置了域名 imgtest.simg.cf。为了演示效果,我们还使用EC2配合搭建了一个简单的Web服务器,也使用Route 53 配置了域名allow.snowpeak.cf。有关EC2、ClourFront和Route 53的使用这里不再赘述,请参见各自相关文档。
现在已有了具体的2个域名,我们要实现前述的禁止盗图效果,把规则具体化为以下控制流程:
- Referer请求头包含“://allow.snowpeak.cf/”(不写具体的协议更简单,可以同时支持HTTP和HTTPS请求)则允许访问。
- 其它情况下禁止访问。
登录AWS WAF管理控制台
https://console.aws.amazon.com/waf/home
在左侧导航菜单中点击AWS WAF > Web ACLs,来到Web ACLs页,点击Create Web ACL按钮会前进到Set up a web access control list (web ACL)向导。
如果前进到Concepts overview页,直接点击右下角Next按钮,前进到Step 1: Name web ACL页。
2.1 创建 Web ACL
1. Web ACL name 输入ImgAntiHotLink。
2. CloudWatch metric name 会自动填上ImgAntiHotLink。
3. Region保持默认的Global (CloudFront)不变。
4. AWS resource to associate 点击下拉,选择我们已有的CloudFront分发。
5. 点击Next按钮。
2.2 创建字符串匹配条件
在Step 2: Create conditions页,下拉到页面最底部,找到String match conditions,点击其右边的Create condition 按钮创建字符串匹配条件。
在弹出的Create string match condition层中:
1. Name栏填写referer_domain。
2. Region保持默认的Global (CloudFront)不变。
3. Filter settings 部分,Part of the request to filter on 在菜单中选择Header,在随后出现的 Header 栏选择Referer。
4. Match type选Contains。Transformation选Convert to lowercase。
5. Value to match填写://allow.snowpeak.cf/。
6. 点击 Add filter按钮,最后点击右下角Create按钮完成创建。
创建完成后弹层关闭,回到Step 2: Create conditions页,点击右下角Next按钮。
2.3 创建规则
在Step 3: Create rules页,Add rules to a web ACL 下点击右边的Create Rule按钮,在弹出层Create Rule 里如下填写:
1. 在 Name 中填写AntiHotlink,CloudWatch metric name 会自动填写上相同的值。
2. Region保持默认的Global (CloudFront)不变即可。
3. 在 Add Conditions 下,When a request 下的3个菜单依次选择
- does
- match at least one of the filters in the string match condition
- referer_domain
4. 点击“Add condition”,最后点击右下角 Create 按钮,完成创建。
创建完成后,弹层关闭,回到Step 3: Create rules页。
把 AntiHotLink 这条规则的Action 选 Allow。
Default action 选Allow all requests that don’t match any rules
点击右下角的Review and create 按钮。
最后来到Step 4: Review and create页,点击右下角Confirm and create 按钮完成创建。
3.4 查看配置结果
这时我们可以到 AWS WAF 下各个分项去看一下配置的结果,看看上述向导帮我们在Web ACLs、Rules、和 String matching下分别建立了记录并且做了关联。
在左侧导航菜单中点击AWS WAF > Web ACLs,来到Web ACLs页。如果你从其它区分region 的服务管理页来到AWS WAF页,可能出发现这里没有记录,提示“You don’t have any web ACLs in XXX region. Choose Create web ACL to get started.”,不用惊慌,是因为上面的Filter菜单默认选中了你常用的region。我们刚刚创建的WAF是不区分region的,所以在这里点选“Global (Cloudfront)”,然后我们创建的记录就可以显示出来了。
再依次点击AWS WAF > Rules和Conditions > String matching,查看到各有一条记录。
前述的向导已经帮我们创建了这些具体的分项,一方面方便我们可以逐个分别调整,另一方面,也方便我把把条件和规则复用到不同的站点上。
WAF 配置完毕后立刻生效,不用像 CloudFront 分发那样还需要等待一段时间。这一点在发生Web攻击时用于及时应对是很有意义的。
3. 效果验证
我们做一个简单的 HTML 页面,里面引用我们的图片文件,然后把它部署到我们在EC2上的Web站点上。当我们使用正常的域名访问时,比如https://allow.snowpeak.cf/imgtest.htm,图片都可以正常加载出来。下图是带 Firebug请求详情的截图。
我们再使用EC2原始的域名来访问,http://ec2-xxxx.compute.amazonaws.com 就可以模拟非法域名引用我们的图片。可以看到图片都没有显示出来。下图是带 Firebug请求详情的截图。
4. 监控
WAF提供方便的常用监控,在WAF管理页面就可以查看,还可集成到CloudWatch,使用更丰富的指标和图表。在左侧导航菜单中点击AWS WAF > Web ACLs,来到Web ACLs页,在这里点击咱们已创建的这条记录ImgAntiHotLink,页面右侧就会显示出监控详情。这个请求的数据归集有几分钟延迟,新建的ACL稍等一会可以看到结果。
首先是请求次数的图表。
右下方是请求的详情。
这里点击“View the graph in CloudWatch”,还可以跳转到CloudWatch 去看更多详细的日志和图表。
更为强大的是,可以结合CloudWatch Alarm创建报警,比如当拦截的非法请求数高于一定阈值时通知我们,方便我们再人工干预。操作方法和其它Alarm一样,具体可参考Alarm的相关文档,这里不再赘述。
5. 小结
今天我们只是通过一条规则实现了一个常见场景的配置。实际的防盗图还要考虑到更多因素,比如允许移动端App访问,允许特定搜索引擎访问图片以便收录。我们可以灵活使用String matching和Rule,配置出各种丰富的规则和效果,满足各种访问控制的需求。
在Web应用开发领域,防盗图是只个常见的小需求,在自建数据中心如果要实现防盗图,需要在所有CDN节点上逐个配置,开发和运维都很繁琐。在AWS上我们使用WAF可以非常方便的进行配置,还能享受其天然的高可用。对于各种Web攻击的防御,WAF更是得心应手的工具,为我们Web应用保驾护航。
AWS WAF (Web 应用程序防火墙) 可帮助您的应用程序防御涉及恶意或错误格式请求的很多种应用程序层攻击。我在介绍此服务的第一篇文章 (New – AWS WAF) 中讲过,您可以定义与跨站点脚本、IP 地址、SQL 注入、大小或内容限制匹配的规则:
当传入请求符合规则时,将调用操作。操作可以是允许、阻止或只是对匹配项计数。现有规则模型非常强大,让您能够检测许多不同类型的攻击并予以响应。但是,对于只是包含大量来自某特定 IP 地址的有效请求的攻击,该规则模型无法作出响应。这些请求可能是 Web 层的 DDoS 攻击、暴力登录尝试,甚至是合作伙伴集成出错。
基于速率的新规则
现在我们将在 WAF 中增加基于速率的规则,这样您就能控制何时对黑名单添加或删除 IP 地址,并可以灵活处理异常和特殊情形:
将 IP 地址加入黑名单 – 您可以将发出请求的、速率超出所配置的速率阈值的 IP 地址加入黑名单。
IP 地址跟踪 – 您可以看到哪些 IP 地址当前被加入了黑名单。
删除 IP 地址 – 已加入黑名单的 IP 地址如果不再以高出所配置阈值的速率发出请求,则将自动从黑名单中删除。
IP 地址免审核 – 您可以在基于速率的规则中使用 IP 地址白名单免于将特定 IP 地址加入黑名单。例如,您可能希望允许可信赖的合作伙伴以较高的速率访问您的站点。
监控和报警 – 您可以通过针对每条规则发布的 CloudWatch 指标进行监控和发出警报。您可以结合基于速率的新规则和 WAF 条件实施精细的速率限制策略。例如,您可以使用基于速率的规则和与您的登录页面匹配的 WAF 条件。这样,您可以对登录页面设置较为严格的阈值 (以避免暴力密码攻击),而对于市场推广或系统状态页面设置较为宽松的阈值。阈值按照 5 分钟内来自单个 IP 地址的传入请求数定义。一旦超出此阈值,来自该 IP 地址的额外请求就会被阻止,直至请求速率降至阈值之下。
使用基于速率的规则 下面演示如何定义基于速率的规则来保护您网站的 /login 部分。首先在网页 URI 中定义一个与期望的字符串匹配的 WAF 条件:
然后,使用此条件来定义基于速率的规则 (该速率限制以 5 分钟时间段内的请求数表示,但一旦突破此限制,黑名单机制立即启动):
在定义好条件和规则之后,创建一个 Web ACL (ProtectLoginACL) 将这些都整合起来并与 AWS 资源 (在本例中为 CloudFront 分配) 关联:
然后将规则 (ProtectLogin) 与该 Web ACL 连接:
现在,将根据该规则和 Web ACL 保护该资源。您可以监控相关联的 CloudWatch 指标 (在本例中为 ProtectLogin 和 ProtectLoginACL)。您甚至可以创建 CloudWatch 警报,并使用这些警报在突破保护阈值时触发 Lambda 函数。此代码可以检查违反规则的 IP 地址,并作出业务驱动的复杂决策,比如添加一条白名单规则,对可信赖的合作伙伴或具有特殊付款计划的用户提供格外宽松的政策。
现已推出 基于速率的新规则现已提供,您可以立即开始使用!基于速率的规则与常规的规则同样定价;请参阅 WAF 定价页面了解更多信息。