在本章中,我们将学习如何为 WAF 启用 CloudWatch Logs,通过 CloudWatch Logs Insights
轻松访问 AWS WAF 日志。一旦我们识别并分类了访问我们应用程序的流量,我们就可以采取行动来控制谁以及什么可以访问它。
先完成第一章前两节的内容,创建一个WAF ACL
导航到 AWS WAF 服务控制台,确保在 AWS WAF 控制台的区域下拉列表中选择了"Global"区域:
进入创建好的ACL,在我们的 Web ACL 配置页面上,导航到 Logging and metrics 选项卡。
单击 Enable, 选择 CloudWatch Logs log group,然后单击 create new 按钮。
这将打开一个新标签页,我们可以在 CloudWatch Logs 中创建一个新的日志组。
将其命名为 aws-waf-logs-Bot-Workshop,并选择 3 天 作为保留策略。
要与 AWS WAF 一起使用的Log group必须以 aws-waf-logs 前缀开头。
单击 Create 并关闭浏览器标签页。
返回 WAF 控制台,单击 刷新 按钮。在 Amazon CloudWatch Logs log group 下拉菜单中,我们现在可以选择 aws-waf-logs-Bot-Workshop,因此我们的页面应该如下所示:
单击 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:
CloudWatch Logs 通过 Logs Insights 提供了一种易于使用的查询和探索语言。
在 AWS WAF 控制台的 Web ACL 上导航到 CloudWatch Logs Insights 选项卡。Insights 选项卡预先填充了几个查询:
单击 Run query 按钮运行默认查询:
查看返回的请求。我们可以展开每个请求并查看完整的请求详细信息。
CloudWatch Logs Insights 是一个强大的查询工具。要了解更多关于其语法的信息,请参阅文档 。
请求命中 AWS WAF 可能需要 1-2 分钟才能显示在我们的日志中。如果我们没有看到我们期望的请求,请继续刷新或重新运行查询。
尝试以下查询,查看 AWS WAF 采取 BLOCK 操作的请求:
fields @timestamp,@message
| sort @timestamp desc
| limit 20
| filter action="BLOCK"
尝试以下查询,查看每个 URI 的请求以及 AWS WAF 采取的操作:
fields @timestamp, httpRequest.uri, action
| sort @timestamp desc
| limit 20
运行此查询,查看哪些 HTTP 方法被阻止:
fields action
| stats count(*) by httpRequest.httpMethod
| sort requestCount desc
| limit 1000
| filter action="BLOCK"
看单个 IP 创建了多少请求, 运行以下查询:
fields httpRequest.clientIp
| stats count(*) as requestCount by httpRequest.clientIp
| sort requestCount desc
| limit 5000
知道 IP 产生了多少流量后,我们就可以安全地创建基于速率的规则。
我们已成功设置了 Web ACL 的日志记录,并使用 CloudWatch Logs Insights 运行了查询,现在我们准备开始分析和缓解不需要的流量。
还有很多需要学习的关于有效使用 CloudWatch Logs Insights 查询来探索 AWS WAF 日志的知识。请收藏这篇博客 以获取更多示例。