【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次,也已经生效。

相关推荐
zhojiew18 小时前
[INFRA] EMR集群中Hive和Spark集成Glue Data Catalog过程的深入分析
hive·hadoop·spark·aws·bigdata
亚马逊云开发者18 小时前
我用 Lambda Durable Functions 把五个 Lambda 缩成了一个,代码量砍半
aws
亚马逊云开发者21 小时前
异构 GPU 混合部署 Whisper,我用 HyperPod 一个集群搞定了
aws
亚马逊云开发者1 天前
模型搜完网页就"脑算"数字?用 Dynamic Filtering 让它老老实实写代码
aws
亚马逊云开发者2 天前
老板让我迁 Graviton,我用 AI 工具几分钟搞定了迁移评估
aws
亚马逊云开发者2 天前
用 Kiro CLI 做 Agent 后端,1000 行代码搞定飞书 AI 聊天机器人
aws
147API2 天前
从零开始上手 AWS:架构设计、成本优化与避坑指南
云计算·claude·aws
zhojiew2 天前
[INFRA] EMR集群安全配置传输中加密和Kerberos认证配置详解
安全·aws·emr·bigdata
zhojiew2 天前
[INFRA] EMR集群启用HA高可用架构和配置分析
aws·emr·bigdata
亚马逊云开发者2 天前
S3 桶名不用再抢了:Account Regional Namespaces 来了
aws