亚马逊AWS官方博客

AWS WAF – Web 应用程序防火墙初体验

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解决方案架构师,AWS的云计算方案架构的咨询和设计,同时致力于AWS云服务在国内和全球的应用和推广,在大规模并发应用架构、移动应用以及无服务器架构等方面有丰富的实践经验。在加入AWS之前曾长期从事互联网应用开发,先后在新浪、唯品会等公司担任架构师、技术总监等职位。对跨平台多终端的互联网应用架构和方案有深入的研究。