You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置AWS S3:允许无预签名URL的GET,仅允许预签名URL的POST/PUT

可以仅通过S3策略配置实现需求,无需CloudFront

你完全可以通过调整S3桶策略结合现有配置达成目标,不需要依赖CloudFront。以下是具体的配置方案:

核心思路

  1. 保留现有配置中的PublicAccessBlockConfiguration和CorsConfiguration,确保基础安全与跨域规则生效
  2. 添加桶策略实现两个关键控制:
    • 允许指定来源的用户无需预签名即可执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 11:33:26