日常工作中使用 cos 或 oss 上传文件是一个非常常见的需求,但是其中的一些名词概念容易让人分不清楚,希望本文可以帮大家解惑,并把一些使用中存在的安全问题分享出来。
基本概念
- Bucket:存储空间,可设置地域、访问权限、存储类型等
- Object 存储对象或文件,通过简单上传、表单上传、追加上传的方式上传单个文件,
文件的大小不能超过5 GB,超过 5g 则需切片上传
- key 对象名称,也是包含文件后缀在内的完整路径,如填写为abc/efg/123.jpg
- Region 表示OSS的数据中心所在物理位置
- Endpoint 表示OSS对外服务的访问域名,访问不同的Region的时候,需要不同的域名。通过内网和外网访问同一个Region所需要的Endpoint也是不同的
Region 和 Endpoint对应列表
Region | 阿里云通用Region ID | OSS专用Region ID | 外网Endpoint | 内网Endpoint |
---|---|---|---|---|
华东1(杭州) | cn-hangzhou | oss-cn-hangzhou | oss-cn-hangzhou.aliyuncs.com | oss-cn-hangzhou-internal.aliyuncs.com |
华北2(北京) | cn-beijing | oss-cn-beijing | oss-cn-beijing.aliyuncs.com | oss-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秒,根据业务场景自行设置