【Amazon 实验②】Amazon WAF功能增强之使用Cloudfront、Lambda@Edge阻挡攻击

文章目录

  • 一、方案介绍
  • 二、架构图
  • 三、部署方案
    • [1. 进入Cloud9 编辑器,新打开一个teminal](#1. 进入Cloud9 编辑器,新打开一个teminal)
    • [2. 克隆代码](#2. 克隆代码)
    • [3. 解绑上一个实验中Cloudfront 分配绑定的防火墙](#3. 解绑上一个实验中Cloudfront 分配绑定的防火墙)
    • [4. 使用CDK部署方案](#4. 使用CDK部署方案)
    • [5. CDK部署完成](#5. CDK部署完成)
    • [6. 关联Lambda@Edge函数](#6. 关联Lambda@Edge函数)
  • 四、方案效果

一、方案介绍

  1. 采用 Lambda@Edge + DynamoDB 架构实现。

  2. Lambda@Edge,每次访问都会调用Lambda函数,判断是否符合设定的规则,是则进行计数,否则阻断访问。

  3. 客户端可能会访问任意一个 CloudFront 的 POP 点,所以需要在多个物理位置维护一份访问数据并且保证同步。这里利用了Amazon DynamoDB 的全局表,可以在毫秒级实现全球数据同步,保证Lambda@Edge的数据全局一致。

  4. DynamoDB维护两张全局表来作为数据存储,一张供 Lambda Edge 访问,存储必要的访问数据,一张存储被封禁的 IP 信息,更新WAF Rule 封禁违规IP。

二、架构图

三、部署方案

1. 进入Cloud9 编辑器,新打开一个teminal

2. 克隆代码

bash 复制代码
git clone https://github.com/awslabs/aws-cloudfront-extensions.git

3. 解绑上一个实验中Cloudfront 分配绑定的防火墙


4. 使用CDK部署方案

BASH 复制代码
cd ./aws-cloudfront-extensions/function/js/limit-request-rate/cdk/
npm install
cdk bootstrap
# cdk deploy --parameters cfDistId=<cloudfront 分配ID,类似:EP1GUKEQP43MF> --parameters rateLimit=10 --parameters urlRateLimit=5 --parameters urlList='/login,/info' RateLimitCfStack

cdk deploy --parameters cfDistId=EU7NDIEB0KPVH --parameters rateLimit=10 --parameters urlRateLimit=5 --parameters urlList='/login,/info' RateLimitCfStack

注意,需要更换cfDistId为你创建的cloudfront 分配Id

参数说明:

  • cfDistId: Cloudfront分配Id
  • rateLimit: 全局每分钟限速次数
  • urlList:需要单独设置限速规则的URL
  • urlRateLimit:URL的每分钟限速次数

5. CDK部署完成

6. 关联Lambda@Edge函数

  • 在lambda 控制台,找到对应的函数(名称:RateLimitCfStack-RateLimitLambdaEdge***),选择version:1,记录下ARN。

在cloudfront分配,打开行为标签,并编辑。 确认在最下方的function associate关联Lambda@Edge函数。

至此,配置完成。

四、方案效果

  1. 验证WAF的最小速率次数为10次/min。 请求语句:(注意:请在Cloud9中执行下面测试)
json 复制代码
export JUICESHOP_URL=<Your Juice Shop URL>
export JUICESHOP_URL=https://djbryp4jxosx1.cloudfront.net

for ((i=0; i<12; i++)); do echo $i; curl -I  "${JUICESHOP_URL}";sleep 1;done
  1. 达到规则后ip立即被阻断。 再次发送请求:
json 复制代码
curl -I  "${JUICESHOP_URL}"

请求结果

bash 复制代码
WSParticipantRole:~ $ curl -I  "${JUICESHOP_URL}"
HTTP/1.1 403 Forbidden
Server: CloudFront
Date: Fri, 22 Dec 2023 06:09:11 GMT
Content-Type: text/html
Content-Length: 919
Connection: keep-alive
X-Cache: Error from cloudfront
Via: 1.1 6306947fb6ab60dc617ca2e025941652.cloudfront.net (CloudFront)
X-Amz-Cf-Pop: IAD50-C2
X-Amz-Cf-Id: AJN-UrMIQ9_YYtKWnbeDmWPOakVyZKY9lWgon-MnVIYkWbqXQXMRLw==

状态码为403,请求是被WAF防火墙所屏蔽。status code为429时,是被Lambda@Edge所屏蔽,是即时的立即屏蔽。 后续经过waf ipset的更新周期,此IP会在waf的黑名单列表内保持4小时。

  1. 达到限制条件的Ip被放入黑名单,封禁4小时。 验证Ipset 内的ip列表。 请求发起机器ip:
bash 复制代码
WSParticipantRole:~ $ curl ipinfo.io
{
  "ip": "3.226.47.2",
  "hostname": "ec2-3-226-47-2.compute-1.amazonaws.com",
  "city": "Ashburn",
  "region": "Virginia",
  "country": "US",
  "loc": "39.0437,-77.4875",
  "org": "AS14618 Amazon.com, Inc.",
  "postal": "20147",
  "timezone": "America/New_York",
  "readme": "https://ipinfo.io/missingauth"
}
WSParticipantRole:~ $ 

WAF内黑名单Ipset: BlockIPSET_0

  1. 特殊URL的速率为5次/min。 由于前面实验步骤,请求机器ip已经被封禁,首先需要解除封禁。
  • 删除DynamoDB table: RateLimitCfStack-BlackIpList 里的ip记录。
  • 删除WAF ipset 里的记录。

请求命令:

bash 复制代码
export JUICESHOP_URL=<Your Juice Shop URL>
export JUICESHOP_URL=https://djbryp4jxosx1.cloudfront.net

for ((i=0; i<6; i++)); do echo $i; curl -I  "${JUICESHOP_URL}/login";sleep 1;done

返回结果:

可以看出,对关键URL的rate限制每分钟5次,也已经生效。

相关推荐
王道长服务器 | 亚马逊云5 天前
一个迁移案例:从传统 IDC 到 AWS 的真实对比
java·spring boot·git·云计算·github·dubbo·aws
世间小小鱼5 天前
【爬坑指南】亚马逊文件中心 AWS S3 预签名URL 前端直传
前端·云计算·aws
TG_yunshuguoji5 天前
亚马逊云代理商:AWS亚马逊云的独特优势与实用价值
服务器·云计算·aws
阿雄不会写代码5 天前
AWS strands agents 当智能体作为独立服务/容器部署时,它们无法共享进程内状态
云计算·aws
无责任此方_修行中5 天前
AWS IoT Core 成本优化实战:从 PoC 到生产的省钱之旅
后端·架构·aws
AWS官方合作商5 天前
涂鸦智能携手亚马逊云科技,以全球基础设施与生成式AI加速万物智联时代到来
人工智能·科技·aws·亚马逊云科技
TG_yunshuguoji5 天前
亚马逊云代理:亚马逊云怎么样进行大规模数据分析与处理?
数据挖掘·数据分析·云计算·aws
Clownseven6 天前
AWS EC2部署WordPress教程:从零到一搭建个人博客 (2025最新)
云计算·aws
Clownseven6 天前
阿里云OSS vs 腾讯云COS vs AWS S3:对象存储价格与性能深度对比
阿里云·腾讯云·aws
练习两年半的工程师7 天前
AWS TechFest 2025: 风险模型的转变、流程设计的转型、生成式 AI 从实验走向实施的三大关键要素、评估生成式 AI 用例的适配度
人工智能·科技·金融·aws