本文介绍当您需要通过AP(接入点)对OSS执行相关操作时,AP Policy、RAM Policy、Bucket Policy之间需要满足的条件。
权限策略之间的制约关系
从以下表格得知,只有同时满足以下两个条件,才能通过接入点对OSS执行相关操作。
RAM Policy和Bucket Policy的合并结果判定为Allow
AP Policy判定结果为Allow
Input Result (RAM Policy和Bucket Policy的合并结果) | Ap Policy Result | Output Result |
Allow | Allow | Allow |
Allow | Deny | Deny |
Allow | Ignore | Ignore |
Deny | Allow | Deny |
Deny | Deny | Deny |
Deny | Ignore | Deny |
Ignore | Allow | Ignore |
Ignore | Deny | Deny |
Ignore | Ignore | Ignore |
判定结果说明如下表所示。
判定结果 | 说明 |
Allow(允许) | 如果访问请求命中了权限策略中的Allow语句,且没有命中Deny语句,那么本次判定结果是Allow(允许)。 |
Deny(显式拒绝) | 一旦访问请求命中了权限策略中的Deny语句,那么本次判定结果是Deny。即使访问请求同时命中了Allow语句,但遵循Deny优先原则,Deny语句优先级高于Allow语句,判定结果仍为显式拒绝。 |
Ignore(隐式拒绝) | 如果访问请求既没有命中权限策略中的Allow语句,也没有命中Deny语句,那么本次判定结果是Ignore(隐式拒绝)。RAM身份默认没有执行任何操作的权限,没有被显式允许执行的操作都会被隐式拒绝。 |
验证示例
示例一
Input Result (RAM Policy和Bucket Policy的合并结果) | Ap Policy Result | Output Result |
Allow | Allow | Allow |
RAM Policy和Bucket Policy
权限策略 | 示例 | Input Result |
RAM Policy | 置空 | Allow 阿里云账号(UID为137xxxx)下的RAM用户(UID为205xxxx)拥有对Bucket(example-ap-bucket-001)指定路径 |
Bucket Policy | 通过Bucket Policy允许阿里云账号(UID为137xxxx)下的RAM用户(UID为205xxxx)对Bucket(example-ap-bucket-001)指定路径
|
AP Policy
通过以下AP Policy允许RAM用户(UID为205xxxx)对AP关联Bucket指定路径finance/
下的资源执行任意操作。
{
"Version":"1",
"Statement":[
{
"Effect":"Allow",
"Action":[
"oss:*"
],
"Principal":[
"205xxxx"
],
"Resource":[
"acs:oss:cn-hangzhou:137xxxx:accesspoint/example-ap-001/object/finance/*"
]
},
{
"Effect":"Allow",
"Action":[
"oss:ListObjects",
"oss:GetObject"
],
"Principal":[
"205xxxx"
],
"Resource":[
"acs:oss:cn-hangzhou:137xxxx:accesspoint/example-ap-001"
],
"Condition":{
"StringLike":{
"oss:Prefix":[
"finance/*"
]
}
}
}
]
}
AP Policy授权的RAM用户通过接入点上传文件
AP Policy授权的RAM用户(UID为205xxxx)通过接入点上传文件至AP Policy指定路径finance/
。
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 从环境变量中获取访问凭证。运行本代码示例之前,请通过环境变量配置RAM用户的AccessKey。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填写接入点别名。
bucket_name = "example-ap-001-14****-ossalias"
# 填写Endpoint对应的Region信息,例如cn-hangzhou。
region = "cn-hangzhou"
bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)
# 上传文件到AP Policy指定路径下。
result = bucket.put_object('finance/exampleobject.txt', 'Hello OSS')
# HTTP返回码。
print('http status: {0}'.format(result.status))
# 请求ID。请求ID是本次请求的唯一标识,强烈建议在程序日志中添加此参数。
print('request_id: {0}'.format(result.request_id))
# ETag是put_object方法返回值特有的属性,用于标识一个Object的内容。
print('ETag: {0}'.format(result.etag))
# HTTP响应头部。
print('date: {0}'.format(result.headers['date']))
返回结果表明AP Policy授权的用户可以通过接入点上传文件到AP Policy指定路径。
http status: 200
request_id: 673AACB3478AB335343C****
ETag: F0F18C2C66AE1DD512BDCD4366F7****
date: Mon, 18 Nov 2024 02:55:47 GMT
示例二
Input Result (RAM Policy和Bucket Policy的合并结果) | Ap Policy Result | Output Result |
Allow | Ignore | Ignore |
RAM Policy和Bucket Policy
权限策略 | 示例 | Input Result |
RAM Policy | 为阿里云账号(UID为137xxxx)下的某个RAM用户(UID为266xxxx)授予
| Allow 阿里云账号(UID为137xxxx)下的RAM用户(UID为266xxxx)拥有对Bucket(example-ap-bucket-001)指定路径 |
Bucket Policy | 通过Bucket Policy允许当前阿里云账号(UID为137xxxx)所有RAM用户对Bucket(example-ap-bucket-001)指定路径
|
AP Policy
通过以下AP Policy允许RAM用户(UID为205xxxx)对AP关联Bucket指定路径finance/
下的资源执行任意操作。
{
"Version":"1",
"Statement":[
{
"Effect":"Allow",
"Action":[
"oss:*"
],
"Principal":[
"205xxxx"
],
"Resource":[
"acs:oss:cn-hangzhou:137xxxx:accesspoint/example-ap-001/object/finance/*"
]
},
{
"Effect":"Allow",
"Action":[
"oss:ListObjects",
"oss:GetObject"
],
"Principal":[
"205xxxx"
],
"Resource":[
"acs:oss:cn-hangzhou:137xxxx:accesspoint/example-ap-001"
],
"Condition":{
"StringLike":{
"oss:Prefix":[
"finance/*"
]
}
}
}
]
}
非AP Policy授权的RAM用户通过接入点上传文件
非AP Policy授权的RAM用户(UID为266xxxx)通过接入点上传文件至AP Policy指定路径finance/
。
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 从环境变量中获取访问凭证。运行本代码示例之前,请通过环境变量配置RAM用户的AccessKey。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填写接入点别名。
bucket_name = "example-ap-001-14****-ossalias"
# 填写Endpoint对应的Region信息,例如cn-hangzhou。
region = "cn-hangzhou"
bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)
# 上传文件到AP Policy指定路径。
result = bucket.put_object('finance/exampleobject.txt', 'Hello OSS')
# HTTP返回码。
print('http status: {0}'.format(result.status))
# 请求ID。请求ID是本次请求的唯一标识,强烈建议在程序日志中添加此参数。
print('request_id: {0}'.format(result.request_id))
# ETag是put_object方法返回值特有的属性,用于标识一个Object的内容。
print('ETag: {0}'.format(result.etag))
# HTTP响应头部。
print('date: {0}'.format(result.headers['date']))
返回结果表明非AP Policy授权的RAM用户无法通过AP接入点上传文件到AP Policy指定路径。
oss2.exceptions.AccessDenied: {'status': 403, 'x-oss-request-id': '673C375AECB4DB373307****',
'details': {'Code': 'AccessDenied',
'Message': 'You have no right to access this object because of bucket acl.',
'RequestId': '673C375AECB4DB373307****',
'HostId': 'example-ap-001-14****-ossalias.oss-cn-hangzhou.aliyuncs.com',
'EC': '0003-00000001', 'RecommendDoc': 'https://api.aliyun.com/troubleshoot?q=0003-00000001'}}