【Amazon 实验③】Amazon WAF功能增强之追踪 Amazon WAF RequestID,排查误杀原因

在这里插入图片描述

文章目录

  • 1. 方案介绍
  • 2. 架构图
  • 3. 操作演示

本实验将介绍如何利用 Amazon Lambda@Edge,在 Amazon CloudFront 自定义错误页面 上展示每个由 Amazon WAF 返回的“403 Forbidden”错误的 Request ID。通过这个唯一的 WAF Request ID,网站运维工程师能够快速查询相应的 WAF 日志,找到误杀的原因。随后,可以配置 Scope-down 来修复误杀问题。

1. 方案介绍

CloudFront 自定义错误页面是由 CloudFront(而不是 Client)发起的,它的 Request ID 与 Client 原始请求的 Request ID 相同。因此,我们使用 Lambda@Edge 捕获自定义错误页面的请求,从请求事件中读取 Request ID,插入到预先定义好的 HTML 代码中,直接将这个 HTML 作为 Response body 返回给 CloudFront。

2. 架构图

image-20231222142042533

3. 操作演示

  1. 为 HTTP 状态码 403 创建 CloudFront 自定义错误页面。

image-20231222142619230

image-20231222142643527

  • Client 看到的 403 错误页面的 Request ID 都应该是唯一的,所以需要设置“Error caching minimum TTL”为“0”,即不缓存。
  • 为了避免错误页面的 URI 受到 DDoS 攻击,产生不必要的 Lambda@Edge 费用,需要将这个 URI path 设置的尽量复杂。
  1. 为 CloudFront 自定义错误页面的 URI path 单独创建一个 Cache Behavior

image-20231222162254335

我们目的是只允许 CloudFront 向自定义错误页面发起的请求才能触发 Lambda@Edge,因此,需要为自定义错误页面的 URI path 单独创建一个 Cache behavior,单独关联 Lambda@Edge 函数。这个 Behavior 所配置的缓存策略必须是“Managed-CachingDisabled”。任何一个 Maximum TTL>0 的缓存策略都会使得 CloudFront 向自定义错误页面发起的请求无法触发 Viewer request Lambda@Edge 函数,而只能触发 Origin request Lambda@Edge 函数。

  1. 创建 Lambda@Edge 函数,并添加 CloudFront viewer request trigger。 复制以下 Python 代码,创建一个 Runtime 为 Python3.X,Architecture 为 X86_64 的 Lambda 函数。
CONTENT = '''
<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><title>WAF custom error page</title><link rel="stylesheet" href="/css/style.css"/></head><body><h1>403 Forbidden!</h1><p>Your request was blocked.</p><p>Request ID: <span id="requestId">{CF_RID}</span></p><button onclick="copyToClipboard()">Copy Request ID</button><div id="copyMessage"></div><script>function copyToClipboard() {var requestId = document.getElementById("requestId").innerText;var tempTextArea = document.createElement("textarea");tempTextArea.value = requestId;document.body.appendChild(tempTextArea);tempTextArea.select();document.execCommand("copy");document.body.removeChild(tempTextArea);document.getElementById("copyMessage").textContent = "Copied!";}</script></body>
</html>
'''def lambda_handler(event, context):record = event['Records'][0]['cf']request_id = record['config']['requestId']response = CONTENT.replace('{CF_RID}', request_id)return {'status': 403,'statusDescription': 'Forbidden','headers': {'content-type': [{'key': 'Content-Type','value': 'text/html'}]},'body': response}

为这个 Lambda 函数添加一个 Trigger。Resource 类型为“CloudFront”,Event type 类型为“viewer-request”,Path pattern 为 CloudFront 自定义错误页面的 URI path。

image-20231222170948527

  1. 创建 WAF WebACL 并关联 CloudFront distribution 最后,我们创建一个 WAF WebACL,配置一个 WAF 规则,匹配 URI path /waf-id 来产生 Block 的动作。

image-20231222171044537

  1. CloudFront 自定义错误页面展示 WAF Request ID 的效果 浏览器访问 https://d123.cloudfront.net/waf-id,触发了 WAF block 动作,成功显示如图 6 所示的自定义错误页面(截图中的几个 JS 脚本是 Chrome 浏览器的插件所产生的,与本次测试无关)。

