【OSS最佳实践】浅谈OSS权限控制

一、OSS本身的权限控制

1.权限类型

Bucket目前有三种访问权限:public-read-write,public-read和private;Object目前有四种访问权限:default,public-read-write,public-read和private;对于权限的详细介绍看访问控制中的bucket级别权限及object级别权限的内容介绍;

2.权限设定与获取

Bucket级别及object级别的权限设置及获取均可以通过API/SDK/控制台等进行操作;

API:

Put Bucket ACL
PutBucket
GetBucketACL
PutObject
PutObjectACL
GetObjectACL

SDK:

Java SDK--Bucket
JavaSDK--Object

控制台:

Bucket:控制台—>OSS-->选择具体的bucket—>基础设置
【OSS最佳实践】浅谈OSS权限控制

Object:控制台—>OSS-->选择具体的bucket-->文件管理—>点击具体文件
【OSS最佳实践】浅谈OSS权限控制

3.常见问题

1)如何批量设置objectacl

调用listobject接口遍历需要设置的object,结合putobjectacl接口进行设置即可,参考Java—管理文件 ;

2)上传object过程中如何设置object acl

Java:

ObjectMetadata meta = new ObjectMetadata();
meta.setObjectAcl(CannedAccessControlList.PublicReadWrite);

Python:

bucket.put_object('remote.txt', 'content of object', headers={'x-oss-object-acl': permission})

str permission: 可以是oss2.OBJECT_ACL_DEFAULT、oss2.OBJECT_ACL_PRIVATE、oss2.OBJECT_ACL_PUBLIC_READ或oss2.OBJECT_ACL_PUBLIC_READ_WRITE。
参考:python Git源码
PHP:

$options = array(
        OssClient::OSS_HEADERS => array(
            'Expires' => '2012-10-01 08:00:00',
            'Content-Disposition' => 'attachment; filename="xxxxxx"',
            ‘OSS_OBJECT_ACL’=>’ public-read’
    ));
    try{
        $ossClient->putObject($bucket, $object, $content, $options);
    } catch(OssException $e) {
        printf(__FUNCTION__ . ": FAILED\n");
        printf($e->getMessage() . "\n");
        return;
}

读写权限,可选值 ['default', 'private', 'public-read', 'public-read-write']
参考:PHP Git源码

3)bucket设置为私有,能否防止恶意下载

不能防止,一但对应资源的签名url对外暴露,在签名url有效期内就可以通过签名url下载对应的资源;

4)bucket私有,如何获取资源的链接

参考:https://help.aliyun.com/knowledge_detail/65898.html

5)bucket私有,获取到的资源链接是否具有时效性

有时效性,一但过期就不可被访问

6)获取到的资源链接是否可以永久有效

将bucket改为公共读/公共读写,获取到的object链接一般都是永久有效的,但是如果bucket私有要获取永久有效的链接,不支持也没意义(私有本身就是为了保证数据安全性,一定期限内可访问,一定程度上防止恶意下载,链接有效时间过长也就失去了对应的意义)。

二、账户级别权限控制

账户分为主账户、子账户及STS临时账户,其中主账户有OSS的全部权限,子账户及STS临时账户可以进行细粒度的权限划分控制,授权OSS的部分权限;
子账户创建参考:OSS细粒度权限控制—子账户创建部分的内容
STS临时账户创建:STS临时授权访问
OSS支持的权限:访问控制

1.子账户及STS临时账户的业务场景

1)子账户业务场景

子账户可以用于企业内部细粒度的OSS权限划分,如:管理员拥有OSS的全部权限;部分业务人员只拥有其业务应用的bucket的权限,其他bucket无权限;部分业务人员只有bucket的只读权限;部分业务人员只有bucket下某个目录的操作权限等;
子账户的创建便于企业内部的权限划分及回收,不建议将子账户应用于实际的业务服务端,控制客户的权限,服务端的权限控制建议自建数据库表进行权限控制;

2)临时账户业务场景

STS临时账户的定义为子账户扮演了某个角色而获取到了临时的权限,这样的账户叫做临时账户,故对应的子账户得拥有扮演对应角色的权限,而角色得拥有OSS的权限;临时账户拥有的权限是角色权限及创建临时账户policy权限的交集;
STS临时账户一般应用于移动端sdk或者web 端 ,OSS IOS/Android SDK初始化client就通过STS临时账户进行,JS web sdk可以通过STS临时账户操作OSS资源;或者如果企业客户要临时授权给第三方用户操作bucket的权限,也可以生成临时账户供其使用;临时账户具有时效性,最长3600秒过期,过期时间可控且权限粒度可控,具有较高的安全性;

2.子账户及STS临时账户调用OSS的常见问题

参考:子账户及STS临时账户调用常见问题

上一篇:广州联通领航“互联网+”智慧生活


下一篇:【OSS最佳实践】WEB站点中如何应用OSS产品