本教程示例详细演示了如何控制用户对 OSS 存储空间和文件夹的访问。在示例中,我们首先创建一个存储空间和文件夹,然后使用阿里云主账号创建访问管理 (RAM) 用户,并为这些用户授予对所创建 OSS 存储空间及文件夹的增量权限。
OSS 提供使用键值(key)对格式的分布式对象存储服务。用户根据其唯一的key(对象名)检索对象的内容。例如,名为 example-company 的存储空间有三个文件夹:Development、 Marketing 和 Private,以及一个对象 oss-dg.pdf。
Development/
的对象。注意,文件夹的key包括分隔符
/
。
当您将名为ProjectA.docx的对象上传到Development文件夹中时,控制台会上传该对象并将其key设置为Development/ProjectA.docx
。
在该key中,Development
为前缀,而/
为分隔符。您可以从存储空间中获取具有特定前缀和分隔符的所有对象的列表。在控制台中,单击Development文件夹时,控制台会列出文件夹中的对象,如下图所示。
Development
和分隔符
/
的请求。控制台的响应与文件系统类似,会显示文件夹列表。上例说明,存储空间
example-company有三个对象,其key分别为
Development/Alibaba Cloud.pdf
、
Development/ProjectA.docx
及
Development/ProjectB.docx
。
控制台通过对象的key推断逻辑层次结构。当您创建对象的逻辑层次结构时,您可以管理对个别文件夹的访问,如本教程后面描述的那样。
在本教程开始之前,您还需要知道“根级”存储空间内容的概念。假设example-company存储空间包含以下对象:
这些对象的key构建了一个以 Development、Marketing 和 Private 作为根级文件夹并以 oss-dg.pdf 作为根级对象的逻辑层次结构。当您单击 OSS 控制台中的存储空间名时,控制台会将一级前缀和一个分隔符(Development/、Marketing/ 和 Private/)显示为根级文件夹。对象 oss-dg.pdf 没有前缀,因此显示为根级别项。
在授予权限之前,我们需要清楚,当用户单击某个存储空间的名字时控制台向 OSS 发送的是什么请求、OSS 返回的是什么响应,以及控制台如何解析该响应。
当用户单击某个存储空间名时,控制台会将GetBucket 请求发送至 OSS。此请求包括以下参数:
prefix
,其值为空字符串。
delimiter
,其值为
/
。
请求示例如下所示:
GET /?prefix=&delimiter=/ HTTP/1.1
Host: example-company.oss-cn-hangzhou.aliyuncs.com
Date: Fri, 24 Feb 2012 08:43:27 GMT
Authorization: OSS qn6qrrqxo2oawuk53otfjbyc:DNrnx7xHk3sgysx7I8U9I9IY1vY=
OSS 返回的响应包括ListBucketResult
元素:
HTTP/1.1 200 OK
x-oss-request-id: 534B371674E88A4D8906008B
Date: Fri, 24 Feb 2012 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>example-company</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>
由于 oss-dg.pdf 不包含/
分隔符,因此 OSS 在<Contents/>
元素中返回该key。存储空间 example-company 中的所有其他key都包含/
分隔符,因此 OSS 会将这些key分组,并为每个前缀值 Development/、Marketing/ 和 Private/ 返回一个<CommonPrefixes/>
元素。该元素是一个字符串,包含从这些key的第一个字符开始到第一次出现指定的/
分隔符之间的字符。
控制台会解析此结果并显示如下的根级别项:
现在,如果用户单击Development文件夹,控制台会将GetBucket请求发送至 OSS。此请求包括以下参数:
prefix
,其值为
Development/
。
delimiter
,其值为
/
。
请求示例如下所示:
GET /?prefix=Development/&delimiter=/ HTTP/1.1
Host: oss-example.oss-cn-hangzhou.aliyuncs.com
Date: Fri, 24 Feb 2012 08:43:27 GMT
Authorization: OSS qn6qrrqxo2oawuk53otfjbyc:DNrnx7xHk3sgysx7I8U9I9IY1vY=
作为响应,OSS 返回以指定前缀开头的key:
HTTP/1.1 200 OK
x-oss-request-id: 534B371674E88A4D8906008B
Date: Fri, 24 Feb 2012 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>example-company</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></ListBucketResult>
控制台会解析此结果并显示如下的key:
本教程示例如下所示:
本示例使用阿里云主账号创建RAM用户。最初,这些用户没有任何权限。您将逐步授予这些用户执行特定 OSS 操作的权限。为了测试这些权限,您需要使用每个用户的RAM账号登录到控制台。当您作为主账号所有者逐步授予权限并作为RAM用户测试权限时,您需要每次使用不同账号进行登录和注销。您可以使用一个浏览器来执行此测试。如果您可以使用两个不同的浏览器,则该测试过程用时将会缩短:一个浏览器用于使用主账号连接到阿里云控制台,另一个浏览器用于使用RAM 账号进行连接。
要使用您的主账号登录到阿里云控制台。 RAM用户不能使用相同的链接登录。他们必须使用RAM用户登录链接。作为主账号所有者,您可以向RAM用户提供此链接。
在此步骤中,您可以使用主账号登录到OSS控制台、创建存储空间、将文件夹(Development、Marketing、Private)添加到存储空间中,并在每个文件夹中上传一个或两个示例文档。
有关详细过程,请参见OSS 控制台用户指南中的创建存储空间 。
有关详细过程,请参见 OSS 控制台用户指南 中的创建文件夹。
本例假设您将具有以下对象键的对象上传到存储空间中:
有关创建 RAM 用户的详细过程,请参见 RAM 快速入门中的创建 RAM 用户。请为每个 RAM 用户创建登录密码。
有关创建组的详细过程,请参见 RAM 用户指南中的创建组。
如果您使用两个浏览器,现在可以在另一个浏览器中使用其中一个 RAM 用户账号登录到控制台。
您发现控制台中没有任何存储空间,这意味着 Anne 不具有对存储空间 example-company 的任何权限。
我们希望 Anne 和 Leo 都能执行以下操作:
列出主账号所拥有的所有存储空间。
为此,Anne 和 Leo 必须具有执行 oss:ListBuckets 操作的权限。
列出 example-company 存储空间中的根级别项、文件夹和对象。
为此,Anne 和 Leo 必须具有对 example-company 存储空间执行 oss:ListObjects 操作的权限。
在此步骤中,创建一个授予用户最低权限的策略。凭借最低权限,用户可列出主账号所拥有的所有存储空间。您还将此策略分配给 Staff 组,以便授予获得主账号拥有的存储空间列表的组权限。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"oss:ListBuckets"
],
"Resource": [
"acs:oss:*:*:*"
]
}
]
}
有关分配策略的详细过程,请参见 RAM 快速入门 中将策略分配给 RAM 用户的将策略分配给 RAM 组。
可以将策略分配给 RAM 控制台中的 RAM 用户和组。在本例中,我们将策略分配给组,因为我们希望 Anne 和 Leo 都能够列出这些存储空间。
在此步骤中,您授予权限,允许所有用户列出存储空间 example-company 中的所有项目。当用户在 OSS 控制台中单击 example-company 时,能够看到存储空间中的根级别项。
有关详细过程,请参见 RAM 用户指南中授权策略的修改自定义授权策略部分。注意,您最多可对 RAM 策略进行五次修改。如果超过了五次,则需要删除该策略并创建一个新的策略,然后再次将新策略分配给 Staff 组。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"oss:ListBuckets",
"oss:GetBucketAcl"
],
"Resource": [
"acs:oss:*:*:*"
],
"Condition": {}
},
{
"Effect": "Allow",
"Action": [
"oss:ListObjects"
],
"Resource": [
"acs:oss:*:*:example-company"
],
"Condition": {
"StringLike": {
"oss:Prefix": [
""
],
"oss:Delimiter": [
"/"
]
}
}
}
]
}
/
来添加需要文件夹样式访问的条件。
添加组策略的最终结果是授予 RAM 用户 Anne 和 Leo 以下最低权限:
然而,他们可以进行的操作仍然有限。在以下部分中,我们将授予用户以下特定权限:
对于用户特定的权限,您需要将策略分配给特定用户,而非分配给组。以下部分授予 Anne 在 Development 文件夹中操作的权限。您可以重复这些步骤,授予 Leo 在 Finance 文件夹中进行类似操作的权限。
在此步骤中,我们向 Anne 授予额外的权限,使她可以看到 Development 文件夹的内容,并将对象放入文件夹中。
若要 Anne 能够列出 Development 文件夹内容,您必须为其分配策略。该策略必须能够授予其对 example-company 存储空间执行 oss:ListObjects 操作的权限,还必须包括要求用户在请求中指定前缀 Development/
的条件。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"oss:ListObjects"
],
"Resource": [
"acs:oss:*:*:example-company"
],
"Condition": {
"StringLike": {
"oss:Prefix": [
"Development/*"
]
}
}
}
]
}
有关分配策略的详细过程,请参见 RAM 快速入门中的将策略分配给 RAM 用户
若要 Anne 能够在 Development 文件夹中获取和放入对象,您必须授予她调用 oss:GetObject 和 oss:PutObject 操作的权限,包括用户必须在请求中指定前缀 Development/ 的条件。
有关详细过程,请参见 RAM 用户指南中授权策略的修改自定义授权策略部分。注意,您最多可对 RAM 策略进行五次修改。如果超过了五次,则需要删除该策略并创建一个新的策略,然后再次将新策略分配给 Staff 组。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"oss:ListObjects"
],
"Resource": [
"acs:oss:*:*:example-company"
],
"Condition": {
"StringLike": {
"oss:Prefix": [
"Development/*"
]
}
}
},
{
"Effect": "Allow",
"Action": [
"oss:GetObject",
"oss:PutObject",
"oss:GetObjectAcl"
],
"Resource": [
"acs:oss:*:*:example-company/Development/*"
],
"Condition": {}
}
]
}
控制台列出所有存储空间。
RAM 用户 Anne 现在可以在 example-company 存储空间中列出根级内容,并将对象放入 Development 文件夹中。如果要严格限制访问权限,您可以显式拒绝 Anne 对存储空间中任何其他文件夹的访问。如果有授予 Anne 访问存储空间中任何其他文件夹的其他策略,则此显式策略将替代这些权限。
{
"Effect": "Deny",
"Action": [
"oss:ListObjects"
],
"Resource": [
"acs:oss:*:*:example-company"
],
"Condition": {
"StringNotLike": {
"oss:Prefix": [
"Development/*",
""
]
}
}
}
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"oss:ListObjects"
],
"Resource": [
"acs:oss:*:*:example-company"
],
"Condition": {
"StringLike": {
"oss:Prefix": [
"Development/*"
]
}
}
},
{
"Effect": "Allow",
"Action": [
"oss:GetObject",
"oss:PutObject",
"oss:GetObjectAcl"
],
"Resource": [
"acs:oss:*:*:example-company/Development/*"
],
"Condition": {}
},
{
"Effect": "Deny",
"Action": [
"oss:ListObjects"
],
"Resource": [
"acs:oss:*:*:example-company"
],
"Condition": {
"StringNotLike": {
"oss:Prefix": [
"Development/*",
""
]
}
}
}
]
}
现在,您希望授予 Leo 访问 Marketing 文件夹的权限。请遵循之前用于向 Anne 授予权限的步骤,但应将 Development 文件夹替换为 Marketing 文件夹。有关详细过程,请参见步骤 5:授予 RAM 用户 Anne 特定权限。
在本例中,您仅拥有两个用户。您在组级别授予两个用户所有所需的最小权限,只有当您真正需要单个用户级别上的权限时,才授予用户级别权限。此方法有助于最大限度地减少管理权限的工作量。随着用户数量的增加,我们希望确保不意外地授予用户对 Private 文件夹的权限。因此,我们需要添加一个显式拒绝访问 Private 文件夹的策略。显式拒绝策略会取代任何其他权限。若要确保 Private 文件夹保持私有,可以向组策略添加以下两个拒绝语句:
{
"Effect": "Deny",
"Action": [
"oss:*"
],
"Resource": [
"acs:oss:*:*:example-company/Private/*"
],
"Condition": {}
}
{
"Effect": "Deny",
"Action": [
"oss:ListObjects"
],
"Resource": [
"acs:oss:*:*:*"
],
"Condition": {
"StringLike": {
"oss:Prefix": [
"Private/"
]
}
}
}
用包含前述拒绝语句的更新策略取代 Staff 组策略AllowGroupToSeeBucketListInConsole。在应用更新策略后,组中的任何用户都不能访问您的存储空间中的 Private 文件夹。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"oss:ListBuckets",
"oss:GetBucketAcl"
],
"Resource": [
"acs:oss:*:*:*"
],
"Condition": {}
},
{
"Effect": "Allow",
"Action": [
"oss:ListObjects"
],
"Resource": [
"acs:oss:*:*:example-company"
],
"Condition": {
"StringLike": {
"oss:Prefix": [
""
],
"oss:Delimiter": [
"/"
]
}
}
},
{
"Effect": "Deny",
"Action": [
"oss:*"
],
"Resource": [
"acs:oss:*:*:example-company/Private/*"
],
"Condition": {}
},
{
"Effect": "Deny",
"Action": [
"oss:ListObjects"
],
"Resource": [
"acs:oss:*:*:*"
],
"Condition": {
"StringLike": {
"oss:Prefix": [
"Private/"
]
}
}
}
]
}
要进行清理,您需要在 RAM 控制台中删除用户 Anne 和 Leo。
有关详细过程,请参见 RAM 用户指南中用户的删除RAM用户部分。
为了确保您不再因存储而继续被收取费用,您还需要删除为本示例创建的对象和存储空间。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。