上次更新日期:2020 年 11 月 27 日
如何配置 AWS WAF 来保护我的资源,阻止常见的攻击?
解决方法 从 AWS WAF Classic 迁移到 AWS WAF(如果适用)如果您使用的是 AWS WAF Classic,建议您迁移到 AWS WAF。要进行此迁移,您可以利用自动迁移工具。有关更多信息,请参阅为什么迁移到 AWS WAF?
对应用程序运行渗透测试以识别漏洞每个应用程序都会收到自己的请求类型。因此,必须自定义保护应用程序的防火墙规则。
对应用程序运行渗透测试以了解其具体漏洞。有关更多信息,请参阅:
适用于渗透测试的 AWS 客户支持策略 AWS Marketplace 上的渗透测试提供商 审核传入请求以优化自定义规则在创建自定义规则以保护应用程序之前,请审核环境中的传入请求。
首先,使用以下工具生成日志:
AWS WAF Amazon CloudFront Application Load Balancer Amazon API Gateway然后,将这些日志存储在 Amazon Simple Storage Service (Amazon S3) 上。最后,使用 Amazon Athena 查询日志并识别模式。例如,你可能会看到如下模式:
针对不存在的 URI 向您的环境发出的请求 要识别这种模式,您必须知道每种受支持的 URI 对 AWS WAF 日志执行的 Athena 查询示例,用于统计每个 URI 的请求:SELECT count("httprequest"."uri") as URIcount, "httprequest"."uri"
FROM waf_logs
GROUP BY "httprequest"."uri"
ORDER BY URIcount DESC
包含您的 Web 服务器不支持的 HTTP 主机标头的请求 -或者- 包含 IP 地址而非您的网站域名的请求
对 AWS WAF 日志执行的 Athena 查询示例,用于统计具有不同主机标头值的请求:
SELECT header.value as HostHeader, count(header) as count
FROM waf_logs, UNNEST(httprequest.headers) AS x(header)
WHERE "header"."name" = 'Host'
GROUP BY header
ORDER BY count DESC
识别模式后,您可以在 COUNT 模式下创建 AWS WAF 规则,以验证规则是否配置为匹配这些请求。然后,将规则移至 BLOCK 模式。
例如,如果您的应用程序仅支持主机标头“www.example.com”:
在主机标头上创建一个值为“www.example.com”的不匹配项 将操作设置为 BLOCK现在,对您的环境发出的任何不含主机标头“www.example.com”的请求都将被阻挡。
注意:此规则还会阻挡对 AWS 提供的完全限定域名 (FQDN) 发出的请求。
使用 AWS 托管规则防止适用于大多数应用程序的常见攻击,包括以下请求:
不包含用户-代理 代表自动程序请求 使用“localhost”作为 HTTP 主机标头 使用 PROPFIND HTTP 方法在 COUNT 模式下,将这些基准规则组包括在 Web 访问控制列表 (Web ACL) 中。请务必在规则组中选择 Enable Count mode(启用计数模式)。然后,查看 AWS WAF 日志和 CloudWatch 指标,以确定托管规则是否匹配任何合法流量。如果不匹配,请禁用 Enable Count mode(启用计数模式)以将规则组移动到 BLOCK。要禁用 AWS 托管规则组中的特定规则,请为该规则选择 Override rules action(覆盖规则操作)。
注意:对您的环境的合法请求可能会触发 AWS 托管规则中的规则。有关更多信息,请参阅如何检测 AWS 托管规则导致的误报并将它们添加到安全列表中?
重要提示:AWS 托管规则旨在保护您免受常见的 Web 威胁攻击。根据文档使用时,AWS 托管规则组可为您的应用程序增加另一层安全保护。但是,AWS 托管规则组不能代替您的安全责任,安全责任由您选择的 AWS 资源决定。请参阅责任共担模型,以确保 AWS 中的资源得到正确的保护。
使用合法请求的速率建立 AWS WAF 的基准对您的流量进行分析,以在 AWS WAF 日志上确定合法客户端 IP 地址使用 Amazon Athena 或 Amazon Quicksight 发出的请求数量。使用从此分析中获得的信息,根据合法客户端发出的请求速率建立 AWS WAF 的基准。然后,在配置 AWS WAF 基于速率的规则时设置阈值。
对 AWS WAF 日志执行的示例 Athena 查询,用于计算给定时间范围(2020 年 11 月 16 日上午 9 点至上午 10 点)之间来自单个 IP 地址 (x.x.x.x) 的请求数量:
SELECT "httprequest"."clientip", "count"(*) "count", "httprequest"."country"
FROM waf_logs
WHERE httprequest.clientip LIKE 'x.x.x.x' and date_format(from_unixtime("timestamp"/1000), '%Y-%m-%d %h:%i:%s') between '2020-11-16 09:00:00' and '2020-11-16 10:00:00'
GROUP BY "httprequest"."clientip", "httprequest"."country"
对 AWS WAF 日志执行的示例 Athena 查询,用于计算相同时间范围之间来自所有 IP 地址的请求数量:
SELECT"httprequest"."clientip", "count"(*) "count", "httprequest"."country"
FROM waf_logs
WHERE date_format(from_unixtime("timestamp"/1000), '%Y-%m-%d %h:%i:%s') between '2020-11-16 09:00:00' and '2020-11-16 10:00:00'
GROUP BY "httprequest"."clientip", "httprequest"."country"
ORDER BY "count" DESC
使用 AWS WAF Security Automations 模板防范常见攻击
使用 AWS WAF Security Automations模板提供针对常见攻击的额外防护。例如,您可以启用针对以下内容的保护:
扫描程序和探测器 恶意自动程序 恶意 IP 地址注意:此解决方案使用产生收费的其他 AWS 服务。
防止 SQL 注入和跨站点脚本为了保护应用程序免受 SQL 注入和跨站点脚本 (XSS) 攻击,请使用内置的 SQL 注入和跨站点脚本引擎。请记住,攻击可以在 HTTP 请求的不同部分执行,例如 HTTP 标头、查询字符串或 URI。配置 AWS WAF 规则以根据内置缓解引擎检查 HTTP 请求的不同部分。
注意:对您的环境的合法请求可能会触发缓解引擎中的规则。有关更多信息,请参阅如何检测 AWS 托管规则导致的误报并将它们添加到安全列表中?
限制来自 CloudFront 的访问(如果您在 CloudFront 上使用 AWS WAF) 根据 CloudFront IP 地址限制访问权限。 在 CloudFront 中为源请求添加自定义标头。在源上,只有当自定义标头和值存在时才允许访问。如果源是 Application Load Balancer 或 API 网关,则在源上使用 AWS WAF 允许包含自定义标头和值的请求。 防范 DDoS 攻击有关防范分布式拒绝服务 (DDoS) 攻击的更多信息,请参阅实现 DDoS 弹性的 AWS 最佳实践和AWS Shield 功能。</p