本文介紹當您需要通過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'}}