全部產品
Search
文件中心

Object Storage Service:AP Policy與Bucket Policy以及RAM Policy的制約關係

更新時間:Nov 26, 2024

本文介紹當您需要通過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)指定路徑finance/下的資源執行任意操作的許可權

Bucket Policy

通過Bucket Policy允許阿里雲帳號(UID為137xxxx)下的RAM使用者(UID為205xxxx)對Bucket(example-ap-bucket-001)指定路徑finance/下的資源執行任意操作的許可權。

{
    "Version": "1",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "oss:*"
            ],
            "Principal": [
                "205xxxx"
            ],
            "Resource": [
                "acs:oss:*:137xxxx:example-ap-bucket-001/finance/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "oss:ListObjects",
                "oss:GetObject"
            ],
            "Principal": [
                "205xxxx"
            ],
            "Resource": [
                "acs:oss:*:137xxxx:example-ap-bucket-001"
            ],
            "Condition": {
                "StringLike": {
                    "oss:Prefix": [
                        "finance/*"
                    ]
                }
            }
        }
    ]
}

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)授予AdministratorAccess許可權。

{
    "Statement": [
        {
            "Action": "*",
            "Effect": "Allow",
            "Resource": "*"
        }
    ],
    "Version": "1"
}

Allow

阿里雲帳號(UID為137xxxx)下的RAM使用者(UID為266xxxx)擁有對Bucket(example-ap-bucket-001)指定路徑finance/下的資源執行任意操作的許可權

Bucket Policy

通過Bucket Policy允許當前阿里雲帳號(UID為137xxxx)所有RAM使用者對Bucket(example-ap-bucket-001)指定路徑finance/下的資源執行任意操作。

{
    "Version": "1",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "oss:*"
            ],
            "Principal": [
                "*"
            ],
            "Resource": [
                "acs:oss:*:137xxxx:example-ap-bucket-001/finance/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "oss:ListObjects",
                "oss:GetObject"
            ],
            "Principal": [
                "*"
            ],
            "Resource": [
                "acs:oss:*:137xxxx:example-ap-bucket-001"
            ],
            "Condition": {
                "StringLike": {
                    "oss:Prefix": [
                        "finance/*"
                    ]
                }
            }
        }
    ]
}

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'}}

相關文檔