把权限装进链接
预签名链接是用签名密钥提前生成的一条带签名的访问地址:它在有效期内可以完成被限定的操作,而持有者无需拥有任何账号凭证。签名内容涵盖请求方法、对象键、过期时间与若干请求头,任一要素被改动签名即失效。因此它既是临时授权的载体,也是把上传下载能力安全交给浏览器的常见手段。
基本信息
| 适用平台 | 兼容 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 天;超过上限的请求会被拒绝,需要更长时效时改用其他授权模型。