本教程示例详细演示了如何使用RAM Policy控制用户对OSS存储空间(Bucket)、文件夹以及文件夹下文件(Object)的访问权限。
背景信息
RAM Policy是基于用户的授权策略。通过设置RAM Policy,您可以集中管理您的用户(例如员工、系统或应用程序),以及控制用户可以访问您名下哪些资源的权限,例如限制您的用户只拥有对某一个Bucket的读权限。
RAM Policy为JSON格式。各字段定义如下:
Statement:授权语句,一个权限策略可以有多条授权语句。
Effect:授权效力,包括允许(Allow)和拒绝(Deny)两种。
说明当权限策略中既有Allow又有Deny的授权语句时,遵循Deny优先的原则。
Action:对具体资源的操作权限。
如果您选择使用RAM Policy,建议您通过官方工具RAM策略编辑器快速生成RAM策略。
相比于RAM Policy,Bucket Policy支持在控制台直接进行图形化配置操作,并且Bucket拥有者可以直接进行授权访问。更多信息,请参见使用Bucket Policy授权其他用户访问OSS资源。
存储空间和文件夹的基本概念
阿里云OSS的数据模型为扁平型结构,所有文件都直接隶属于其对应的存储空间。因此,OSS缺少文件系统中类似于目录与子文件夹的层次结构。但是,您可以在OSS控制台上模拟文件夹层次结构。在该控制台中,您可以按文件夹对相关文件进行分组、分类和管理,如下图所示。
OSS提供使用键值(key)对格式的分布式对象存储服务。您可以根据其唯一的key(对象名)检索对象的内容。例如,名为examplebucket的存储空间有三个文件夹,分别为Development、Marketing和Private,以及一个对象oss-dg.pdf。
在创建Development文件夹时,控制台会创建一个key为
Development/
的对象,文件夹的key包括分隔符/
。当您将名为ProjectA.docx 的对象上传到Development 文件夹中时,控制台会上传该对象并将其key设置为
Development/ProjectA.docx
。在该key中,
Development
为前缀,而/
为分隔符。您可以从存储空间中获取具有特定前缀和分隔符的所有对象的列表。在控制台中,单击Development 文件夹时,控制台会列出文件夹中的对象,如下图所示。说明当控制台列举examplebucket存储空间中的 Development文件夹时,它会向OSS发送一个用于指定前缀
Development
和分隔符/
的请求。因此,存储空间examplebucket有三个对象,其key分别为Development/Alibaba Cloud.pdf
、Development/ProjectA.docx
及Development/ProjectB.docx
。
在本教程开始之前,您还需要了解根级存储空间内容的概念。假设examplebucket存储空间包含以下对象:
Development/Alibaba Cloud.pdf
Development/ProjectA.docx
Development/ProjectB.docx
Marketing/data2020.xlsx
Marketing/data2021.xlsx
Private/2017/images.zip
Private/2017/promote.pptx
oss-dg.pdf
这些对象的key构建了一个以Development、Marketing和Private作为根级文件夹并以oss-dg.pdf作为根级对象的逻辑层次结构。当您单击OSS控制台中的存储空间名时,控制台会将一级前缀和一个分隔符,例如Development/、Marketing/和Private/显示为根级文件夹。对象oss-dg.pdf没有前缀,因此显示为根级别项。
OSS的请求和响应逻辑
在授予RAM用户相关权限之前,您需要了解单击某个存储空间的名字时控制台向OSS发送请求、OSS返回响应,以及控制台如何解析该响应的逻辑。
请求某个存储空间
单击examplebucket存储空间时,控制台会将GetBucket (ListObjects)请求发送至OSS。
请求示例
GET /?prefix=&delimiter=/ HTTP/1.1 Host: examplebucket.oss-cn-hangzhou.aliyuncs.com Date: Fri, 24 Feb 2012 08:43:27 GMT Authorization: OSS qn6q*******************:DNrn******************
此请求包括prefix和delimiter参数,其中prefix的值为空字符串,delimiter的值为正斜线(/)。
响应示例
HTTP/1.1 200 OK x-oss-request-id: 534B371674E88A4D8906**** Date: Fri, 7 Aug 2020 08:43:27 GMT Content-Type: application/xml Content-Length: 712 Connection: keep-alive Server: AliyunOSS <?xml version="1.0" encoding="UTF-8"?> <ListBucketResult xmlns="http://doc.oss-cn-hangzhou.aliyuncs.com"> <Name>examplebucket</Name> <Prefix></Prefix> <Marker></Marker> <MaxKeys>100</MaxKeys> <Delimiter>/</Delimiter> <IsTruncated>false</IsTruncated> <Contents> <Key>oss-dg.pdf</Key> ... </Contents> <CommonPrefixes> <Prefix>Development</Prefix> </CommonPrefixes> <CommonPrefixes> <Prefix>Marketing</Prefix> </CommonPrefixes> <CommonPrefixes> <Prefix>Private</Prefix> </CommonPrefixes> </ListBucketResult>
控制台解析
控制台会解析此结果并显示如下的根级别项:
请求存储空间下的某个文件夹
单击Development/文件夹,控制台会将GetBucket (ListObjects)请求发送至OSS。此请求包括以下参数:
请求示例
GET /?prefix=Development/&delimiter=/ HTTP/1.1 Host: examplebucket.oss-cn-hangzhou.aliyuncs.com Date: Fri, 24 Feb 2012 08:43:27 GMT Authorization: OSS qn6q*******************:DNrn******************
此请求包括prefix和delimiter参数,其中prefix的值为
Development/
,delimiter的值为正斜线(/)。响应示例
作为响应,OSS返回以指定前缀开头的key:
HTTP/1.1 200 OK x-oss-request-id: 534B371674E88A4D8906**** Date: Fri, 7 Aug 2020 08:43:27 GMT Content-Type: application/xml Content-Length: 712 Connection: keep-alive Server: AliyunOSS <?xml version="1.0" encoding="UTF-8"?> <ListBucketResult xmlns="http://doc.oss-cn-hangzhou.aliyuncs.com"> <Name>examplebucket</Name> <Prefix>Development/</Prefix> <Marker></Marker> <MaxKeys>100</MaxKeys> <Delimiter>/</Delimiter> <IsTruncated>false</IsTruncated> <Contents> <Key>ProjectA.docx</Key> ... </Contents> <Contents> <Key>ProjectB.docx</Key> ... </Contents> <Contents> <Key>Alibaba Cloud.pdf</Key> ... </Contents> </ListBucketResult>
控制台解析
控制台会解析此结果并显示如下的key:
场景示例
假设您是目标存储空间examplebucket
的Owner,且该Bucket下所有的文件或目录读写权限ACL默认为私有。现在,您希望授予RAM用户Anne访问该Bucket下文件夹Development
及其子文件夹和文件的读写权限,RAM用户Leo访问文件夹Marketing
及其子文件夹和文件的只读权限,以及当前阿里云账号下的所有RAM用户均无权访问文件夹Private
的权限。
步骤一:创建存储空间并上传文件
步骤二:创建RAM用户Anne和Leo
步骤三:授予RAM用户Anne拥有文件夹Development的读写权限
创建自定义权限策略AllowAnneToReadAndWriteFolderDevelopment。
在左侧导航栏,选择 。
在权限策略页面,单击创建权限策略。
在创建权限策略页面,单击脚本编辑页签。
输入以下权限策略内容,然后单击继续编辑基本信息。
以下策略用于授予RAM用户Anne拥有文件夹Development及文件夹下所有文件的读写权限。
{ "Version":"1", "Statement":[ { "Effect":"Allow", "Action":[ "oss:ListObjects" ], "Resource":[ "acs:oss:*:*:examplebucket" ], "Condition":{ "StringLike":{ "oss:Prefix":[ "Development", "Development/*" ] } } }, { "Effect":"Allow", "Action":[ "oss:GetObject", "oss:PutObject", "oss:GetObjectAcl" ], "Resource":[ "acs:oss:*:*:examplebucket/Development/*" ] } ] }
输入权限策略名称和备注。
单击确定。
为RAM用户Anne添加自定义权限策略AllowAnneToReadAndWriteFolderDevelopment。具体操作,请参见为RAM用户授权。
步骤四:授予RAM用户Leo拥有文件夹Marketing的只读权限
参见步骤三创建自定义权限策略AllowLeoToReadAndWriteFolderMarketing,并授予RAM用户Leo只读访问文件夹Marketing及文件夹下所有文件的权限。其策略内容配置如下:
{
"Version":"1",
"Statement":[
{
"Effect":"Allow",
"Action":[
"oss:ListObjects"
],
"Resource":[
"acs:oss:*:*:examplebucket"
],
"Condition":{
"StringLike":{
"oss:Prefix":[
"Marketing",
"Marketing/*"
]
}
}
},
{
"Effect":"Allow",
"Action":[
"oss:GetObject",
"oss:GetObjectAcl"
],
"Resource":[
"acs:oss:*:*:examplebucket/Marketing/*"
]
}
]
}
步骤5:拒绝当前阿里云账号下的所有RAM用户访问Private文件夹
创建用户组并添加用户组成员。
创建用户组的具体操作,请参见创建RAM用户组。用户组创建完成后,将当前阿里云账号下的所有RAM用户添加到该用户组。具体操作,请参见为RAM用户组添加RAM用户。
创建自定义权限策略DenyAllRamToAccessFolderPrivate。
在左侧导航栏,选择 。
在权限策略页面,单击创建权限策略。
输入以下权限策略内容,然后单击继续编辑基本信息。
以下策略用于授予当前阿里云账号下的所有RAM用户拒绝访问Private文件夹的权限。
{ "Version":"1", "Statement":[ { "Effect":"Deny", "Action":[ "oss:*" ], "Resource":[ "acs:oss:*:*:examplebucket/Private/*" ], "Condition":{ } }, { "Effect":"Deny", "Action":[ "oss:ListObjects" ], "Resource":[ "acs:oss:*:*:*" ], "Condition":{ "StringLike":{ "oss:Prefix":[ "Private/", "Private/*" ] } } } ] }
输入权限策略名称和备注。
单击确定。
为用户组添加自定义权限策略DenyAllRamToAccessFolderPrivate。具体操作,请参见为RAM用户组授权。
添加权限策略后,用户组中的任何RAM用户都不能访问您存储空间
examplebucket
中的文件夹Private
,且当RAM用户请求列举Private
文件夹下的Private/2017/images.zip
、Private/2017/promote.pptx
文件时,OSS也将返回错误响应。