基于RAM Policy控制OSS的访问权限

更新时间:
复制为 MD 格式

通过完整的企业场景演示,掌握针对OSS存储空间、目录和文件配置精细化访问权限的方法。深入了解OSS扁平化存储结构和前缀列举机制对策略配置的影响,掌握为不同RAM用户授予目录级别读写、只读及拒绝访问权限。

存储结构与授权

OSS存储模型

OSS采用扁平化存储模型,以键值(Key-Value)对格式存储对象文件,所有文件直接隶属于存储空间,物理上不存在目录层级结构。控制台中显示的“目录”通过对象文件Key的前缀和分隔符(/)模拟出文件夹层次结构,实现文件的分组、分类和管理功能。

以存储空间examplebucket为例,控制台显示的目录结构及对应的对象Key如下:

examplebucket
├── Development/                     # Key: Development/(目录对象)
│   ├── Alibaba Cloud.pdf            # Key: Development/Alibaba Cloud.pdf
│   ├── ProjectA.docx                # Key: Development/ProjectA.docx
│   └── ProjectB.docx                # Key: Development/ProjectB.docx
├── Marketing/                       # Key: Marketing/(目录对象)
│   ├── data2020.xlsx                # Key: Marketing/data2020.xlsx
│   └── data2021.xlsx                # Key: Marketing/data2021.xlsx
├── Private/                         # Key: Private/(目录对象)
│   └── 2017/                        # Key: Private/2017/(目录对象)
│       ├── images.zip               # Key: Private/2017/images.zip
│       └── promote.pptx             # Key: Private/2017/promote.pptx
└── oss-dg.pdf                       # Key: oss-dg.pdf

目录对象的Key/结尾,这是OSS识别“目录”的标志。实际存储中,所有对象(包括目录对象)都是扁平存储的。

由于OSS没有真正的目录层级,当需要授权访问某个“目录”时,实际上是在授权访问具有特定前缀的所有对象。例如授权访问Development/目录,等同于授权访问所有KeyDevelopment/开头的对象。

Bucket、目录、文件请求差异

不同的操作目标对应不同的API请求和Resource配置,理解这些差异是正确配置权限策略的关键。

ListObjects请求机制

控制台文件列表显示目录结构的核心是GetBucket (ListObjects)接口的两个参数:

参数

作用

示例值

prefix

限制返回的对象必须以该前缀开头

Development/

delimiter

对象分组的字符,通常为/

/

用户在控制台点击Development/文件夹时,控制台向OSS发送如下请求:

GET /?prefix=Development/&delimiter=/ HTTP/1.1
Host: examplebucket.oss-cn-hangzhou.aliyuncs.com

OSS返回所有以Development/开头的对象。由于指定了delimiter=/,OSS会将子目录(如Development/SubFolder/)作为CommonPrefixes返回,而非展开其下的所有文件。

不同操作的Resource配置

操作目标

触发的API

Resource配置

策略配置要点

列举存储空间根目录

ListObjects,prefix为空,delimiter/

acs:oss:*:*:examplebucket

Resource指向Bucket本身,而非具体路径

进入某个文件夹

ListObjects,prefix文件夹名/,delimiter/

acs:oss:*:*:examplebucket

Resource指向Bucket本身,而非具体路径,通过Conditionoss:Prefix限制可列举范围

读写文件内容

GetObjectPutObject

