如何防止AWS S3预签名上传URL遭恶意用户滥用?
设置用户级上传配额
给每个认证用户设定周期内的上传总量或文件数量限制,比如每天5GB、每月20GB,或者每天最多传10个文件。生成预签名URL之前先校验用户当前周期的已使用量,超过限制就拒绝生成请求。可以用数据库记录用户的上传统计数据,也能结合AWS CloudWatch指标加Lambda函数来统计用户上传的S3对象大小和数量。API请求频率限制
在API网关层面配置速率限制,比如每个用户每分钟最多调用生成预签名URL的接口10次,防止短时间内刷大量请求。如果用AWS API Gateway,直接开启「使用计划」和「API密钥」功能,给每个用户分配专属的配额和速率限制;要是自定义API服务,用Redis做令牌桶限流也能实现。精细化限制预签名URL
- 生成URL时设置短过期时间,比如15分钟,避免被长期复用;
- 限制URL的操作权限,只允许PUT指定路径的对象,还能通过
Content-Length参数限定上传文件的大小范围,比如只允许1MB到100MB的文件,防止传超大文件占空间; - 示例代码(Python):
import boto3 s3 = boto3.client('s3') presigned_url = s3.generate_presigned_url( 'put_object', Params={'Bucket': '你的存储桶名', 'Key': 'user-uploads/{用户ID}/{文件名}', 'ContentLength': 1048576}, ExpiresIn=900 # 15分钟过期 )
上传后校验与清理
用户传完文件后,用Lambda触发S3的PutObject事件,校验文件类型(比如检查文件头是不是MP3、FLAC这类音乐格式),不符合就直接删掉,还能给用户记违规次数。另外定期清理长期没人访问的文件或者垃圾内容,减少存储空间浪费。异常行为检测与封禁
监控用户的上传行为,比如短时间内频繁上传、传大量相同内容的文件、文件大小异常离谱等,触发告警后自动限制该用户的上传权限。可以用AWS Athena分析S3访问日志,或者自己搭日志分析工具来识别异常用户。强化账号注册验证
提升账号注册的门槛,比如要求邮箱验证、手机号短信验证,增加恶意注册的成本。给新注册用户设初始低配额,比如前7天每天只能传1GB,后续根据用户的正常行为再逐步提升配额。
内容的提问来源于stack exchange,提问作者Maxime Dupré

