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

相关推荐
A小辣椒13 天前
AWS Clould Support Engineer就职面试题
aws
亚林瓜子16 天前
AWS WAF中如何放行某个触发了托管规则的接口
aws·waf
悠悠1213818 天前
AWS DevOps Agent 体验一周后,我决定把 oncall 手机调成静音了
云计算·aws·devops
yyuuuzz18 天前
独立站运营的几个技术层面常见问题
大数据·运维·服务器·网络·数据库·aws
yyuuuzz18 天前
游戏云服务器推荐的技术选择思路
大数据·运维·服务器·游戏·云计算·aws
kernelcraft19 天前
Boto3:Python 操作 AWS 的官方 SDK
开发语言·python·其他·aws
普通网友1 个月前
Serverless 框架:多云函数部署(AWS + 阿里云 + 腾讯云)
阿里云·serverless·aws
TG_yunshuguoji1 个月前
亚马逊云代理商:如何用 CloudWatch+Lambda 打造自动化告警系统
大数据·运维·自动化·云计算·aws
yyuuuzz1 个月前
独立站搭建的几个核心技术问题
运维·服务器·网络·数据库·aws
yyuuuzz1 个月前
aws亚马逊云服务的基础认知与常见场景
大数据·运维·服务器·网络·云计算·aws