Bucket Policy是OSS提供的一种针对存储空间(Bucket)的授权策略,使您可以精细化地授权或限制有身份的访问者(阿里云账号、RAM用户、RAM角色)或匿名访问者对指定OSS资源的访问。例如,您可以为其他阿里云账号的RAM用户授予指定OSS资源的只读权限。
通用说明
与RAM Policy不同的是,Bucket Policy还包含了用于指定允许或拒绝访问资源的主体元素Principal。使用Principal,您可以精细化地授权或限制不同访问者对指定OSS资源的访问。在不需要对访问者做个性化区分的情况下,通过一种集中式的方式管理权限,避免重复对每个访问者进行授权或限制。例如,通过在Principal输入多个RAM用户的UID,来匹配指定的RAM用户;通过在Principal中输入通配符星号(*),来匹配所有访问者。
注意事项
在Bucket Policy的策略语句中,如果Principal为通配符星号(*),且包含Condition,则策略语句会对包含Bucket Owner在内的所有访问者生效。即使是默认拥有所有访问权限的Bucket Owner,如果触发拒绝策略,其访问请求也会被拒绝。
在Bucket Policy的策略语句中,如果Principal为通配符星号(*),但不包含Condition,则策略语句只会对除Bucket Owner以外的所有访问者生效。对于默认拥有所有访问权限的Bucket Owner,不会触发拒绝策略,其访问请求不会被拒绝。
示例一:授予指定RAM用户读写权限
当您希望允许自己团队的指定成员或合作方的指定成员上传、下载、管理存储空间中的文件时,您可以通过Bucket Policy在存储空间级别直接为这些成员对应的RAM用户授予权限,而无需为每个RAM用户单独设置访问策略。以下示例用于授予指定RAM用户(UID为27737962156157xxxx
和20214760404935xxxx
)对目标存储空间(examplebucket
)的读写权限。
以下允许策略语句中,由于没有授予指定RAM用户列举存储空间的权限,因此指定RAM用户无法在阿里云控制台的Bucket列表页面查看所有的存储空间,找到目标的存储空间,然后点击进入。指定RAM用户可以通过添加收藏路径来访问目标存储空间,而无需拥有列举存储空间的权限。具体操作,请参见访问路径。
{
"Version":"1",
"Statement":[
{
"Effect":"Allow",
"Action":[
"oss:GetObject",
"oss:PutObject",
"oss:GetObjectAcl",
"oss:PutObjectAcl",
"oss:AbortMultipartUpload",
"oss:ListParts",
"oss:RestoreObject",
"oss:GetVodPlaylist",
"oss:PostVodPlaylist",
"oss:PublishRtmpStream",
"oss:ListObjectVersions",
"oss:GetObjectVersion",
"oss:GetObjectVersionAcl",
"oss:RestoreObjectVersion"
],
"Principal":[
"27737962156157xxxx",
"20214760404935xxxx"
],
"Resource":[
"acs:oss:*:174649585760xxxx:examplebucket/*"
]
},
{
"Effect":"Allow",
"Action":[
"oss:ListObjects"
],
"Principal":[
"27737962156157xxxx",
"20214760404935xxxx"
],
"Resource":[
"acs:oss:*:174649585760xxxx:examplebucket"
],
"Condition":{
"StringLike":{
"oss:Prefix":[
"*"
]
}
}
}
]
}
示例二:授予指定RAM用户对指定目录的只读权限
当您需要保护存储空间中的特定项目文件不被篡改,但又希望允许相关的项目成员列举和读取这些文件时,您可以只为项目成员对应的RAM用户授予列举和读取特定项目文件的权限。以下示例用于授予指定RAM用户(UID为20214760404935xxxx
)对目标存储空间(examplebucket
)下指定目录(前缀为hangzhou/2020
和shanghai/2015
)的只读权限。
以下允许策略语句中,由于没有授予指定RAM用户列举存储空间的权限,因此指定RAM用户无法在阿里云控制台的Bucket列表页面查看所有的存储空间,找到目标的存储空间,然后点击进入。指定RAM用户可以通过添加收藏路径来访问目标存储空间,而无需拥有列举存储空间的权限。具体操作,请参见访问路径。
{
"Version":"1",
"Statement":[
{
"Action":[
"oss:GetObject",
"oss:GetObjectAcl",
"oss:GetObjectVersion",
"oss:GetObjectVersionAcl"
],
"Effect":"Allow",
"Principal":[
"20214760404935xxxx"
],
"Resource":[
"acs:oss:*:174649585760xxxx:examplebucket/hangzhou/2020/*",
"acs:oss:*:174649585760xxxx:examplebucket/shanghai/2015/*"
]
},
{
"Action":[
"oss:ListObjects",
"oss:ListObjectVersions"
],
"Condition":{
"StringLike":{
"oss:Prefix":[
"hangzhou/2020/*",
"shanghai/2015/*"
]
}
},
"Effect":"Allow",
"Principal":[
"20214760404935xxxx"
],
"Resource":[
"acs:oss:*:174649585760xxxx:examplebucket"
]
}
]
}
示例三:授予所有访问者列举所有文件的权限
当您的存储空间用于公共资源共享,需要让所有访问者都能查看文件名但不能访问文件的实际内容时,您可以设置Principal为通配符星号(*),并为其授予列举所有文件的权限。以下示例用于授予所有访问者列举目标存储空间(examplebucket
)下所有文件的权限。
{
"Version":"1",
"Statement":[
{
"Action":[
"oss:ListObjects",
"oss:ListObjectVersions"
],
"Effect":"Allow",
"Principal":[
"*"
],
"Resource":[
"acs:oss:*:174649585760xxxx:examplebucket"
]
}
]
}
示例四:授予指定RAM用户查看存储空间并列举文件的权限
当您希望允许自己团队的指定成员或合作方的指定成员查看存储空间的所有信息并列举其中的文件时,您可以通过Bucket Policy在存储空间级别直接为这些成员对应的RAM用户授予权限,而无需为每个RAM用户单独设置访问策略。以下示例用于授予指定RAM用户查看目标存储空间(examplebucket
)的所有信息并列举其中的文件的权限。
以下允许策略语句中,由于没有授予指定RAM用户列举存储空间的权限,因此指定RAM用户无法在阿里云控制台的Bucket列表页面查看所有的存储空间,找到目标的存储空间,然后点击进入。指定RAM用户可以通过添加收藏路径来访问目标存储空间,而无需拥有列举存储空间的权限。具体操作,请参见访问路径。
{
"Version":"1",
"Statement":[
{
"Action":[
"oss:Get*",
"oss:ListObjects",
"oss:ListObjectVersions"
],
"Effect":"Allow",
"Principal":[
"20214760404935xxxx"
],
"Resource":[
"acs:oss:*:174649585760xxxx:examplebucket"
]
}
]
}
示例五:授予指定RAM角色读取文件的权限
当您需要允许RAM用户或应用程序临时访问您的存储空间文件时,可以创建一个RAM角色并授予相应权限。RAM用户或应用程序通过扮演该角色,便能够获得读取您存储空间文件的临时访问凭证。以下示例用于为一个阿里云账号下的1个RAM角色下的所有会话以及1个RAM角色下的指定会话授予读取存储空间(examplebucket
)下所有文件的权限。
BucketPolicy给角色授权的时候,Principal
需要遵循以下格式:arn:sts::<uid>:assumed-role/<role-name>/<session-name>
。其中,<role-name>
以及<session-name>
的值大小写敏感。
{
"Version": "1",
"Statement": [
{
"Action": [
"oss:GetObject"
],
"Effect": "Allow",
"Principal": [
"arn:sts::10323xxxxx72056:assumed-role/okrole/sessiontest",
"arn:sts::10323xxxxx72056:assumed-role/secondrole/*"
],
"Resource": [
"acs:oss:*:1032xxxxx672056:examplebucket/*"
]
}
]
}
示例六:限制只能从指定VPC访问
当您的存储空间需要限制只能从指定VPC访问时,您可以使用acs:SourceVpc
条件关键字创建一条拒绝策略语句并将其添加到Bucket Policy中,用于阻止来自其他VPC或公网的请求。对于来自其他VPC的请求,会被识别为不符合指定VPC ID条件,触发策略中的拒绝规则。对于来自公网的请求,由于从公网访问不包含VPC信息,因此也会被识别为不符合指定VPC ID条件,触发策略中的拒绝规则。以下示例用于拒绝除指定VPC(ID为t4nlw426y44rd3iq4xxxx
)以外的所有访问者对目标存储空间(examplebucket
)进行读取文件操作。
以下拒绝策略语句中,由于Principal为通配符星号(*),且包含Condition,因此该拒绝策略语句会对包含Bucket Owner在内的所有访问者生效。添加以下拒绝策略语句后,即使是默认拥有所有访问权限的Bucket Owner,如果不是从指定VPC访问,其访问请求也会被拒绝。
以下拒绝策略语句仅用于限制访问,而不会授予任何访问权限。如果授权主体没有被授予过访问权限,您可以添加一条允许策略语句来授予其访问权限。
{
"Version":"1",
"Statement":[
{
"Effect":"Deny",
"Action":[
"oss:GetObject"
],
"Principal":[
"*"
],
"Resource":[
"acs:oss:*:174649585760xxxx:examplebucket/*"
],
"Condition":{
"StringNotEquals":{
"acs:SourceVpc":[
"vpc-t4nlw426y44rd3iq4xxxx"
]
}
}
}
]
}
示例七:限制只能从指定公网IP地址访问
当您的存储空间需要限制只能从指定公网IP地址访问时,您可以使用acs:SourceIp
条件关键字创建一条拒绝策略语句并将其添加到Bucket Policy中,用于阻止来自其他公网IP地址或VPC的请求。对于来自其他公网IP地址的请求,会被识别为不符合指定IP条件,触发策略中的拒绝规则。对于来自VPC的请求,由于从VPC访问时使用私网IP地址,因此也会被识别为不符合指定IP地址条件,触发策略中的拒绝规则。以下示例用于拒绝除指定公网IP地址(IP地址为203.0.113.5
)以外的所有访问者对目标存储空间(examplebucket
)进行读取文件操作。
以下拒绝策略语句中,由于Principal为通配符星号(*),且包含Condition,因此该拒绝策略语句会对包含Bucket Owner在内的所有访问者生效。添加以下拒绝策略语句后,即使是默认拥有所有访问权限的Bucket Owner,如果不是从指定公网IP地址访问,其访问请求也会被拒绝。
以下拒绝策略语句仅用于限制访问,而不会授予任何访问权限。如果授权主体没有被授予过访问权限,您可以添加一条允许策略语句来授予其访问权限。
{
"Version":"1",
"Statement":[
{
"Effect":"Deny",
"Action":[
"oss:GetObject"
],
"Principal":[
"*"
],
"Resource":[
"acs:oss:*:174649585760xxxx:examplebucket/*"
],
"Condition":{
"NotIpAddress":{
"acs:SourceIp":[
"203.0.113.5"
]
}
}
}
]
}
示例八:限制只能从指定VPC的指定IP地址网段访问
当您的存储空间需要限制只能从指定VPC的指定IP地址访问时,您可以创建两条拒绝策略语句:
使用
acs:SourceVpc
条件关键字创建一条拒绝策略语句,用于阻止来自其他VPC或公网的请求。对于来自其他VPC的请求,会被识别为不符合指定VPC ID条件,触发策略中的拒绝规则。对于来自公网的请求,由于公网访问不包含VPC信息,因此也会被识别为不符合指定VPC ID条件,触发策略中的拒绝规则。使用
acs:SourceIp
条件关键字和acs:SourceVpc
条件关键字创建一条拒绝策略语句,用于阻止指定VPC网段之外的请求。
将以上两条拒绝策略语句添加到Bucket Policy后,两者之间的逻辑关系为或,即满足任一条件就会触发拒绝。以下示例用于拒绝除指定VPC(ID为t4nlw426y44rd3iq4xxxx
)的指定IP地址网段(IP地址网段为192.168.0.0/16
)以外的所有访问者对目标存储空间(examplebucket
)进行读取文件操作。
以下拒绝策略语句中,由于Principal为通配符星号(*),且包含Condition,因此该拒绝策略语句会对包含Bucket Owner在内的所有访问者生效。添加以下拒绝策略语句后,即使是默认拥有所有访问权限的Bucket Owner,如果不是从指定VPC的指定IP地址网段访问,其访问请求也会被拒绝。
以下拒绝策略语句仅用于限制访问,而不会授予任何访问权限。如果授权主体没有被授予过访问权限,您可以添加一条允许策略语句来授予其访问权限。
{
"Version":"1",
"Statement":[
{
"Effect":"Deny",
"Action":[
"oss:GetObject"
],
"Principal":[
"*"
],
"Resource":[
"acs:oss:*:174649585760xxxx:examplebucket/*"
],
"Condition":{
"StringNotEquals":{
"acs:SourceVpc":[
"vpc-t4nlw426y44rd3iq4xxxx"
]
}
}
},
{
"Effect":"Deny",
"Action":[
"oss:GetObject"
],
"Principal":[
"*"
],
"Resource":[
"acs:oss:*:174649585760xxxx:examplebucket/*"
],
"Condition":{
"StringEquals":{
"acs:SourceVpc":[
"vpc-t4nlw426y44rd3iq4xxxx"
]
},
"NotIpAddress":{
"acs:SourceIp":[
"192.168.0.0/16"
]
}
}
}
]
}
示例九:限制只能从指定公网IP地址或指定VPC访问
当您的存储空间需要限制只能从指定公网IP地址或指定VPC访问时,您可以创建两条拒绝策略语句:
使用
acs:SourceIp
条件关键字创建一条拒绝策略语句,用于阻止来自其他公网IP地址的请求。由于来自指定VPC的请求也存在IP地址,在阻止来自其他公网IP地址的请求时,还需要使用StringNotLike
条件操作和acs:SourceVpc
条件关键字来排除这些请求,以避免触发不满足指定IP地址条件而被错误拒绝。使用
acs:SourceVpc
条件关键字创建一条拒绝策略语句,用于阻止来自其他VPC的请求。由于来自指定公网IP地址的请求不包含VPC信息,也会被识别为不符合指定VPC ID条件,在阻止来自其他VPC的请求时,还需要使用StringLike
条件操作和acs:SourceVpc
关键字来排除这些请求,以避免触发不满足指定VPC ID条件而被错误拒绝。
将以上两条拒绝策略语句添加到Bucket Policy后,两者之间的逻辑关系为或,即满足任一条件就会触发拒绝。以下示例用于拒绝除指定公网IP地址(IP地址为203.0.113.5
)或指定VPC(ID为t4nlw426y44rd3iq4xxxx
)以外的所有访问者执行对目标存储空间(examplebucket
)进行读取文件操作。
以下拒绝策略语句中,由于Principal为通配符星号(*),且包含Condition,因此该拒绝策略语句会对包含Bucket Owner在内的所有访问者生效。添加以下拒绝策略语句后,即使是默认拥有所有访问权限的Bucket Owner,如果不是从指定的公网IP地址或指定VPC访问,其访问请求也会被拒绝。
以下拒绝策略语句仅用于限制访问,而不会授予任何访问权限。如果授权主体没有被授予过访问权限,您可以添加一条允许策略语句来授予其访问权限。
{
"Version":"1",
"Statement":[
{
"Effect":"Deny",
"Action":[
"oss:GetObject"
],
"Principal":[
"*"
],
"Resource":[
"acs:oss:*:174649585760xxxx:examplebucket/*"
],
"Condition":{
"StringNotLike":{
"acs:SourceVpc":[
"vpc-*"
]
},
"NotIpAddress":{
"acs:SourceIp":[
"203.0.113.5"
]
}
}
},
{
"Effect":"Deny",
"Action":[
"oss:GetObject"
],
"Principal":[
"*"
],
"Resource":[
"acs:oss:*:174649585760xxxx:examplebucket/*"
],
"Condition":{
"StringLike":{
"acs:SourceVpc":[
"vpc-*"
]
},
"StringNotEquals":{
"acs:SourceVpc":[
"vpc-t4nlw426y44rd3iq4xxxx"
]
}
}
}
]
}
示例十:限制API调用方式必须为临时访问凭证
当您希望通过调用API的方式来访问存储空间的资源时,需要限制API调用方式必须是临时访问凭证,您可以使用acs:AccessId
条件关键字创建一条拒绝策略语句并将其添加到Bucket Policy中,用于阻止其他非临时访问凭证(例如通过阿里云账号或者RAM用户的长期访问密钥)的访问方式。对于通过非临时访问凭证的访问方式,会触发策略中的拒绝规则。以下示例用于拒绝除临时访问凭证(以TMP.或者STS.开头的)以外的所有访问者查看目标存储空间(examplebucket
)以及列举文件的操作。
{
"Version": "1",
"Statement": [
{
"Effect": "Deny",
"Action":[
"oss:Get*",
"oss:ListObjects",
"oss:ListObjectVersions"
],
"Principal":[
"*"
],
"Resource":[
"acs:oss:*:174649585760xxxx:examplebucket/*"
],
"Condition": {
"StringNotLike": {
"acs:AccessId": [
"TMP.*",
"STS.*"
]
}
}
}
]
}
相关文档
关于Bucket Policy的元素说明,请参见RAM Policy。
关于Bucket Policy的配置步骤,请参见Bucket Policy。
关于Bucket Policy的鉴权过程,请参见OSS鉴权详解。