Cloudwatch Logs监控

在本章中,我们将学习如何为 WAF 启用 CloudWatch Logs,通过 CloudWatch Logs Insights 轻松访问 AWS WAF 日志。一旦我们识别并分类了访问我们应用程序的流量,我们就可以采取行动来控制谁以及什么可以访问它。

先完成第一章前两节的内容,创建一个WAF ACL

在 CloudWatch Logs 上启用 AWS WAF 日志记录

导航到 AWS WAF 服务控制台,确保在 AWS WAF 控制台的区域下拉列表中选择了"Global"区域:

进入创建好的ACL,在我们的 Web ACL 配置页面上,导航到 Logging and metrics 选项卡。 image-20240623191349515

单击 Enable, 选择 CloudWatch Logs log group,然后单击 create new 按钮。

image-20240623191439793

这将打开一个新标签页,我们可以在 CloudWatch Logs 中创建一个新的日志组。

将其命名为 aws-waf-logs-Bot-Workshop,并选择 3 天 作为保留策略。

要与 AWS WAF 一起使用的Log group必须以 aws-waf-logs 前缀开头。

单击 Create 并关闭浏览器标签页。

image-20240623191641736

返回 WAF 控制台,单击 刷新 按钮。在 Amazon CloudWatch Logs log group 下拉菜单中,我们现在可以选择 aws-waf-logs-Bot-Workshop,因此我们的页面应该如下所示:

image-20240623191738464

单击 Save

发送测试流量

执行以下脚本请求我们的URL,将第三行根据实际CloudFront URL进行替换:

#!/bin/bash

URL="https://d33zkcemxgrpo3.cloudfront.net/"  # 根据实际cloudfront地址进行替换
NORMAL_REQUESTS=50
SQLI_REQUESTS=25
XSS_REQUESTS=25

# Normal user request function
send_normal_request() {
  curl -s -o /dev/null -w "%{http_code}\n" "$URL"
}

# SQL Injection request function
send_sqli_request() {
  local sqli_payloads=(
    "' OR 1=1 --"
    "' OR 'a'='a"
    "' OR 1=1#"
    "' OR '1'='1"
    "admin'--"
  )
  for payload in "${sqli_payloads[@]}"; do
    curl -s -o /dev/null -w "%{http_code}\n" "${URL}?param=$payload"
  done
}

# XSS request function
send_xss_request() {
  local xss_payloads=(
    "<script>alert('XSS')</script>"
    "<img src='x' onerror='alert(1)'>"
    "<svg onload=alert(1)>"
    "';alert(String.fromCharCode(88,83,83))//"
    "\"><script>alert('XSS')</script>"
  )
  for payload in "${xss_payloads[@]}"; do
    curl -s -o /dev/null -w "%{http_code}\n" "${URL}?param=$payload"
  done
}

# Sending normal user requests
for ((i=1; i<=NORMAL_REQUESTS; i++)); do
  send_normal_request
  echo "Normal request $i sent"
done

# Sending SQL Injection requests
for ((i=1; i<=SQLI_REQUESTS; i++)); do
  send_sqli_request
  echo "SQL Injection request $i sent"
done

# Sending XSS requests
for ((i=1; i<=XSS_REQUESTS; i++)); do
  send_xss_request
  echo "XSS request $i sent"
done

echo "Requests completed."

后面的xss及SQL注入流量我们都看到已经显示403:

image-20240623194028090

使用 CloudWatch Logs Insights 调查网络流量

CloudWatch Logs 通过 Logs Insights 提供了一种易于使用的查询和探索语言。

在 AWS WAF 控制台的 Web ACL 上导航到 CloudWatch Logs Insights 选项卡。Insights 选项卡预先填充了几个查询:

image-20240623192434282

单击 Run query 按钮运行默认查询:

image-20240623192553680

查看返回的请求。我们可以展开每个请求并查看完整的请求详细信息。 image-20240623193506874

CloudWatch Logs Insights 是一个强大的查询工具。要了解更多关于其语法的信息,请参阅文档

请求命中 AWS WAF 可能需要 1-2 分钟才能显示在我们的日志中。如果我们没有看到我们期望的请求,请继续刷新或重新运行查询。

尝试以下查询,查看 AWS WAF 采取 BLOCK 操作的请求:

fields @timestamp,@message
| sort @timestamp desc
| limit 20
| filter action="BLOCK"

image-20240623194159990

尝试以下查询,查看每个 URI 的请求以及 AWS WAF 采取的操作:

fields @timestamp, httpRequest.uri, action
| sort @timestamp desc
| limit 20

image-20240623194237775

运行此查询,查看哪些 HTTP 方法被阻止:

fields action
| stats count(*) by httpRequest.httpMethod
| sort requestCount desc
| limit 1000
| filter action="BLOCK"

image-20240623200619576

看单个 IP 创建了多少请求, 运行以下查询:

fields httpRequest.clientIp
| stats count(*) as requestCount by httpRequest.clientIp
| sort requestCount desc
| limit 5000

image-20240623200342471

知道 IP 产生了多少流量后,我们就可以安全地创建基于速率的规则。


我们已成功设置了 Web ACL 的日志记录,并使用 CloudWatch Logs Insights 运行了查询,现在我们准备开始分析和缓解不需要的流量。

还有很多需要学习的关于有效使用 CloudWatch Logs Insights 查询来探索 AWS WAF 日志的知识。请收藏这篇博客 以获取更多示例。