RAM Policy是基于身份的授权策略,专门用于集中管理用户身份对OSS资源的访问权限。通过RAM Policy可精确定义“哪个身份”、“在什么条件下”、“可以对哪些OSS资源”、“执行何种操作”,实现权限精细化管控,保障企业数据安全。
工作原理
RAM Policy采用基于身份的授权模式,授权主体为RAM中的身份实体(RAM用户、用户组、RAM角色)。权限评估严格遵循“显式拒绝优先”原则,OSS收到访问请求后,系统综合评估所有相关策略(包括RAM Policy和Bucket Policy),按以下顺序进行权限判定:
显式拒绝(Deny)优先:任何策略中存在一条明确的
"Effect": "Deny"规则匹配该请求,请求立即被拒绝。寻找显式允许(Allow):不存在匹配的Deny规则时,系统查找是否存在一条明确的
"Effect": "Allow"规则匹配该请求。匹配成功时,请求被允许。默认拒绝:既无匹配的Deny规则,也无匹配的Allow规则时,请求默认被拒绝。
OSS支持两种权限策略类型:系统策略和自定义策略。系统策略由阿里云创建和维护,用户只能使用不能修改。自定义策略由用户创建和维护,可自主进行创建、更新和删除操作。
授权系统权限策略
系统权限策略由阿里云创建,可在RAM控制台直接为用户身份授权。以下以RAM用户为例演示授权步骤。
前往RAM用户列表,单击目标用户操作列的添加权限。
在搜索框中输入系统策略名称,勾选目标系统策略。OSS支持以下两种系统策略:
AliyunOSSFullAccess:拥有管理对象存储服务(OSS)的权限。
AliyunOSSReadOnlyAccess:拥有只读访问对象存储服务(OSS)的权限。
单击确认新增授权,完成权限设置。
授权自定义权限策略
自定义策略由用户自主创建和维护,授权自定义权限策略时,需先创建自定义权限策略,再为对应的用户身份进行授权。
步骤一:创建自定义权限策略
前往权限策略列表,单击创建权限策略。
选择脚本编辑,在编辑框内输入JSON格式的授权策略。可使用RAM Policy Editor快速生成授权策略。
示例授权策略:允许对
example-bucket及该Bucket内所有资源的全部操作。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "oss:*", "Resource": [ "acs:oss:*:*:example-bucket", "acs:oss:*:*:example-bucket/*" ] } ] }完整的授权策略包含Version(版本号)和Statement(授权语句)。
Version:权限策略版本,固定为
1,不允许修改。Statement:策略语句的主体,包含一条或多条具体的授权/拒绝规则。每条授权语句包含Effect(授权效力)、Action(授权操作)、Resource(授权资源)和Condition(授权条件)。
策略元素
说明
Effect
策略的效力,可选值为
Allow(允许)或Deny(拒绝)。Action
对资源执行的具体操作,支持使用通配符
*。Resource
策略作用的资源范围。
Condition
策略生效的条件。
当配置多个条件时,所有条件必须同时满足(AND关系),策略才会生效。
完整的授权元素列表请参见OSS授权语法与元素。
单击确定,输入策略名称,然后单击确定,完成自定义策略创建。
步骤二:为用户身份进行授权
创建自定义权限策略后,需要将自定义策略授权给目标用户身份。以下以RAM用户为例演示授权步骤。
前往RAM用户列表,单击目标用户操作列的添加权限。
在搜索框中输入自定义策略名称,勾选目标策略。
单击确认新增授权,完成权限设置。
常见授权场景
以下场景展示了RAM Policy在实际业务中的典型应用,涵盖权限授予、访问限制和安全控制等多种需求。每个场景提供完整的策略配置示例,可根据实际需求修改其中的Bucket名称、目录路径等参数后直接使用。
场景1:授予RAM用户对某个Bucket的完全控制权限
以下示例为授予RAM用户对名为mybucket的Bucket拥有完全控制的权限。
对于移动应用来说,授予用户对Bucket的完全控制权限存在极高风险,应尽量避免。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "oss:*",
"Resource": [
"acs:oss:*:*:mybucket",
"acs:oss:*:*:mybucket/*"
]
}
]
}场景2:禁止RAM用户删除某个Bucket下匹配特定模式文件的权限
以下示例为禁止RAM用户删除名为mybucket的Bucket下前缀为abc且格式为.txt的所有文件。
{
"Version": "1",
"Statement": [
{
"Effect": "Deny",
"Action": [
"oss:DeleteObject"
],
"Resource": [
"acs:oss:*:*:mybucket/abc*.txt"
]
}
]
}场景3:授予RAM用户列举并读取某个Bucket下所有资源的权限
以下示例为授予RAM用户通过OSS SDK或OSS命令行工具列举并读取名为
mybucket的Bucket下所有资源的权限。说明ListObjects操作(Action)必须以整个Bucket作为Resource。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "oss:ListObjects", "Resource": "acs:oss:*:*:mybucket" }, { "Effect": "Allow", "Action": "oss:GetObject", "Resource": "acs:oss:*:*:mybucket/*" } ] }以下示例为授予RAM用户通过OSS控制台列举并读取名为
mybucket的Bucket下所有资源的权限。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:ListBuckets", "oss:GetBucketStat", "oss:GetBucketInfo", "oss:GetBucketTagging", "oss:GetBucketLifecycle", "oss:GetBucketWorm", "oss:GetBucketVersioning", "oss:GetBucketAcl" ], "Resource": "acs:oss:*:*:*" }, { "Effect": "Allow", "Action": [ "oss:ListObjects", "oss:GetBucketAcl" ], "Resource": "acs:oss:*:*:mybucket" }, { "Effect": "Allow", "Action": [ "oss:GetObject", "oss:GetObjectAcl" ], "Resource": "acs:oss:*:*:mybucket/*" } ] }
场景4:禁止RAM用户删除某个Bucket的权限
以下示例用于禁止RAM用户删除名为mybucket的Bucket的权限。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "oss:*",
"Resource": [
"acs:oss:*:*:mybucket",
"acs:oss:*:*:mybucket/*"
]
},
{
"Effect": "Deny",
"Action": [
"oss:DeleteBucket"
],
"Resource": [
"acs:oss:*:*:mybucket"
]
}
]
}场景5:授予RAM用户访问某个Bucket下多个目录的权限
假设用于存放照片的Bucket为mybucket,该Bucket下有一些目录,代表照片的拍摄地,每个拍摄地目录下还包含年份子目录。
mybucket[Bucket]
├── beijing
│ ├── 2014
│ └── 2015
└── hangzhou
├── 2014
└── 2015 需要授予RAM用户访问mybucket/hangzhou/2014/和mybucket/hangzhou/2015/目录的只读权限。目录级别的授权属于授权的高级功能,根据使用场景不同,授权策略的复杂程度也不同,以下几种场景可供参考。
授予RAM用户仅拥有读取目录
mybucket/hangzhou/2014/和mybucket/hangzhou/2015/中文件内容的权限。由于RAM用户知道文件的完整路径,建议直接使用完整的文件路径来读取目录下的文件内容。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:GetObject" ], "Resource": [ "acs:oss:*:*:mybucket/hangzhou/2014/*", "acs:oss:*:*:mybucket/hangzhou/2015/*" ] } ] }授予RAM用户使用OSS命令行工具访问目录
mybucket/hangzhou/2014/和mybucket/hangzhou/2015/并列举目录中文件的权限。RAM用户不清楚目录中有哪些文件,可使用OSS命令行工具或API直接获取目录信息,此场景下需要添加
ListObjects权限。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:GetObject" ], "Resource": [ "acs:oss:*:*:mybucket/hangzhou/2014/*", "acs:oss:*:*:mybucket/hangzhou/2015/*" ] }, { "Effect": "Allow", "Action": [ "oss:ListObjects" ], "Resource": [ "acs:oss:*:*:mybucket" ], "Condition":{ "StringLike":{ "oss:Prefix": [ "hangzhou/2014/*", "hangzhou/2015/*" ] } } } ] }授予RAM用户使用OSS控制台访问目录的权限。
使用OSS控制台访问目录
mybucket/hangzhou/2014/和mybucket/hangzhou/2015/时,RAM用户可从根目录开始,逐层进入要访问的目录。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:ListBuckets", "oss:GetBucketStat", "oss:GetBucketInfo", "oss:GetBucketTagging", "oss:GetBucketLifecycle", "oss:GetBucketWorm", "oss:GetBucketVersioning", "oss:GetBucketAcl" ], "Resource": [ "acs:oss:*:*:*" ] }, { "Effect": "Allow", "Action": [ "oss:GetObject", "oss:GetObjectAcl" ], "Resource": [ "acs:oss:*:*:mybucket/hangzhou/2014/*", "acs:oss:*:*:mybucket/hangzhou/2015/*" ] }, { "Effect": "Allow", "Action": [ "oss:ListObjects" ], "Resource": [ "acs:oss:*:*:mybucket" ], "Condition": { "StringLike": { "oss:Delimiter": "/", "oss:Prefix": [ "", "hangzhou/", "hangzhou/2014/*", "hangzhou/2015/*" ] } } } ] }
场景6:禁止RAM用户删除某个Bucket下任意文件的权限
以下示例用于禁止RAM用户删除名为mybucket的存储空间下任意文件的权限。
{
"Version": "1",
"Statement": [
{
"Effect": "Deny",
"Action": [
"oss:DeleteObject"
],
"Resource": [
"acs:oss:*:*:mybucket/*"
]
}
]
}场景7:禁止RAM用户访问指定标签Object的权限
以下为添加Deny策略,用于禁止RAM用户访问存储空间examplebucket下对象标签为status:ok以及key1:value1的Object的权限。
{
"Version": "1",
"Statement": [
{
"Effect": "Deny",
"Action": [
"oss:GetObject"
],
"Resource": [
"acs:oss:*:174649585760xxxx:examplebucket/*"
],
"Condition": {
"StringEquals": {
"oss:ExistingObjectTag/status":"ok",
"oss:ExistingObjectTag/key1":"value1"
}
}
}
]
}场景8:授予RAM用户通过特定的IP地址访问OSS的权限
在
Allow授权中增加IP地址限制。以下示例为在
Allow授权中增加IP地址限制,授予RAM用户仅允许通过192.168.0.0/16和198.51.100.0/24两个IP地址段读取名为mybucket的Bucket下所有资源的权限。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:ListBuckets", "oss:GetBucketStat", "oss:GetBucketInfo", "oss:GetBucketTagging", "oss:GetBucketAcl" ], "Resource": [ "acs:oss:*:*:*" ] }, { "Effect": "Allow", "Action": [ "oss:ListObjects", "oss:GetObject" ], "Resource": [ "acs:oss:*:*:mybucket", "acs:oss:*:*:mybucket/*" ], "Condition":{ "IpAddress": { "acs:SourceIp": ["192.168.0.0/16", "198.51.100.0/24"] } } } ] }在
Deny授权中增加IP地址限制。以下示例为在
Deny授权中增加IP地址限制,禁止源IP地址不在192.168.0.0/16范围内的RAM用户对OSS执行任何操作。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:ListBuckets", "oss:GetBucketStat", "oss:GetBucketInfo", "oss:GetBucketTagging", "oss:GetBucketAcl" ], "Resource": [ "acs:oss:*:*:*" ] }, { "Effect": "Allow", "Action": [ "oss:ListObjects", "oss:GetObject" ], "Resource": [ "acs:oss:*:*:mybucket", "acs:oss:*:*:mybucket/*" ] }, { "Effect": "Deny", "Action": "oss:*", "Resource": [ "acs:oss:*:*:*" ], "Condition":{ "NotIpAddress": { "acs:SourceIp": ["192.168.0.0/16"] } } } ] }说明由于权限策略的鉴权规则是Deny优先,所以访问者从
192.168.0.0/16以外的IP地址访问mybucket中的内容时,OSS会提示没有权限。
场景9:通过RAM或STS服务向其他用户授权
通过RAM或STS服务授予IP地址为192.168.0.1的用户使用Java SDK客户端执行以下操作。
列举
mybucket中以foo为前缀的对象。允许向
mybucket中上传、下载和删除以file开头的对象。
{
"Version": "1",
"Statement": [
{
"Action": [
"oss:GetBucketAcl",
"oss:ListObjects"
],
"Resource": [
"acs:oss:*:177530505652xxxx:mybucket"
],
"Effect": "Allow",
"Condition": {
"StringEquals": {
"acs:UserAgent": "java-sdk",
"oss:Prefix": "foo"
},
"IpAddress": {
"acs:SourceIp": "192.168.0.1"
}
}
},
{
"Action": [
"oss:PutObject",
"oss:GetObject",
"oss:DeleteObject"
],
"Resource": [
"acs:oss:*:177530505652xxxx:mybucket/file*"
],
"Effect": "Allow",
"Condition": {
"StringEquals": {
"acs:UserAgent": "java-sdk"
},
"IpAddress": {
"acs:SourceIp": "192.168.0.1"
}
}
}
]
}场景10:禁止将 Bucket 和 Object 的 ACL 设置为公共访问
以下示例用于禁止将Bucket和Object的ACL设置为公共访问,保障OSS数据安全。
{
"Version": "1",
"Statement": [
{
"Effect": "Deny",
"Action": [
"oss:PutBucket",
"oss:PutBucketAcl"
],
"Resource": "*",
"Condition": {
"StringNotEquals": {
"oss:x-oss-acl": "private"
}
}
},
{
"Effect": "Deny",
"Action": [
"oss:PutObject",
"oss:PutObjectAcl"
],
"Resource": "*",
"Condition": {
"StringNotEquals": {
"oss:x-oss-object-acl": [
"private",
"default"
]
}
}
}
]
}场景11:授予RAM用户使用IMM相关功能的权限
以下RAM Policy用于授予RAM用户使用IMM文档处理的权限。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"oss:GetObject",
"oss:PutObject",
"oss:PostProcessTask",
"oss:ProcessImm"
],
"Resource": "*"
},
{
"Action": [
"imm:CreateOfficeConversionTask",
"imm:GetWebofficeURL"
],
"Resource": "*",
"Effect": "Allow"
},
{
"Effect": "Allow",
"Action": "ram:PassRole",
"Resource": "acs:ram:*:*:role/aliyunimmdefaultrole"
}
]
}场景12:授予RAM用户转换存储冗余类型的权限
授予RAM用户转换某个Bucket存储冗余类型的权限。
以下示例为RAM用户授予转换
mybucket的存储冗余类型的权限。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:CreateBucketDataRedundancyTransition", "oss:GetBucketDataRedundancyTransition", "oss:ListBucketDataRedundancyTransition", "oss:DeleteBucketDataRedundancyTransition" ], "Resource": "acs:oss:*:*:mybucket" } ] }授予RAM用户转换所有Bucket存储冗余类型的权限。
重要以下示例会授予RAM用户转换阿里云账号下所有Bucket的存储冗余类型的权限,请谨慎操作。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:CreateBucketDataRedundancyTransition", "oss:GetBucketDataRedundancyTransition", "oss:ListBucketDataRedundancyTransition", "oss:DeleteBucketDataRedundancyTransition" ], "Resource": "acs:oss:*:*:*" } ] }
场景13:授予RAM用户创建OSS资源包订单的权限
以下RAM Policy用于授予RAM用户创建OSS资源包订单的权限。
RAM用户创建OSS资源包订单后,可联系云账号拥有者完成订单支付。如果要使RAM用户能够完成OSS资源包订单支付,云账号拥有者需要授予RAM用户支付订单的权限bss:PayOrder。bss:PayOrder属于高危权限,涉及资金操作,非必要请勿授予。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "oss:CreateOrder",
"Resource": "acs:oss:*:*:*"
}
]
}场景14:授予RAM用户开通OSS的权限
以下RAM Policy用于授予RAM用户开通OSS的权限。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "oss:ActivateProduct",
"Resource": "acs:oss:*:*:*"
}
]
}场景15:授予RAM用户读写指定标签Bucket数据的权限
以下RAM Policy用于授予RAM用户读写指定标签Bucket数据的权限,标签键为key1,标签值为value1。
{
"Version": "1",
"Statement": [
{
"Action": [
"oss:ListBuckets",
"oss:GetBucketStat",
"oss:GetBucketInfo",
"oss:GetBucketAcl",
"oss:ListObjects",
"oss:PutObject",
"oss:GetObject"
],
"Resource": [
"acs:oss:*:*:*"
],
"Effect": "Allow",
"Condition": {
"StringEquals": {
"oss:BucketTag/key1": "value1"
}
}
}
]
}策略生效后,RAM用户仅能对带有标签key1=value1的OSS Bucket执行指定操作。不同访问方式的行为特性如下:
通过OSS SDK或ossutil发起
ListBuckets请求时,需添加标签过滤参数(如tag-key=key1,tag-value=value1)。策略配置正确时,返回结果仅包含符合指定标签条件的Bucket。通过OSS控制台发起
ListBuckets请求时,由于控制台无法附加标签参数,请求将因不满足策略条件限制(oss:BucketTag/key1=value1)而被拒绝,系统提示权限不足。其他操作(如
PutObject、GetObject等)同样受标签条件限制,操作的目标Bucket必须满足key1=value1的标签要求。
应用于生产环境
在配置RAM Policy和管理RAM身份时,遵循以下安全最佳实践,可有效降低数据泄露风险并确保权限管控的精确性:
遵循最小权限原则:始终只授予执行任务所必需的最小权限集。避免使用
oss:*这样宽泛的授权,除非绝对必要。通过最小权限原则可减少潜在的攻击面,降低权限滥用和误操作风险。使用RAM角色和STS临时凭证:对于应用程序,尤其是部署在ECS或容器中的应用,建议使用RAM角色并获取STS临时凭证来访问OSS。相比长期AccessKey,临时凭证具备自动过期机制,避免将长期AccessKey硬编码在代码或配置文件中,显著降低了AK泄露的风险。
人员用户与程序用户分离:为不同的人员和应用程序创建独立的RAM用户,实现身份管理的专业化和权限的精细控制。
人员用户:设置控制台访问,使用账号和密码访问云产品控制台,推荐开启MFA多因素认证。
程序用户:设置使用永久AccessKey访问,通过访问密钥调用API访问云资源。
AccessKey安全管理:
不要把RAM用户的AccessKey ID和AccessKey Secret保存在工程代码中,否则可能导致AK泄露。
建议使用STS或环境变量等方式获取访问授权。
定期轮换AccessKey。
RAM角色安全建议:
创建RAM角色后,请勿随意变更RAM角色的可信实体,避免影响业务或带来过度授权风险。
设置合理的STS Token有效期,避免有效期过长带来安全风险。
定期审计权限:定期检查并清理不再需要的RAM用户和权限策略,确保权限与当前业务需求保持一致。
利用Condition加强安全:在策略中添加
Condition,例如限制源IP或VPC,通过多维度条件约束为数据访问增加额外的安全防线。