全面梳理一下 oss/cos 文件上传

704 阅读4分钟

日常工作中使用 cos 或 oss 上传文件是一个非常常见的需求,但是其中的一些名词概念容易让人分不清楚,希望本文可以帮大家解惑,并把一些使用中存在的安全问题分享出来。

基本概念

  • Bucket:存储空间,可设置地域、访问权限、存储类型等
  • Object 存储对象或文件,通过简单上传、表单上传、追加上传的方式上传单个文件,文件的大小不能超过5 GB,超过 5g 则需切片上传
  • key 对象名称,也是包含文件后缀在内的完整路径,如填写为abc/efg/123.jpg
  • Region 表示OSS的数据中心所在物理位置
  • Endpoint 表示OSS对外服务的访问域名,访问不同的Region的时候,需要不同的域名。通过内网和外网访问同一个Region所需要的Endpoint也是不同的

Region 和 Endpoint对应列表

Region阿里云通用Region IDOSS专用Region ID外网Endpoint内网Endpoint
华东1(杭州)cn-hangzhouoss-cn-hangzhouoss-cn-hangzhou.aliyuncs.comoss-cn-hangzhou-internal.aliyuncs.com
华北2(北京)cn-beijingoss-cn-beijingoss-cn-beijing.aliyuncs.comoss-cn-beijing-internal.aliyuncs.com

可访问链接

  • OSS的访问地址为固定格式:BucketName.Endpoint/key
  • BucketName为您的存储空间名称,
  • Endpoint为存储空间所在的地域对应的访问域名。
  • 设置动态 key,防止非法遍历
// bad
// 如果设置的 bucket 权限较大,非法用户可以对 /test/2024-06-13 下的资源遍历读取
https://BucketName.Endpoint/test/2024-06-13/{动态}-test.mp3

// good
https://BucketName.Endpoint/test/2024-06-13/{动态}/xxx-test.mp3 

访问控制流程

默认为私有权限

权限控制与设置

访问控制的权限控制策略和适用场景介绍_对象存储(OSS)-阿里云帮助中心

  • Bucket ACL:分为public-read-write(公共读写)、public-read(公共读)和private(私有)三种
  • Object ACL:Object ACL分为default(继承Bucket)、public-read-write(公共读写)、public-read(公共读)和private(私有)四种
OSS全局 > 单个Bucket > 单个接入点 > 单个对象FC接入点

授权方式

服务端生成STS临时访问凭证

适用于基于分片上传大文件、基于分片断点续传的场景

频繁地调用STS服务会引起限流

默认有效期 1 分钟

服务端生成PostObject所需的签名和Post Policy

适用于通过HTML表单上传的方式上传文件

不支持基于分片上传大文件、基于分片断点续传的场景

通过表单上传的方式上传的Object大小不能超过5 GB。

服务端生成PutObject所需的签名URL

不适用于基于分片上传大文件、基于分片断点续传的场景

当需要允许临时且有限制的上传权限给外部用户时,使用预签名URL是一种安全的做法

// 授权接口返回
{
  accessKeyId:"LTA-------------------c12Q",
  expire: 1718267281,
  fileHost: "https://{BucketName.Endpoint}",
  host: "https://{BucketName.Endpoint}",
  policy: "eyJleHBpcmFfQ==很长",
  signature: "Uf4K------------QU="
}

最佳实践

  • 设置防盗链:通过在OSS中配置基于请求标头Referer的访问规则,可以阻止某些Referer访问您的OSS文件
  • 通过Bucket Policy限制IP黑白名单访问:如果访问OSS资源的IP地址是固定可枚举的,可考虑限定来源的IP地址。
  • 细粒度权限管控:为每个Bucket设置细致的访问控制策略,只允许特定IP、用户或角色访问,避免未授权访问
  • STS和URL鉴权与授权机制,
    • 对业务授权接口进行二次加密,增加破解成本
    • 设置合适的过期时间,原来30天
  • 启用COS的日志记录功能,以便追踪和审计所有上传活动,及时发现异常访问
  • 结合COS的监控指标(如请求量、流量突增)和云监控服务设置警报通知,及时响应潜在的安全威胁
  • 避免代码明文使用AccessKey或本地加密存储AccessKey
  • 客户端代码进行混淆加密
  • 服务端加密:为存储在COS中的数据启用服务器端加密(SSE-C或SSE-KMS),即使数据被意外访问,也无法直接读取内容
  • 始终使用HTTPS协议进行文件上传,以保护数据在传输过程中的安全性和隐私
  • OSS 内容安全功能:需付费

如何保证指定时间段内可以访问私有权限的图片文件?

可以通过SDK或命令行工具ossutil生成较大过期时间的签名URL。为避免图片文件被其他人盗用,您还需要对该图片文件所在的Bucket设置防盗链。

出于安全考虑,OSS控制台中默认URL的有效时间为3600秒,最大值为32400秒,根据业务场景自行设置