跳至内容

如何配置 AWS WAF 以保护我的资源免受常见攻击?

4 分钟阅读
0

我想在我的资源上使用 AWS WAF 来防御常见攻击。

简短描述

要在您的资源上使用 AWS WAF 以防御常见攻击,请执行以下一项或多项操作:

  • 从 AWS WAF Classic 迁移到 AWS WAF。
  • 将您的资源关联到 AWS WAF 中的 Web 访问控制列表 (Web ACL)。
  • 查看传入请求以优化规则。
  • 使用 AWS 托管规则来帮助防御常见攻击。
  • 根据合法请求的速率为 AWS WAF 建立基准。
  • 使用 Security Automations for AWS WAF 来防御常见攻击。
  • 使用 SQL 注入和跨站脚本 (XSS) 攻击规则语句。
  • 限制来自 Amazon CloudFront 的访问。
  • 防御分布式阻断服务 (DDoS) 攻击。

解决方法

**注意:**如果在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

从 AWS WAF Classic 迁移到 AWS WAF

如果您使用的是 AWS WAF Classic,则最佳做法是迁移到 AWS WAF。有关详细信息,请参阅为什么要迁移到 AWS WAF?

将您的资源关联到 Web ACL

首先,在 AWS WAF 中创建 Web ACL。然后,将您的资源关联到该 Web ACL,以允许 AWS WAF 监控传入的请求。如果您无法将资源直接与 AWS WAF 集成,请查看以下替代方案。有关详细信息,请参阅可使用 AWS WAF 保护的资源

可与 AWS WAF 集成的资源

对于可与 AWS WAF 集成的资源,请使用以下选项之一来集成资源:

无法与 AWS WAF 集成的资源

对于无法直接与 AWS WAF 集成的资源,请使用以下选项之一来集成资源:

查看传入请求以优化规则

要保护您的资源,请使用应用程序日志(例如应用程序负载均衡器或 CloudFront 访问日志)来确定常见的请求模式。

**注意:**最佳做法是使用 AWS WAF 日志来存储、查询和分析 HTTP 请求日志。

在确定常见请求模式后,请将日志存储到 Amazon Simple Storage Service (Amazon S3) 或 Amazon CloudWatch。要查询日志并识别模式,请使用 Amazon AthenaCloudWatch Logs Insights

最后,在 Count(计数)模式下创建一条 AWS WAF 规则以验证传入的请求,然后将该规则设置为 Block(阻止):

  1. 针对 example.com 的主机标头创建 NOT 规则语句
    **注意:**请将 example.com 替换为您的主机标头。
  2. Action(操作)设置为 Block(阻止)。AWS WAF 会阻止不包含您指定的主机标头的请求。

**注意:**此规则还会阻止对 AWS 提供的完全限定域名 (FQDN) 的请求。

以下示例是您可能会遇到的常见请求模式。

针对不存在的 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

以下是针对 AWS WAF 日志的 CloudWatch 查询示例,用于统计每个 URI 的请求数:

fields httpRequest.uri
| stats count(*) as requestCount by httpRequest.uri
| sort requestCount 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

以下是针对 AWS WAF 日志的 CloudWatch 查询示例,用于统计包含不同主机标头值的请求数:

fields @timestamp, @message
| parse @message '{"name":"Host","value":"*"}' as host
| stats count(*) as requestCount by host
| sort requestCount desc

使用 AWS 托管规则来帮助防御常见攻击

要使用 AWS 托管规则,请确定要防御的常见请求模式和攻击类型。然后,添加相关的 AWS 托管规则组。要防御特殊任务的攻击,您可以使用以下需额外付费的规则组:

计数模式下将相关规则组添加到您的 Web ACL 中。然后,查看 AWS WAF 日志和 CloudWatch 指标,以确定托管规则是否与合法流量匹配。如果规则与合法流量不匹配,请关闭规则组的 Enable Count mode(启用计数模式)以阻止流量。要关闭 AWS 托管规则组中的特定规则,请针对该规则选择 Override rules action(覆盖规则操作)。

**注意:**向您的环境发出的合法请求可能会启动 AWS 托管规则。有关详细信息,请参阅如何为 AWS WAF 自定义 AWS 托管规则的行为

根据合法请求的速率为 AWS WAF 建立基准

要防御流量型攻击,请分析您的流量,以确定合法客户端 IP 地址发出的请求数。要分析流量,请对 AWS WAF 日志使用 CloudWatch Logs InsightsAthena queriesAmazon QuickSight。使用分析所得信息为 AWS WAF 建立基准。然后,配置基于速率的规则语句来设置请求阈值。

以下是针对 AWS WAF 日志的 Athena 查询示例,用于统计特定时间范围内来自单个 IP 地址的请求数:

SELECT  "httprequest"."clientip", "count"(*) "count", "httprequest"."country"
  FROM waf_logs
 WHERE httprequest.clientip LIKE '10.0.0.0' 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"

**注意:**请将 10.0.0.0 替换为您的 IP 地址,并将 2020-11-16 09:00:002020-11-16 10:00:00 替换为您的时间范围。

以下是针对 AWS WAF 日志的 CloudWatch Insights 查询示例,用于统计来自单个 IP 地址的请求数:

fields httpRequest.clientIp, httpRequest.country
| stats count(*) as requestCount by httpRequest.clientIp, httpRequest.country
| filter httpRequest.clientIp = "10.0.0.0"

**注意:**请将 10.0.0.0 替换为您的 IP 地址。

以下是针对 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

**注意:**请将 2020-11-16 09:00:002020-11-16 10:00:00 替换为您的时间范围。

以下是针对 AWS WAF 日志的 CloudWatch Insights 查询示例,用于统计特定时间范围内来自 IP 地址的请求数:

fields httpRequest.clientIp, httpRequest.country
| stats count(*) as requestCount by httpRequest.clientIp, httpRequest.country
| sort requestCount desc

使用 Security Automations for AWS WAF 来防御常见攻击

要提供针对常见攻击的额外防护,您可以使用 Security Automations for AWS WAF

**注意:**此解决方案使用的其他 AWS 服务可能会产生费用

使用 SQL 注入和 XSS 攻击规则语句

要保护您的应用程序免受 SQL 注入和 XSS 攻击,请使用针对 SQL 注入XSS 的内置攻击规则语句。攻击可能发生在 HTTP 请求的不同部分,例如 HTTP 标头、查询字符串或 URI。配置您的 AWS WAF 规则,以根据攻击规则语句检查 HTTP 请求的不同部分。

**注意:**向您的环境发出的合法请求可能会启动攻击规则语句。有关详细信息,请参阅如何检测由 AWS 托管规则引起的误报?

限制来自 CloudFront 的访问

您可以根据 CloudFront IP 地址限制访问。然后,在 CloudFront 中为源请求添加自定义标头。在源上,仅当存在自定义标头和值时允许访问。如果源是应用程序负载均衡器或 API Gateway,请在源上使用 AWS WAF。此操作允许包含自定义标头和值的请求。

防御 DDoS 攻击

要防御 DDoS 攻击,请参阅 DDoS 防御的 AWS 最佳实践AWS Shield 功能

相关信息

责任共担模型

管理 AWS WAF 中的误报

AWS 官方已更新 10 个月前