image-20231222171429035

使用 Amazon CloudWatch Log Insight 查询 Request I`D

如果 WAF 日志保存在 CloudWatch log group,可以使用下面的 CloudWatch log insight 查询语句检索 Request ID:

fields @message, httpRequest.requestId as requestId
| filter requestId = "tMzyyrTJhk5XiBbowY2v-WY5m-PGluVYKggI6KIJhlTHBlqpDEGQOQ=="    # 替换成需要检索的Request ID.
| display @message

也可以使用 like 方法进行模糊查询:

fields @message, httpRequest.requestId as requestId
| filter requestId like "tMzyy"    # 替换成需要检索的 Request ID
| display @message

CloudWatch log insight- 检索结果的部分截图。点击左边的黑色三角形符号,即可展开完整的日志,可以查看WAF的action和规则。

image-20231222171536997

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/239110.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

swing快速入门(二十四)绘画板-可调色

注释很详细&#xff0c;直接上代码 上一篇 Look here~ 听我说完再继续看更容易理解&#xff1a; 如果说用之前的绘图方法写一个绘画板你会怎么做&#xff1f;重绘会让之前的内容消失呀&#xff0c;用各种数据结构记录每个像素点的位置或颜色&#xff1f;嘶&#xff0c;感觉很麻…

HFish蜜罐搭建及简单使用

一、HFish蜜罐 HFish是一款社区型免费蜜罐&#xff0c;侧重企业安全场景&#xff0c;从内网失陷检测、外网威胁感知、威胁情报生产三个场景出发&#xff0c;为用户提供可独立操作且实用的功能&#xff0c;通过安全、敏捷、可靠的中低交互蜜罐增加用户在失陷感知和威胁情报领域的…

<蓝桥杯软件赛>零基础备赛20周--第11周--贪心

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周。 在QQ群上答疑&#x…

Java网络编程---TCP

服务端 import java.io.DataInputStream; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket;public class Server2 {public static void main(String[] args) throws Exception{System.out.println("------------服务端启动---------…

MySQL中EXPLAIN关键字解释

什么是MySQL的索引 索引是帮助MySQL高效获取数据的数据结构 MySQL再存储数据之外&#xff0c;数据库系统中还维护者满足特定查找算法的数据结构&#xff0c;这些数据结构以某种引用表中的数据&#xff0c;这样我们就可以通过数据结构上实现的高级查找算法来快速…

josef约瑟 DB-1电压回路断相闭锁继电器100V 5A 嵌入式安装

DB-1电压回路断相闭锁继电器 1 用途 DB-1型闭锁继电器&#xff0c;是在电压回路发生断路而可能引起继电保护误动作时&#xff0c;用以闭锁继电器。 2 结构和工作原理 DB-1型断相闭锁继电器的原理线路图见图1。 图1 DB-1原理接线图 断相闭锁继电器线路由零序电压过滤器(三个容量…

ubuntu20.04下安装pcl_ubuntu安装pcl

pcl点云数据库&#xff0c;用来进行3D信息的获取与处理&#xff0c;和opencv相比较&#xff0c;opencv是用来处理二维信息&#xff0c;他是学术界与工业界针对点云最全的库&#xff0c;且网络上相关的资料很多。以下是pcl的安装步骤以及遇到的问题。 提前说明&#xff0c;本人…

Shell三剑客:awk(格式化输出)

一、格式符 %d 十进制有符号整数 %u 十进制无符号整数 %f 浮点数 %s 字符串 %c 单个字符 %p 指针的值 %e 指数形式的浮点数 %x %X 无符号以十六进制表示的整数 %o 无符号以八进制表示的整数 %g 自动选择合适的表示法 % % 显示%自身 # [.#] 第一个数…

10分钟创建AIGC应用,腾讯云推出高性能应用服务HAI

降低AIGC应用开发门槛&#xff0c;才能更快发现下一个AIGC现象级应用。 12月18日&#xff0c;腾讯云宣布推出高性能应用服务(Hyper Application Inventor&#xff0c;HAI)&#xff0c;用户无需复杂配置&#xff0c;最快10分钟即可创建自己的AI应用。 HAI能够提供即插即用的算…

Vue 的两种实现:VSCode 中配置 vue 模板快捷方式的过程

1、创建配置文件&#xff1a; 其一、打开 VSCode &#xff0c;CtrlShiftP, 打开搜索框&#xff1a; 其二、输入&#xff1a;user, 并点击进去 Snippets:Configure User Snippets 其三、输入 vue3js 并回车&#xff1a; 其四、打开项目&#xff0c;发现配置文件 vue3js.code-sn…

【Python】Ubuntu 设置默认Python

有时候安装了python3.10 &#xff0c;执行python确提示无效命令&#xff0c; 执行下面的命令&#xff0c;设置python3.10的优先级&#xff0c;10为优先级&#xff0c;数字越大优先级越高&#xff1a; sudo update-alternatives --install /usr/bin/python python /usr/bin/py…

代码随想录算法训练营第六十天| 84 柱状图中最大的矩形

目录 84 柱状图中最大的矩形 84 柱状图中最大的矩形 找每个柱子左右两边第一个小于该柱子的柱子&#xff0c;栈头到栈底的顺序应该从大到小 求解矩形面积需要分别得到该柱左边和右边高度小于本柱的柱子 class Solution { public:int largestRectangleArea(vector<int>&am…

export default

export default 是 ES6 模块系统中的语法 用于将一个值、变量、函数或类作为模块的默认导出 默认导出在一个模块中只能有一个&#xff0c;而且不需要使用花括号 { } 进行包裹 下面是 export default 的用法和一些示例&#xff1a; 1.导出一个值或变量作为默认导出 // modu…

在CentOS 7上使用普通用户`minio`安装和配置MinIO

当然&#xff0c;以下是在CentOS 7上使用普通用户minio安装和配置MinIO的完整步骤&#xff0c;包括设置密码、设置开机自启动&#xff0c;以及使用minio用户启动和关闭服务的过程&#xff1a; 创建MinIO用户: sudo useradd -m minio sudo passwd minio这将创建一个可以登录的用…

【Spark源码分析】Spark的RPC通信二-初稿

Spark的RPC通信二-初稿 Spark RPC的传输层 传输层主要还是借助netty框架进行实现。 TransportContext包含创建 TransportServer、TransportClientFactory 和使用 TransportChannelHandler 设置 Netty Channel 管道的上下文。TransportClient 提供两种通信协议&#xff1a;co…

蓝桥杯-每日刷题-024

一个星期有七天 一、问题要求 题目描述 为了学英语&#xff0c;小聪做了很多卡片。其中有七张卡片&#xff0c;一面是数字1、2、3、4、5、6、7&#xff0c;另一面分别是monday、tuesday、wednesday、thursday、friday、saturday、sunday.请你对任意的数字&#xff0c;输出相应…

Layui 下拉select多选实现

1. html <div id"mo_deptment"></div> 2.引用 <script src"~/layuiadmin/layui/xm-select.js"></script>3.设置全局变量存储控件 var mo_deptmentSelect; 4.layui.use 中初始化 4.1 列表数据 var mo_deptmentdata [ …

红队打靶练习:DIGITALWORLD.LOCAL: DEVELOPMENT

信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:69:c7:bf, IPv4: 192.168.12.128 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.12.1 00:50:56:c0:00:08 …

数字图像处理-空间域图像增强-爆肝18小时用通俗语言进行超详细的总结

目录 灰度变换 直方图&#xff08;Histogram&#xff09; 直方图均衡 直方图匹配&#xff08;规定化&#xff09; 空间滤波 低通滤波器 高通滤波器 ​​​​​​​ 本文章讲解数字图像处理空间域图像增强&#xff0c;大部分内容来源于课堂笔记中 灰度变换 图像增强&…

MyBatis的延迟加载(懒加载)

MyBatis 中的延迟加载是指在需要时才加载对象的某些属性或关联对象&#xff0c;而不是在初始查询时就加载所有数据。这对于性能优化和减少不必要的数据库查询非常有用。 1. 基于配置文件的延迟加载 在 MyBatis 的 XML 映射文件中&#xff0c;你可以使用 lazyLoadingEnabled 和…