首页/系统与基础设施/存储速查/S3 预签名 URL 与临时授权
分布式与对象存储70 条

S3 预签名 URL 与临时授权

预签名链接把签名者的权限临时装进一条带过期时间的地址里,持有者无需凭证即可完成被限定的单个操作;权限不会超过签名身份,因此短有效期、一链一对象、按最小权限签发是三条使用准则。

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​​​‌​‌‌​​‌‌‌​‌‌​​‌​‌​​‌​‌‌‌‌​‌‌‌​​‌‌​​‌‌​​‌‌​​‌​‌‌​‌​‌‌‌​​​​​‌‌‌​​‌​​‌‌​​‌​‌​‌‌‌​​‌‌​‌‌​‌​​‌​‌‌​​‌‌‌​‌‌​‌‌‌​​‌‌​​‌​‌​‌‌​​‌​​​​‌​‌‌​‌​‌‌‌​‌​‌​‌‌‌​​‌​​‌‌​‌‌​​​​‌​‌‌​‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​‌‌​‌​‌‌‌​​​​​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​​​‌​‌‌‌​​‌​​‌‌‌‌​​‌​​‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌​​​​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

把权限装进链接

预签名链接是用签名密钥提前生成的一条带签名的访问地址:它在有效期内可以完成被限定的操作,而持有者无需拥有任何账号凭证。签名内容涵盖请求方法、对象键、过期时间与若干请求头,任一要素被改动签名即失效。因此它既是临时授权的载体,也是把上传下载能力安全交给浏览器的常见手段。

基本信息

适用平台兼容 S3 的对象存储
常用方向GET 下载、PUT 上传、分片上传的分片地址
过期控制签名时指定有效期,签名版本 4 有上限(以官方文档为准)
前提条件签名者自身必须具备对应操作权限

典型使用场景

  • 前端直传:浏览器拿到上传链接后直接写对象,绕开应用服务器带宽
  • 临时下载:给外部用户一条限时链接,无需为其创建账号
  • 大文件分片:为每个分片单独生成链接,支持并行与断点续传
  • 导出与对账:把批处理结果以限时链接交付给对端系统
  • 避免密钥外发:第三方只拿到一条链接,拿不到长期凭证

生成与验证

生成与验证
aws s3 presign s3://demo-bucket/report.csv --expires-in 3600   # 生成 1 小时有效的下载链接
aws s3 presign s3://demo-bucket/uploads/a.zip --expires-in 900  # 上传方向需相应写权限
# 生成后先在浏览器或命令行验证可下载,再交付给外部
time curl -I "<预签名链接>"     # 观察状态码与响应头,确认未被策略拦截

五类失效原因

现象可能原因排查方向
签名不匹配链接被改动或请求头与签名时的头不一致核对方法与请求头是否原样发送
已过期超出设定有效期确认过期时间与客户端时钟是否偏移
拒绝访问签名者没有该操作权限检查签名所用身份的授权范围
找不到对象键名编码或前缀写错核对键名与转义结果
方法不匹配用 GET 链接去执行 PUT方法必须与生成时一致

安全使用要点

  • 有效期尽量短,交付类链接按业务最短可用时长设置
  • 一条链接只对应一个对象与一个方法,不要复用成通用入口
  • 生成链接的账号按最小权限配置,链接能达到的权限不会超过它
  • 不要把链接写进日志、监控上报或公开页面,链接本身就是凭据
  • 对外交付优先使用一次性或限时可撤销的方式,并保留签发记录
预签名链接不是匿名公开:它是把某个身份的权限临时授予链接持有者,因此签名身份一旦被回收或权限变更,未过期链接也会立即失效。
有效期上限由签名版本决定,签名版本 4 的最长有效期为 7 天;超过上限的请求会被拒绝,需要更长时效时改用其他授权模型。

易错点

  • 用高权限账号生成链接,链接泄露等同于高权限凭证泄露
  • 有效期设为数天甚至数周,链接在聊天记录与工单系统里长期可用
  • 客户端额外附加请求头导致签名不匹配,却误判为服务端故障
  • 把生成的链接批量写入应用日志,事后无法评估泄露范围

数据来源与参考

  • Amazon S3 官方文档:使用预签名 URL 共享对象
  • Amazon S3 官方文档:签名版本 4 与有效期限制

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/storage/s3-presigned-url-temporary-auth.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​​​‌​‌‌​​‌‌‌​‌‌​​‌​‌​​‌​‌‌‌‌​‌‌‌​​‌‌​​‌‌​​‌‌​​‌​‌‌​‌​‌‌‌​​​​​‌‌‌​​‌​​‌‌​​‌​‌​‌‌‌​​‌‌​‌‌​‌​​‌​‌‌​​‌‌‌​‌‌​‌‌‌​​‌‌​​‌​‌​‌‌​​‌​​​​‌​‌‌​‌​‌‌‌​‌​‌​‌‌‌​​‌​​‌‌​‌‌​​​​‌​‌‌​‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​‌‌​‌​‌‌‌​​​​​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​​​‌​‌‌‌​​‌​​‌‌‌‌​​‌​​‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌​​​​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​