如何配置AWS S3:允许无预签名URL的GET,仅允许预签名URL的POST/PUT
可以仅通过S3策略配置实现需求,无需CloudFront
你完全可以通过调整S3桶策略结合现有配置达成目标,不需要依赖CloudFront。以下是具体的配置方案:
核心思路
- 保留现有配置中的
PublicAccessBlockConfiguration和CorsConfiguration,确保基础安全与跨域规则生效 - 添加桶策略实现两个关键控制:
- 允许指定来源的用户无需预签名即可执行
GET/HEAD操作(读取数据) - 仅允许携带有效签名的
PUT/POST请求(即只有预签名URL能执行写入)
- 允许指定来源的用户无需预签名即可执行
完整Serverless配置示例
在你的Serverless资源定义中,新增AWS::S3::BucketPolicy资源:
MyBucket: Type: AWS::S3::Bucket DeletionPolicy: Retain Properties: BucketName: my-bucket AccessControl: Private PublicAccessBlockConfiguration: BlockPublicAcls: true BlockPublicPolicy: true IgnorePublicAcls: true RestrictPublicBuckets: true CorsConfiguration: CorsRules: - AllowedHeaders: - '*' AllowedMethods: - HEAD - GET - PUT - POST AllowedOrigins: <你的允许跨域源列表> MyBucketPolicy: Type: AWS::S3::BucketPolicy Properties: Bucket: !Ref MyBucket PolicyDocument: Version: '2012-10-17' Statement: # 允许指定来源的GET/HEAD请求(无需预签名) - Effect: Allow Principal: '*' Action: - s3:GetObject - s3:HeadObject Resource: !Sub 'arn:aws:s3:::${MyBucket}/*' Condition: StringEquals: aws:Origin: <你的允许跨域源列表> # 匹配跨域请求来源,缩小权限范围 # 仅允许携带有效签名的PUT/POST请求(即预签名URL) - Effect: Allow Principal: '*' Action: - s3:PutObject - s3:PostObject Resource: !Sub 'arn:aws:s3:::${MyBucket}/*' Condition: # 预签名URL会自动携带x-amz-signature参数,以此判断请求合法性 Null: x-amz-signature: false # 可选:强制HTTPS传输,提升安全性 Bool: aws:SecureTransport: true # 兜底拒绝所有未通过预签名的PUT/POST请求 - Effect: Deny Principal: '*' Action: - s3:PutObject - s3:PostObject Resource: !Sub 'arn:aws:s3:::${MyBucket}/*' Condition: Null: x-amz-signature: true
关键说明
- 读取权限:第一个Allow语句开放读取权限,通过
Condition限制请求来源,避免全域公开;若无需限制来源,可移除Condition,但建议尽量缩小权限范围。 - 写入权限:第二个Allow语句仅放行携带签名的写入请求,第三个Deny语句兜底拦截无签名的写入操作,确保只有预签名URL能执行写入。
- CORS配置:你原有的CORS规则已覆盖所需的请求方法和源,无需修改,负责处理浏览器端的跨域验证逻辑。
内容的提问来源于stack exchange,提问作者Askish
相关产品推荐
相关产品推荐

