亚马逊AWS官方博客
亚马逊云科技 WAF 为创新成长企业保驾护航
什么是 Amazon WAF?
现如今随着越来越多的企业迁移上云,如何将应用程序安全的托管在云端成了大家更加关注的方向。网站的运维人员常常会查看 web 服务器的访问日志或是错误日志对服务器的访问流量进行分析,除了来自正常客户端的流量以外,可能还会观察到异常的流量和访问行为。一旦这些异常访问成功,攻击者可以通过各种方式,例如通过已知的漏洞(跨站脚本或是通过 SQL 注入),入侵服务器。Amazon WAF 则可以帮助用户,通过配置相关的 HTTP,HTTPS 策略来阻止或监控 web 请求,从而保护 web 应用程序免受攻击。
WAF 会将转发的请求依据您自定义的规则进行检查,对于符合规则的请求,WAF 会根据您定义的操作,要求底层服务阻止或允许相应的请求。web 应用程序主要面对三种攻击,DDoS 攻击,web 应用程序攻击,和恶意爬虫。Amazon WAF 根据规则设置,可以保护网站免受 SQL 注入和跨站脚本(XSS)这类常见的攻击的入侵。除此之外,您也可以通过基于速率的规则来缓解 web 层的 DDoS 攻击、暴力登陆尝试和恶意爬虫/采集器/机器人等。
本文将根据不同的用户场景对 Amazon WAF 的使用进行分析,并提供详细的 WAF 规则介绍以及相关的配置指导,让您在不同场景下快速的了解适合于自己的 web 应用程序防火墙策略。
Amazon WAF 如何在不同的垂直行业中应用?
WAF 的不同功能和特性可以适配不同的 web 应用场景,提高拦截的效率。金融类场景下,高频量化交易对时延有很高的敏感性,WAF 通过与 CloudFront 结合,不再需要重新做 SSL 解密,有效的降低了时延的影响。与此同时,WAF 可以通过配置基于速率的规则提供足够的限频能力。在面对 DDoS 攻击时,Amazon Shield 会自动缓解网络层和传输层(三四层)的 DDoS 攻击,您可以选择手动设置 WAF ACL 缓解七层的 DDoS 攻击。在上线 WAF 规则后,相应的 web 应用调优,拦截行为分析,判断误报等可以进一步提升 WAF 的拦截效率,减少误报。传统的日志分析方式主要通过 Athena 或 CloudWatch 的 Log Insights 查询相应的日志信息,而目前越来越多的用户选择集成 Log Hub 日志通解决方案,通过无代码日志处理,以及开箱即用的仪表盘模版帮助您更有效的实现 WAF 访问日志的查询和可视化,给您提供高度定制化的 WAF SIEM。
除了金融类场景以外,电商以及游戏行业对于 WAF 的需求也在随着业务的发展而增长。对于电商类的用户而言,防爬是 WAF 应用的其中一个重要场景,恶意的机器人程序可能会在某个时间段大量请求某个域名的特定地址或接口,除了数据的泄漏以外,还可能造成资源的过度浪费,或通过扫描端口漏洞,甚至导致服务器停机。WAF 的 bot control 策略则可以帮助您,通过简单的配置阻止或限制普遍存在的机器人程序(如抓取程序、扫描程序和爬网程序)的速率,也可以允许常见的机器人程序(例如状态监视器和搜索引擎),同时 WAF 与 CloudFront 结合能够提供给用户更高容量的防爬方案。而对于游戏类的场景,WAF 满足游戏发布时的峰值需求,并且结合 CloudFront 安全有效的提升了动态加速性能。WAF 作为多个亚马逊云科技合规性计划的一部分,符合 HIPAA,PCI,SOC 等安全性和合规性要求,在安全合规方面更好的支撑了您的业务。
Amazon WAF 有哪些核心组件?
Amazon WAF 的核心组件主要包含了 Web ACL,规则和规则组。您可以创建 Web ACL 并通过添加规则来定义其保护策略。由于攻击媒介种类繁多,仅拥有一种防御类型是不够的。WAF 具有多层安全控制,可以从不同的维度检测到攻击并根据相应的规则缓解。AWS Shield Standard 给所有账号免费针对三四层的 DDoS 攻击提供防御功能,根据亚马逊云科技良好架构的建议,Route53 和 CloudFront 在架构中的应用可以得益于 Shield Standard 在基础设施上对边缘服务的保护,因为所有的检测和针对攻击的缓解措施都是内联的,应对攻击也会更快。
除了 Shield Standard 在基础设施层面提供的三四层 DDoS 防护以外,基于 IP 的控制可以通过创建 Web ACL 引用对应的 IP 集进行黑白名单控制,同时也可以对 IP 设置基于速率的访问控制。亚马逊云科技提供了 IP 信誉列表托管组,您可以通过托管规则组阻止被判定具有攻击行为的 IP,例如恶意爬虫,DDoS 攻击等。基于规则的控制也给用户提供了多种配置选择,亚马逊云科技 WAF 托管的规则组可以帮助您针对常见的应用程序漏洞或其他有害流量提供保护,无需自己编写规则。针对特殊场景需求,您也可以灵活选择自定义或三方规则。机器人控制规则使用 HTTP 内容检查和基于行为的控制来检测机器人,其中包含了 WAF ATP(欺诈控制账户接管预防),可以对账户盗用的意图进行监管和控制。
Amazon WAF 如何与亚马逊云科技其他服务进行集成?
我们建议您在进行 WAF 的部署之前,根据 web 应用的具体场景选择将 WAF 与相对应的服务集成。WAF 可以与 CloudFront,API Gateway,以及 Application Load Balancer(ALB)集成。从安全的最佳实践角度,在没有特殊需求的场景下,对于大部分公开访问的 web 应用,我们建议您首先将 WAF 与 CloudFront 集成。CloudFront 可以应用于动态和静态内容的加速,并且默认阻止非 HTTPS 流量,以及非正常的 HTTP 请求,CloudFront 大容量的全球边缘节点在您遇到攻击时可以分散吸收流量,缓解攻击带来的影响。Shield Standard 可以自动帮助您缓解三四层的 DDoS 攻击,对于七层的安全防护,您可以选择部署多层 WAF 模型,同时在 ALB 集成 WAF。例如,在单个域的 CloudFront 进行多应用部署多场景下,可以选择在 CloudFront 应用基于 IP 的 WAF 规则,同时在 ALB 集成针对单个应用程序的 WAF 规则。
Amazon WAF 规则配置和防护场景建议
创建 Amazon WAF Web ACL
使用 Amazon WAF 对 Web 资源进行保护的第一步是创建 Web ACL。进入 Amazon WAF 控制台,点击 Create web ACL 开始进行创建。
Amazon WAF 控制台
第一步:将 Web ACL 与亚马逊云科技资源进行关联
为 Web ACL 命名后,在 Resource type 中选择该 Web ACL 对何种 Web 资源进行关联并保护。
创建 Web ACL
如上文介绍,可以与 WAF 关联的 Web 资源有两类:
- CloudFront 分配:Amazon CloudFront 分配属于全局资源,在 Resource type 中勾选 CloudFront Distribution 后,点击 Add resources,选择需要关联的 CloudFront 分配。
- Application Load Balancer(ALB)、API Gateway 等属于区域性资源,需要先在 Region 下拉框中指定 Web 资源所在的区域,再点击 Add resources 关联对应类型的资源。
第二步:添加规则和规则组
在创建 Web ACL 时可以添加 WAF 规则与规则组,本例中将先点击 next 跳过此步骤,稍后按不同场景添加规则。
第三步:设置规则优先级
通过对 Web ACL 中的规则和规则组设置优先级,以及规则组内部的规则设置优先级,可调整 Amazon WAF 对规则的评估顺序。本例中将先点击 next 跳过此步骤,稍后在添加规则后对顺序进行调整。
第四步:配置 CloudWatch 指标与请求采样
本例中由于尚未添加 WAF 规则,故在 CloudWatch 中暂无指标显示。使用 CloudWatch 可对整个 Web ACL 或其中特定的规则、规则组设置指标,监控 WAF 拦截情况。本文将在“”部分对 CloudWatch 指标配置进行介绍。
此外,在下方的 Request sampling options 中勾选 Enable sampled requests 将请求采样打开,以便在 WAF Overview 中初步观察 WAF 规则匹配请求的情况。
第五步:完成 Web ACL 创建
确认 Web 资源关联正确后,点击 Create web ACL,完成创建。
场景一:对 API 进行速率限制
进入刚刚创建好的 Web ACL,在 Rules 标签中点击 Add my own r ules and rule groups,对网站中的特定 API 添加速率限制规则。
在 Rule builder 中,首先为该规则命名,例如 api-rate-limit,Type 选择 Rate-based rule,即基于速率的规则。该规则将对每个客户端访问的源 IP 进行限速。
在 Request rate details 中,设置 Rate limit,即限定每个源 IP 在 5 分钟内的请求次数,该阈值从 100 次/5 分钟至 20000000 次/5 分钟不等,实际上,Amazon WAF 将每 30 秒检查前 5 分钟的请求总数。
IP address to user for rate limiting 表示使用何种方式获取源 IP。默认情况下,Amazon WAF 使用 Web 请求的来源 IP 进行统计和检查,如果请求经过代理,您也可以配置 WAF 检查如 X-Forward-For 标头中的一个 IP 地址作为源 IP。此处一般采用默认配置即可。
Criteria to count request towards rate limit 表示是否按照条件对请求进行限速。默认选择 Consider all requests,即进行全局限速。在实际中,推荐您根据业务需要对不同的 API 或路径分别设置合理的请求速率,在本例中我们选择 Only consider requests that match the criteria in a rule statement,去嵌套规则语句对特定 API 进行限速。
规则语句的书写按照 IF…Then… 的方式构建。在本例中,我们期望对网站的 API 进行限速,其 uri 为 /api,那么在 Statement 中,需要构造 WAF 对请求检查的条件,即 WAF 需要检查(Inpect)请求的内容为 URI,匹配类型(Match type)选择 Contains string,需要匹配的 URI 字符串(String to match)为 /api,Action 保持默认的 Block 动作。这表示如果某源 IP 对 /api 路径的访问频率超过阈值,WAF 则将阻止该源 IP 后续对/api 路径的请求直到其请求速率低于阈值,达到限速目的。
点击 Add rule,添加 API 速率限制规则至 Web ACL。测试规则可以发现,当某源 IP 对/api 路径的请求频次超过阈值后,api-rate-limit 规则对后续请求进行了阻止,该结果可通过 WAF 控制台上的 CloudWatch 指标绘图和请求采样进行初步观察。
场景二:使用 IP 黑白名单
Amazon WAF 提供了 IP 集功能,可以在规则中引用一个或多个 IP 集对 Web 资源的访问进行 IP 黑白名单控制。
创建 IP 集作为 IP 黑白名单
进入 WAF 控制台左侧导航栏的 IP sets 页面,点击 Create IP set 按钮开始创建 IP 集。注意 IP set 所在区域需要和您的 Web ACL 所保护的资源区域一致。
为 IP 集命名,本例中我们首先创建 IP 白名单集,在 IP set name 中键入 IP-whitelist,IP 类型可选择 IPv4 或 IPv6,在 IP address 输入框中 IP 白名单地址,以 IP CIDR 方式进行添加,如需添加多个 IP 地址或 IP 地址范围换行即可。点击 Create IP set 按钮完成 IP 白名单集创建。
IP 黑名单集的创建过程与上述类似,在此不再赘述。
在 WAF 规则中使用 IP 黑白名单
创建 IP 集后,我们将创建 WAF 规则引用 IP 集,以检查请求的 IP 地址是否与 IP 集中的地址相匹配,从而达到对请求进行 IP 黑白名单控制的效果。
在 Web ACL 中的 Rules 标签中,点击 Add my own rules and rule groups,创建新的规则。
以 IP 白名单规则为例,在构造规则语句时,我们需要检查(Inspect)请求的内容为其源 IP(originated from an IP address in),判断该 IP 是否来自 IP 白名单集中,在 IP set 下拉列表中选择对应的 IP 白名单集。在 Action 处选择 Allow,这意味着如果请求的 IP 来自于 IP 白名单列表(即请求命中了白名单规则),WAF 将允许该请求转发至后端实例,并且将不再评估 Web ACL 中后续的其他规则。
IP 黑名单规则的书写如下,与白名单类似,对于如果发起请求的 IP 属于 IP 黑名单集,WAF 将阻止该请求,并返回 403 响应。
其他建议
调整 Web ACL 中的规则/规则组优先级
如上部署 API 速率限制规则和 IP 黑白名单规则后,在保存规则时,可调整 Web ACL 中规则/规则组的优先级。建议将 IP 白名单、黑名单规则的优先级调至最上方,随后是全局速率限制规则、以及对各个 API 的速率限制规则,这样可以确保源 IP 来自 IP 白名单的请求最先被白名单规则处理并允许通过。
启用新规则前使用 Count 模式进行观察
在 Web ACL 中启用新规则前,不管是自定义规则抑或是托管规则组,建议将规则/规则组的动作改为 Count 计数模式。在 Count 模式下,WAF 将对命中规则的请求进行计数但并不做允许/阻止的动作,请求被计数后,WAF 会继续评估 Web ACL 中后续的其他规则。
自定义规则在 Action 处使用 Count:
托管规则组在 Override all rule actions 处覆盖规则动作为 Count:
使用 Count 模式的意义在于,通过对命中规则的请求计数,我们可以从日志中分析新启用的规则是否对请求造成了误杀而不影响正常业务访问。例如为了保护 Web 应用我们新启用了 Amazon WAF 托管规则组的核心规则集并如上修改使用 Count 模式,对于以下请求,我们发现其命中了核心规则集中的 UserAgent_BadBots_HEADER 规则,通过查看请求详情,发现该请求的 User-agent 确实存在异常。在日志中,我们可以继续对被该规则的其他请求(即具有标签 awswaf:managed:aws:core-rule-set:BadBots_Header)进行分析,进一步查看是否存在误杀,最终决定是否启用该规则。
开启 WAF 日志
在创建完 Web ACL 后,建议您开启 WAF 日志用于日后的安全运维工作和审计需要,如上述使用 Count 模式排出误杀,就需要结合 WAF 日志的分析。日志的开启位于 Logging and metrics 标签中,点击 Enable 可选择 3 个 WAF 日志存放的目的地,分别为 CloudWatch Logs、Kinesis Data Firehose、S3 存储桶,并使用不同的工具进行分析。有关 WAF 日志的分析,可进一步参考亚马逊云科技 WAF 部署小指南系列文章。
Amazon WAF 监控
将 Web ACL 阻止/允许的请求可视化有助于规则的优化,排查误报以及对攻击的准确响应。WAF 有多种监控手段可以帮助您从不同维度和不同的信息颗粒度对 Web ACL 的规则进行分析。除了上面提到的 log 的方式对 WAF 的访问日志进行细节的分析以外,您也可以选择配置 CloudWatch 控制面板来显示 Web ACL 中不同规则的活动情况。CloudWatch 会针对每一条规则生成近乎实时的度量值,例如 AllowedRequests,BlockedRequests 和 PassedRequests。下图为 CloudWatch 控制面板可以提供给您的自定义展示界面,通过在 CloudWatch Metrics 中自定义选择相关 Web ACL 的度量值,从不同的时间维度,Web ACL 中不同的规则组呈现相应的度量值的监控数据。
创建 WAF CloudWatch Dashboard
要通过 CloudWatch 生成定制化的 dashboard,首先您可以访问 CloudWatch https://console.aws.amazon.com/cloudwatch/,点击左边一栏的“All metrics”并选择 WAFV2 指标。
选择 LabelName,LabelNamepace 维度,label 匹配应用于 Web 请求规则的标签,LabelNamespace 指定匹配规则的 Web ACL 或规则组的命名空间前缀。选择需要的度量指标,在 CloudWatch 界面定义统计方式,统计周期,显示的历史时间段等信息,点击右上角添加到控制面板。
您可以选择创建新的 dashboard 或在已有 dashboard 中添加图表,并且自定义图表名称。
创建 Amazon CloudWatch 告警
你可以创建 Amazon CloudWatch 警报,用于在警报改变状态时发送 Amazon SNS 消息。警报会监控某个指标在一定时间段(由您指定)的变化情况,并根据相对于指定阈值的指标值每隔若干个时间段执行一项或多项操作。访问 CloudWatch 界面,选择左边“All alarms”,创建 alarm,并选择所需的 metrics。
设定相应的告警条件,并在告警方式中选择添加相应的 SNS topic。如果 threshold type 选择 anomaly detection,请注意在 metrics 中启用 anomaly detection 功能,具体应用 anomaly detection 告警功能的配置,请参考:根据异常检测创建 CloudWatch 告警 – Amazon CloudWatch。
总结
本文介绍了 Amazon WAF 的基本概念及其在不同垂直行业中的应用。随着越来越多的企业迁移上云,如何保障应用程序的安全成为人们更加关注的方向。在使用 WAF 时,还需要重视 WAF 日志和监控的收集和分析工作,及时发现并解决问题。总之,合理、稳定地使用 WAF,本文还提供了集成 Log Hub 日志通解决方案的方式,以帮助用户更有效地实现 WAF 访问日志的查询和可视化,提高 WAF 的拦截效率,减少误报,从而有效防止 Web 应用遭受各种攻击,提高系统的安全性和可靠性。