通过完整的企业场景演示,掌握针对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/目录,等同于授权访问所有Key以Development/开头的对象。
Bucket、目录、文件请求差异
不同的操作目标对应不同的API请求和Resource配置,理解这些差异是正确配置权限策略的关键。
ListObjects请求机制
控制台文件列表显示目录结构的核心是GetBucket (ListObjects)接口的两个参数:
参数 | 作用 | 示例值 |
| 限制返回的对象必须以该前缀开头 |
|
| 对象分组的字符,通常为 |
|
用户在控制台点击Development/文件夹时,控制台向OSS发送如下请求:
GET /?prefix=Development/&delimiter=/ HTTP/1.1
Host: examplebucket.oss-cn-hangzhou.aliyuncs.comOSS返回所有以Development/开头的对象。由于指定了delimiter=/,OSS会将子目录(如Development/SubFolder/)作为CommonPrefixes返回,而非展开其下的所有文件。
不同操作的Resource配置
操作目标 | 触发的API | Resource配置 | 策略配置要点 |
列举存储空间根目录 | ListObjects,prefix为空,delimiter为 |
| Resource指向Bucket本身,而非具体路径 |
进入某个文件夹 | ListObjects,prefix为 |
| Resource指向Bucket本身,而非具体路径,通过Condition的 |
读写文件内容 |
| Resource可精确到路径,支持通配符 |
控制台与API/SDK访问差异
通过OSS控制台访问时,用户需要从Bucket列表逐层导航进入目标目录,这比直接使用API/SDK需要更多的权限:
访问方式 | 所需权限 |
API/SDK | 仅需目标资源的操作权限(如 |
控制台 | 除目标资源权限外,还需 |
场景说明
假设存储空间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 |
| 读写权限 |
RAM用户 Leo |
| 只读权限 |
指定用户组的所有成员 |
| 禁止访问 |
步骤一:创建存储空间并上传文件
前往Bucket列表,创建Bucket,如
examplebucket。在存储空间内新建目录:
Development、Marketing和Private(在Private下再创建子目录2017)。按如下路径上传文件:
根目录:
oss-dg.pdfDevelopment/目录:Alibaba Cloud.pdf、ProjectA.docx、ProjectB.docxMarketing/目录:data2020.xlsx、data2021.xlsxPrivate/2017/目录:images.zip、promote.pptx
步骤二:创建RAM用户Anne和Leo
前往RAM用户列表,创建用户Anne和Leo。
步骤三:授予Anne对Development文件夹的读写权限
策略设计思路
要实现对Development/文件夹的读写访问,需要授予两类权限:
列举权限:允许用户查看
Development/文件夹的内容(oss:ListObjects),通过Condition限制只能列举以Development开头的对象。读写权限:允许用户读取和上传
Development/下的文件(oss:GetObject、oss:PutObject),Resource指向examplebucket/Development/*。
创建并授权策略
前往RAM权限策略列表,单击创建权限策略。
选择脚本编辑,输入以下策略内容:
{ "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:授予列举权限,Resource为Bucket本身,通过
Condition的oss:Prefix条件限制只能列举Development及其子目录下的内容。第二个Statement:授予读写权限,Resource精确指向
Development/*路径下的所有对象。
单击确定,输入策略名称(如
AllowAnneAccessDevelopment),单击确定完成创建。前往RAM用户列表,为RAM用户Anne添加权限,选择刚创建的策略。
步骤四:授予Leo对Marketing文件夹的只读权限
参照步骤三,为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在资源侧配置拒绝策略。
创建用户组并添加成员
前往RAM用户组列表,创建用户组(如
DenyPrivateAccessGroup)。添加组成员,将需要禁止访问
Private/文件夹的RAM用户添加到用户组。
创建并授予拒绝策略
前往RAM权限策略列表,单击创建权限策略。
选择脚本编辑,输入以下策略内容:
{ "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/文件夹的内容,防止用户查看文件列表。
单击确定,输入策略名称(如
DenyAccessPrivateFolder),单击确定完成创建。前往RAM用户组列表,为RAM用户组添加权限,选择刚创建的策略。
用户组中的RAM用户尝试访问Private/文件夹时,无论是列举文件还是下载文件,OSS都将返回权限拒绝的错误响应。