acs:oss:*:*:examplebucket/文件夹名/*

Resource可精确到路径,支持通配符*

控制台与API/SDK访问差异

通过OSS控制台访问时,用户需要从Bucket列表逐层导航进入目标目录,这比直接使用API/SDK需要更多的权限:

访问方式

所需权限

API/SDK

仅需目标资源的操作权限(如oss:GetObject

控制台

除目标资源权限外,还需oss:ListBuckets(显示Bucket列表)、oss:GetBucketInfo(显示Bucket信息)等辅助权限

场景说明

假设存储空间examplebucket所有文件的读写权限ACL默认为私有。存储空间结构如下:

examplebucket
├── Development/           # 开发部门文件夹
│   ├── Alibaba Cloud.pdf
│   ├── ProjectA.docx
│   └── ProjectB.docx
├── Marketing/             # 市场部门文件夹
│   ├── data2020.xlsx
│   └── data2021.xlsx
├── Private/               # 机密文件夹
│   └── 2017/
│       ├── images.zip
│       └── promote.pptx
└── oss-dg.pdf

权限控制目标如下:

RAM用户/用户组

授权目标

权限类型

RAM用户 Anne

Development/文件夹及其所有文件

读写权限

RAM用户 Leo

Marketing/文件夹及其所有文件

只读权限

指定用户组的所有成员

Private/文件夹及其所有文件

禁止访问

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

  1. 前往Bucket列表创建Bucket,如examplebucket

  2. 在存储空间内新建目录DevelopmentMarketingPrivate(在Private下再创建子目录2017)。

  3. 按如下路径上传文件

    • 根目录:oss-dg.pdf

    • Development/目录:Alibaba Cloud.pdfProjectA.docxProjectB.docx

    • Marketing/目录:data2020.xlsxdata2021.xlsx

    • Private/2017/目录:images.zippromote.pptx

步骤二:创建RAM用户AnneLeo

前往RAM用户列表创建用户AnneLeo。

步骤三:授予AnneDevelopment文件夹的读写权限

策略设计思路

要实现对Development/文件夹的读写访问,需要授予两类权限:

  1. 列举权限:允许用户查看Development/文件夹的内容(oss:ListObjects),通过Condition限制只能列举以Development开头的对象。

  2. 读写权限:允许用户读取和上传Development/下的文件(oss:GetObjectoss:PutObject),Resource指向examplebucket/Development/*

创建并授权策略

  1. 前往RAM权限策略列表,单击创建权限策略

  2. 选择脚本编辑,输入以下策略内容:

    {
      "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/*"
        }
      ]
    }

    策略解析

    • 第一个Statement:授予列举权限,ResourceBucket本身,通过Conditionoss:Prefix条件限制只能列举Development及其子目录下的内容。

    • 第二个Statement:授予读写权限,Resource精确指向Development/*路径下的所有对象。

  3. 单击确定,输入策略名称(如AllowAnneAccessDevelopment),单击确定完成创建。

  4. 前往RAM用户列表,为RAM用户Anne添加权限,选择刚创建的策略。

步骤四:授予LeoMarketing文件夹的只读权限

参照步骤三,为RAM用户Leo创建并授予只读策略。与读写策略的区别在于Action只包含读取相关操作。策略内容:

{
  "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/*"
    }
  ]
}

Action中移除了oss:PutObject,Leo只能读取而不能上传或修改文件。

步骤五:禁止指定用户组访问Private文件夹

通过用户组统一管理权限,将需要禁止访问Private/文件夹的RAM用户添加到同一用户组,然后为该用户组配置拒绝策略。

说明

此方法仅对已加入用户组的RAM用户生效。如需对账号下所有RAM用户(包括后续新增的用户)生效,建议使用Bucket Policy在资源侧配置拒绝策略。

创建用户组并添加成员

  1. 前往RAM用户组列表创建用户组(如DenyPrivateAccessGroup)。

  2. 添加组成员,将需要禁止访问Private/文件夹的RAM用户添加到用户组。

创建并授予拒绝策略

  1. 前往RAM权限策略列表,单击创建权限策略

  2. 选择脚本编辑,输入以下策略内容:

    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Deny",
          "Action": "oss:*",
          "Resource": "acs:oss:*:*:examplebucket/Private/*"
        },
        {
          "Effect": "Deny",
          "Action": "oss:ListObjects",
          "Resource": "acs:oss:*:*:examplebucket",
          "Condition": {
            "StringLike": {
              "oss:Prefix": [
                "Private/",
                "Private/*"
              ]
            }
          }
        }
      ]
    }

    策略解析

    • 第一个Statement:拒绝对Private/路径下所有文件的任何操作。

    • 第二个Statement:拒绝列举Private/文件夹的内容,防止用户查看文件列表。

  3. 单击确定,输入策略名称(如DenyAccessPrivateFolder),单击确定完成创建。

  4. 前往RAM用户组列表,为RAM用户组添加权限,选择刚创建的策略。

用户组中的RAM用户尝试访问Private/文件夹时,无论是列举文件还是下载文件,OSS都将返回权限拒绝的错误响应。

相关文档