使用RAMPolicy控制OSS的访问权限

本教程示例详细演示了如何使用RAM Policy控制用户对OSS存储空间(Bucket)、文件夹以及文件夹下文件(Object)的访问权限。

背景信息

RAM Policy是基于用户的授权策略。通过设置RAM Policy,您可以集中管理您的用户(例如员工、系统或应用程序),以及控制用户可以访问您名下哪些资源的权限,例如限制您的用户只拥有对某一个Bucket的读权限。

RAM PolicyJSON格式。各字段定义如下:

  • Statement:授权语句,一个权限策略可以有多条授权语句。

  • Effect:授权效力,包括允许(Allow)和拒绝(Deny)两种。

    说明

    当权限策略中既有Allow又有Deny的授权语句时,遵循Deny优先的原则。

  • Action:对具体资源的操作权限。

如果您选择使用RAM Policy,建议您通过官方工具RAM策略编辑器快速生成RAM策略。

相比于RAM Policy,Bucket Policy支持在控制台直接进行图形化配置操作,并且Bucket拥有者可以直接进行授权访问。更多信息,请参见使用Bucket Policy授权其他用户访问OSS资源

存储空间和文件夹的基本概念

阿里云OSS的数据模型为扁平型结构,所有文件都直接隶属于其对应的存储空间。因此,OSS缺少文件系统中类似于目录与子文件夹的层次结构。但是,您可以在OSS控制台上模拟文件夹层次结构。在该控制台中,您可以按文件夹对相关文件进行分组、分类和管理,如下图所示。ram

OSS提供使用键值(key)对格式的分布式对象存储服务。您可以根据其唯一的key(对象名)检索对象的内容。例如,名为examplebucket的存储空间有三个文件夹,分别为DevelopmentMarketingPrivate,以及一个对象oss-dg.pdf

  • 在创建Development文件夹时,控制台会创建一个keyDevelopment/的对象,文件夹的key包括分隔符/

  • 当您将名为ProjectA.docx 的对象上传到Development 文件夹中时,控制台会上传该对象并将其key设置为Development/ProjectA.docx

    在该key中,Development为前缀,而/为分隔符。您可以从存储空间中获取具有特定前缀和分隔符的所有对象的列表。在控制台中,单击Development 文件夹时,控制台会列出文件夹中的对象,如下图所示。

    development

    说明

    当控制台列举examplebucket存储空间中的 Development文件夹时,它会向OSS发送一个用于指定前缀 Development和分隔符/的请求。因此,存储空间examplebucket有三个对象,其key分别为Development/Alibaba Cloud.pdfDevelopment/ProjectA.docxDevelopment/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构建了一个以DevelopmentMarketingPrivate作为根级文件夹并以oss-dg.pdf作为根级对象的逻辑层次结构。当您单击OSS控制台中的存储空间名时,控制台会将一级前缀和一个分隔符,例如Development/Marketing/Private/显示为根级文件夹。对象oss-dg.pdf没有前缀,因此显示为根级别项。

ram

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******************

      此请求包括prefixdelimiter参数,其中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>
    • 控制台解析

      控制台会解析此结果并显示如下的根级别项:

      ram

  • 请求存储空间下的某个文件夹

    单击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******************

      此请求包括prefixdelimiter参数,其中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:

      development

场景示例

假设您是目标存储空间examplebucketOwner,且该Bucket下所有的文件或目录读写权限ACL默认为私有。现在,您希望授予RAM用户Anne访问该Bucket下文件夹Development及其子文件夹和文件的读写权限,RAM用户Leo访问文件夹Marketing及其子文件夹和文件的只读权限,以及当前阿里云账号下的所有RAM用户均无权访问文件夹Private的权限。

步骤一:创建存储空间并上传文件

  1. 创建存储空间examplebucket

    1. 使用阿里云账号登录OSS控制台

    2. 创建名为examplebucket的存储空间。具体操作,请参见创建存储空间

  2. 创建目录DevelopmentMarketingPrivate。具体操作,请参见创建目录

  3. 按如下要求将文件上传至指定路径。

    • oss-dg.pdf文件上传至examplebucket的根目录。

    • 将文件Alibaba Cloud.pdf、ProjectA.docx以及ProjectB.docx上传至Development目录。

    • 将文件data2020.xlsxdata2021.xlsx上传至Marketing目录。

    • 将文件images.zippromote.pptx上传至Private目录。

    具体操作,请参见上传文件

步骤二:创建RAM用户AnneLeo

通过RAM控制台创建RAM用户AnneLeo为例。关于创建RAM用户的具体操作,请参见创建RAM用户

步骤三:授予RAM用户Anne拥有文件夹Development的读写权限

  1. 创建自定义权限策略AllowAnneToReadAndWriteFolderDevelopment

    1. 在左侧导航栏,选择权限管理 > 权限策略

    2. 权限策略页面,单击创建权限策略

    3. 创建权限策略页面,单击脚本编辑页签。

    4. 输入以下权限策略内容,然后单击继续编辑基本信息

      以下策略用于授予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/*"
                  ]
              }
          ]
      }
    5. 输入权限策略名称备注

    6. 单击确定

  2. 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文件夹

  1. 创建用户组并添加用户组成员。

    创建用户组的具体操作,请参见创建RAM用户组。用户组创建完成后,将当前阿里云账号下的所有RAM用户添加到该用户组。具体操作,请参见RAM用户组添加RAM用户

  2. 创建自定义权限策略DenyAllRamToAccessFolderPrivate

    1. 在左侧导航栏,选择权限管理 > 权限策略

    2. 权限策略页面,单击创建权限策略

    3. 输入以下权限策略内容,然后单击继续编辑基本信息

      以下策略用于授予当前阿里云账号下的所有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/*"
                          ]
                      }
                  }
              }
          ]
      }
    4. 输入权限策略名称备注

    5. 单击确定

  3. 为用户组添加自定义权限策略DenyAllRamToAccessFolderPrivate。具体操作,请参见RAM用户组授权

    添加权限策略后,用户组中的任何RAM用户都不能访问您存储空间examplebucket中的文件夹Private,且当RAM用户请求列举Private文件夹下的Private/2017/images.zipPrivate/2017/promote.pptx文件时,OSS也将返回错误响应。