对象存储

对象存储

Bucket(桶)和Object(对象)

Bucket是一个网络资源,相当于一个文件夹、硬盘。 桶名是独一无二的,全网唯一。不同的Region,可以有相同的桶名

Bucket可以看做Object的集合。 一个Object相当于一个文件。但Bucket中只有Object,没有文件夹这个概念。 基于Object,可以单独地做读写(上传与下载)、权限管控等操作。

AK/SK

Bucket作为一个网络资源,有三种权限配置:公共读写公共读私有
公共类不需要AK/SK,知道URL就能访问,建议限制源端IP
私有类,需要携带AK/SK,OSS云端校验通过后,才能访问

AccessKey和SecretKey不能泄露,不能给第三方,相当于你的账号凭证。
阿里云用AK(AccessKeyID/AccessKeySecret)表示密钥对

1
2
3
4
5
6
1、不应该用主账号的AK/SK,应该创建子账号AK/SK并赋予最小存储桶权限
2、推荐不同的桶,创建不同的AK/SK
3、AK/SK不应该明文存储
4、AK/SK不应该放在客户端上,只应该在后端
5、客户端(Android、IOS、Web)要直接访问对象存储,需先向后端服务器请求加签的URL
6、临时的访问凭证(给第三方用),用主账号的AK/SK调用STS产生一个临时的AK/SK,发给第三方

STS

STS是阿里云提供的API,你创建的桶,想给其他人来访问,直接给你的真实AK/SK是不安全的
建议在后端服务器自行实现调用STS生成临时的AK/SK,再发送给第三方/APP客户端

STS临时账号授权
当然了,第三方可能很懒,你给他一个临时AK/SK还需要他自己实现接口签名才能访问OSS。
这块工作你也可以帮他来做,叫预签名。即上图的第5步由你的APP服务器来实现,生成临时的下载URL给第三方,对方不需要什么开发量,直接访问URL就行

Web前端直传OSS

一个GET,从应用服务器获取AccessIDPolicySignature三个值
一个POST,将本地文件上传到OSS

Policy定义授权策略,过期时间等
为防止C端篡改Object名称、上传目录、callback等,应对这些字段在policy中写死进行signature签名,不可篡改。
即上传的file key必须由服务端指定。
签名方法Signature = base64(hmac-sha1(base64(policy), AccessKeySecret))

Tips:一次签名只能上传一个文件,通过在policy里面设置 content-length-range(文件大小限制)和 key(文件路径),来控制用户的上传策略,如果严格一点还可以设置必须让用户上传的文件类型

1
2
content-length-range=524288 字节
key=/user/logo/3f7a68dbfa984a189f80612343064f32.png

-Web端上传数据至OSS实践

没钱的话,个人博客静态网页可以试试OSS对象存储托管