存取點(Access Point)為儲存空間(Bucket)提供獨立的訪問入口。當一個Bucket需要被多個應用或團隊以不同許可權訪問時,可為每個訪問方建立獨立的存取點,通過存取點策略(AP Policy)分別管理各自的許可權,避免在單一Bucket Policy中維護複雜的許可權規則。
工作原理
存取點是Bucket的訪問代理層。建立存取點後,OSS會產生一個唯一的存取點別名,使用者使用該別名替代Bucket名稱發起請求。每個存取點可配置獨立的AP Policy(定義可執行檔操作、可訪問的資源和允許的身份)和網路來源(互連網或僅限指定VPC),實現基於業務情境的隔離訪問。
使用者通過存取點訪問時,系統會綜合評估RAM Policy、Bucket Policy和AP Policy三層策略,只有當RAM Policy與Bucket Policy的組合判定結果為Allow,且AP Policy也為Allow時,請求才會被允許。權限原則的詳細判定邏輯請參見許可權判定邏輯。
存取點預設無法訪問Bucket資源,需要先在Bucket Policy中配置許可權委派(通過oss:DataAccessPointArn、oss:DataAccessPointAccount或oss:AccessPointNetworkOrigin條件鍵),明確授權特定存取點訪問該Bucket。
快速使用
接下來將通過建立存取點、配置許可權委派和使用存取點訪問三個步驟,指導快速上手使用存取點功能。
步驟一:建立存取點
建立存取點並配置存取點策略,定義“哪些身份”、“在什麼條件下”,可以通過存取點“對哪些OSS資源”、“執行何種操作”。
-
前往存取點列表,單擊建立存取點。
-
輸入存取點名稱,選擇關聯的Bucket和網路來源,單擊下一步。
說明-
網路來源選擇VPC時,需要輸入VPC ID,可前往VPC控制台擷取。
-
輸入的VPC地區必須與OSS支援的網關終端節點地區保持一致,地區不匹配將導致鑒權請求無法正確關聯到指定VPC,從而引發鑒權失敗。
-
-
關閉阻止公用訪問選項,並配置存取點策略。
按圖形策略添加
配置項
說明
授權資源
選擇授權對象是整個Bucket還是指定資源。
資源路徑
-
授權資源選擇整個Bucket時,資源路徑為
accesspoint/{存取點名稱}/*。 -
授權資源選擇指定資源時,填寫待授權資源的目錄或單個Object,支援添加多條記錄。
授權用戶
指定被授權對象。
-
子帳號:選擇當前阿里雲帳號下的RAM使用者。
當前登入帳號必須是阿里雲主帳號或擁有此Bucket系統管理權限及RAM控制台
ListUsers許可權的RAM使用者,否則無法查看當前帳號的RAM使用者列表。 -
其他帳號:填寫其他待授權帳號、子帳號的UID或以
arn:sts開頭的臨時授權使用者(如arn:sts::1798************:assumed-role/role-name/session-name)。支援授權給多個使用者,一行填寫一個。
授權操作
-
簡單設定:選擇常見的授權操作組合,可選設定項包括唯讀(不包含ListObject操作)、唯讀(包含ListObject操作)、讀/寫、完全控制、拒絕訪問。
-
進階設定:自訂授權效力(允許或拒絕)和授權操作。
按文法策略添加
在編輯框內輸入JSON格式的授權策略。
樣本授權策略:授予使用者
20816353761158****讀/寫入權限。{ "Version": "1", "Statement": [{ "Effect": "Allow", "Action": [ "oss:GetObject", "oss:PutObject", "oss:GetObjectAcl", "oss:PutObjectAcl", "oss:ListObjects", "oss:AbortMultipartUpload", "oss:ListParts", "oss:RestoreObject", "oss:ListObjectVersions", "oss:GetObjectVersion", "oss:GetObjectVersionAcl", "oss:RestoreObjectVersion" ], "Principal": [ "20816353761158****" ], "Resource": [ "acs:oss:{region-id}:179882766168****:accesspoint/{ap-name}/object/*" ] }, { "Effect": "Allow", "Action": [ "oss:ListObjects", "oss:GetObject" ], "Principal": [ "20816353761158****" ], "Resource": [ "acs:oss:{region-id}:179882766168****:accesspoint/{ap-name}" ], "Condition": { "StringLike": { "oss:Prefix": [ "*" ] } } }] }完整的授權策略包含Version(版本號碼)和Statement(授權語句)。
-
Version:權限原則版本,固定為
1,不允許修改。 -
Statement:策略語句的主體,包含一條或多條具體的授權/拒絕規則。每條授權語句包含Effect(授權效力)、Action(授權操作)、Principal(授權主體)、Resource(授權資源)和Condition(授權條件)。
策略元素
說明
Effect
策略的效力,可選值為
Allow(允許)或Deny(拒絕)。Action
對資源執行的具體操作,支援使用萬用字元
*。Principal
策略作用的主體(使用者、帳號、角色等)。
Resource
策略作用的資源範圍。
Condition
策略生效的條件。
當配置多個條件時,所有條件必須同時滿足(AND關係),策略才會生效。
完整的授權元素列表請參見授權文法與元素。
-
-
單擊提交,等待存取點建立完成。
步驟二:存取點許可權委派
建立存取點後,還需要通過Bucket Policy設定存取點許可權委派,即定義哪些存取點能夠訪問Bucket。存取點許可權委派提供三種類型:
-
oss:DataAccessPointArn:指定存取點的存取權限委派。 -
oss:DataAccessPointAccount:當前主帳號下所有存取點的存取權限委派。 -
oss:AccessPointNetworkOrigin:指定網路來源的所有存取點存取權限委派。
指定存取點許可權委派
-
前往Bucket列表,單擊目標Bucket。
-
在左側功能表列單擊,選擇按文法策略添加。
-
單擊編輯,在編輯框內輸入JSON格式的授權策略。
說明配置時請替換樣本內的UID、Bucket名稱、地區ID和存取點名稱。如果原來的Bucket Policy不為空白,請在原有的Bucket Policy中追加
Statement元素。{ "Version": "1", "Statement": [{ "Effect": "Allow", "Action": [ "oss:*" ], "Principal": [ "*" ], "Resource": [ "acs:oss:*:179882766168****:example-bucket", "acs:oss:*:179882766168****:example-bucket/*" ], "Condition": { "StringEquals": { "oss:DataAccessPointArn": [ "acs:oss:oss-{region-id}:179882766168****:accesspoint/{ap-name}" ] } } }] } -
單擊儲存,完成Bucket Policy配置。
所有存取點許可權委派
-
前往Bucket列表,單擊目標Bucket。
-
在左側功能表列單擊,選擇按文法策略添加。
-
單擊編輯,在編輯框內輸入JSON格式的授權策略。
說明配置時請替換樣本內的UID和Bucket名稱。如果原有的Bucket Policy不為空白,請在原有的Bucket Policy中追加
Statement元素。{ "Version": "1", "Statement": [{ "Effect": "Allow", "Action": [ "oss:*" ], "Principal": [ "*" ], "Resource": [ "acs:oss:*:179882766168****:example-bucket", "acs:oss:*:179882766168****:example-bucket/*" ], "Condition": { "StringEquals": { "oss:DataAccessPointAccount": [ "179882766168****" ] } } }] } -
單擊儲存,完成Bucket Policy配置。
指定網路來源許可權委派
-
前往Bucket列表,單擊目標Bucket。
-
在左側功能表列單擊,選擇按文法策略添加。
-
單擊編輯,在編輯框內輸入JSON格式的授權策略。
說明-
配置時需替換樣本中的UID和Bucket名稱。若原有Bucket Policy已包含內容,需在現有策略的
Statement數組中追加新元素。 -
當
oss:AccessPointNetworkOrigin設定為internet時,委派所有網路來源為互連網的存取點,此配置同時允許外網和VPC訪問。如需限制僅允許VPC訪問,需將該值修改為vpc。
{ "Version": "1", "Statement": [{ "Effect": "Allow", "Action": [ "oss:*" ], "Principal": [ "*" ], "Resource": [ "acs:oss:*:179882766168****:example-bucket", "acs:oss:*:179882766168****:example-bucket/*" ], "Condition": { "StringEquals": { "oss:AccessPointNetworkOrigin": [ "internet" ] } } }] } -
-
單擊儲存,完成Bucket Policy配置。
如果提示“Bucket Policy 中包含公用訪問語義”,請先關閉Bucket的阻止公用訪問選項,再進行存取點許可權委派。
步驟三:使用存取點訪問
建立存取點後,OSS會自動產生存取點別名。使用被授權的身份(如RAM使用者)通過該別名即可訪問對應的OSS資源。
SDK
目前僅Java SDK和Python SDK支援通過存取點別名訪問OSS資源。
import com.aliyun.sdk.service.oss2.OSSClient;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProvider;
import com.aliyun.sdk.service.oss2.credentials.StaticCredentialsProvider;
import com.aliyun.sdk.service.oss2.models.GetObjectRequest;
import java.io.File;
/**
* OSS Java SDK V2 樣本:使用存取點下載對象到本地檔案
*/
public class DownloadObjectWithAccessPoint {
public static void main(String[] args) {
// 建立OSS用戶端
String accessKeyId = System.getenv("OSS_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("OSS_ACCESS_KEY_SECRET");
CredentialsProvider provider = new StaticCredentialsProvider(accessKeyId, accessKeySecret);
OSSClient client = OSSClient.newBuilder()
.credentialsProvider(provider)
.region("<region-id>")
.build();
// 使用存取點別名下載對象到本地檔案
String bucket = "example-ap-b156d01070a10322664d6704cd1d47****-ossalias";
String key = "example.jpg";
File file = new File("example.jpg");
client.getObjectToFile(GetObjectRequest.newBuilder()
.bucket(bucket)
.key(key)
.build(), file);
System.out.println("檔案下載完成: " + key + " -> " + file.getPath());
// 關閉用戶端
try {
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""OSS Python SDK V2 樣本:使用存取點下載對象到本地檔案"""
import alibabacloud_oss_v2 as oss
def main() -> None:
"""主函數"""
# 建立OSS用戶端
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
config = oss.config.load_default()
config.credentials_provider = credentials_provider
config.region = "<region-id>"
config.endpoint = "oss-<region-id>.aliyuncs.com"
client = oss.Client(config)
# 使用存取點別名下載對象到本地檔案
bucket = "example-ap-b156d01070a10322664d6704cd1d47****-ossalias"
key = "example.jpg"
file_path = "example.jpg"
request = oss.GetObjectRequest(bucket, key)
client.get_object_to_file(request, file_path)
print(f"檔案下載完成: {key} -> {file_path}")
if __name__ == "__main__":
main()
ossutil
使用ossutil訪問OSS資源時,將存取點別名作為Bucket名稱。
ossutil cp oss://example-ap-b156d01070a10322664d6704cd1d47****-ossalias/example.jpg /tmp
REST API
使用REST API訪問OSS資源時,需要在Host中使用存取點別名。樣本如下:
GET /ObjectName HTTP/1.1
Host: example-ap-b156d01070a10322664d6704cd1d47****-ossalias.oss-{region-id}.aliyuncs.com
Date: GMT Date
Authorization: SignatureValue
您可以使用curl命令快速驗證存取點的連通性和許可權配置:
curl -v \
-H "Date: <GMT時間>" \
-H "Authorization: OSS <AccessKeyId>:<Signature>" \
"https://<存取點別名>.oss-<region-id>.oss-accesspoint.aliyuncs.com/<ObjectName>" \
-o <本地檔案路徑>
情境樣本
以下樣本展示了如何為巨量資料分析情境設計存取點方案,通過細粒度許可權控制實現多部門安全隔離訪問。
情境描述
某公司(阿里雲帳號UID為137918634953****)將統一採集的資料存放在儲存空間examplebucket中,該Bucket需要被10個不同業務部門訪問,具體需求如下:
|
部門 |
存取範圍 |
許可權要求 |
網路來源 |
|
部門1~3 |
|
唯讀 |
互連網 |
|
部門4 |
整個Bucket |
讀寫 |
互連網 |
|
部門5~10 |
|
讀寫 |
僅VPC |
方案設計
基於業務隔離和安全邊界需求,設計3個存取點分別對應不同的訪問情境,通過存取點策略實現精確的許可權控制和網路訪問限制。
|
存取點 |
名稱 |
網路來源 |
授權使用者 |
授權資源 |
許可權 |
|
存取點1 |
|
互連網 |
部門1~3的RAM使用者(UID: |
|
唯讀 |
|
存取點2 |
|
互連網 |
部門4的RAM使用者(UID: |
|
讀寫 |
|
存取點3 |
|
VPC |
部門5~10的RAM使用者(UID: |
|
讀寫 |
AP Policy配置
ap-01(部門1~3隻讀訪問)
{
"Version": "1",
"Statement": [{
"Effect": "Allow",
"Action": [
"oss:GetObject",
"oss:GetObjectAcl",
"oss:ListObjects",
"oss:RestoreObject",
"oss:ListObjectVersions",
"oss:GetObjectVersion",
"oss:GetObjectVersionAcl",
"oss:RestoreObjectVersion"
],
"Principal": [
"26571698800555****"
],
"Resource": [
"acs:oss:{region-id}:137918634953****:accesspoint/ap-01/object/dir1/*"
]
},{
"Effect": "Allow",
"Action": [
"oss:ListObjects",
"oss:GetObject"
],
"Principal": [
"26571698800555****"
],
"Resource": [
"acs:oss:{region-id}:137918634953****:accesspoint/ap-01"
],
"Condition": {
"StringLike": {
"oss:Prefix": [
"dir1/*"
]
}
}
}]
}
ap-02(部門4讀寫整個Bucket)
{
"Version": "1",
"Statement": [{
"Effect": "Allow",
"Action": [
"oss:GetObject",
"oss:PutObject",
"oss:GetObjectAcl",
"oss:PutObjectAcl",
"oss:ListObjects",
"oss:AbortMultipartUpload",
"oss:ListParts",
"oss:RestoreObject",
"oss:ListObjectVersions",
"oss:GetObjectVersion",
"oss:GetObjectVersionAcl",
"oss:RestoreObjectVersion"
],
"Principal": [
"25770968794578****"
],
"Resource": [
"acs:oss:{region-id}:137918634953****:accesspoint/ap-02/object/*"
]
},{
"Effect": "Allow",
"Action": [
"oss:ListObjects",
"oss:GetObject"
],
"Principal": [
"25770968794578****"
],
"Resource": [
"acs:oss:{region-id}:137918634953****:accesspoint/ap-02"
],
"Condition": {
"StringLike": {
"oss:Prefix": [
"*"
]
}
}
}]
}
ap-03(部門5~10通過VPC讀寫)
{
"Version": "1",
"Statement": [{
"Effect": "Allow",
"Action": [
"oss:GetObject",
"oss:PutObject",
"oss:GetObjectAcl",
"oss:PutObjectAcl",
"oss:ListObjects",
"oss:AbortMultipartUpload",
"oss:ListParts",
"oss:RestoreObject",
"oss:ListObjectVersions",
"oss:GetObjectVersion",
"oss:GetObjectVersionAcl",
"oss:RestoreObjectVersion"
],
"Principal": [
"26806658794579****"
],
"Resource": [
"acs:oss:{region-id}:137918634953****:accesspoint/ap-03/object/dir2/*"
]
},{
"Effect": "Allow",
"Action": [
"oss:ListObjects",
"oss:GetObject"
],
"Principal": [
"26806658794579****"
],
"Resource": [
"acs:oss:{region-id}:137918634953****:accesspoint/ap-03"
],
"Condition": {
"StringLike": {
"oss:Prefix": [
"dir2/*"
]
}
}
}]
}
Bucket Policy許可權委派
由於該情境涉及同一帳號下的多個存取點,建議使用oss:DataAccessPointAccount進行統一委派,簡化Bucket Policy配置。如需更精細的控制,也可使用oss:DataAccessPointArn為每個存取點單獨委派。
統一委派
{
"Version": "1",
"Statement": [{
"Effect": "Allow",
"Action": [
"oss:*"
],
"Principal": [
"*"
],
"Resource": [
"acs:oss:*:137918634953****:examplebucket",
"acs:oss:*:137918634953****:examplebucket/*"
],
"Condition": {
"StringEquals": {
"oss:DataAccessPointAccount": [
"137918634953****"
]
}
}
}]
}
單獨委派
{
"Version": "1",
"Statement": [{
"Effect": "Allow",
"Action": [
"oss:*"
],
"Principal": [
"*"
],
"Resource": [
"acs:oss:*:137918634953****:examplebucket",
"acs:oss:*:137918634953****:examplebucket/*"
],
"Condition": {
"StringEquals": {
"oss:DataAccessPointArn": [
"acs:oss:oss-{region-id}:137918634953****:accesspoint/ap-01",
"acs:oss:oss-{region-id}:137918634953****:accesspoint/ap-02",
"acs:oss:oss-{region-id}:137918634953****:accesspoint/ap-03"
]
}
}
}]
}
許可權判定邏輯
|
RAM Policy和Bucket Policy的合并結果 |
AP Policy結果 |
最終結果 |
|
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語句。
-
Deny(顯式拒絕):訪問請求命中了權限原則中的Deny語句。即使同時命中了Allow語句,遵循Deny優先原則,判定結果仍為顯式拒絕。
-
Ignore(隱式拒絕):訪問請求既沒有命中Allow語句,也沒有命中Deny語句。RAM身份預設沒有執行任何操作的許可權,未被顯式允許的操作都會被隱式拒絕。
配額與限制
|
限制項 |
說明 |
|
建立方式 |
支援通過OSS控制台、API和ossutil建立存取點,不支援通過SDK建立存取點。 |
|
數量 |
單個阿里雲帳號最多可建立1000個存取點。 |
|
修改規則 |
存取點建立後,僅支援修改存取點策略,不支援修改存取點基礎資訊(如存取點名稱、存取點別名等)。 |
|
訪問方式 |
不支援匿名訪問。 |
常見問題
存取點的使用權限設定是否支援IP白名單?
支援。可在存取點策略中添加acs:SourceIp條件實現IP白名單存取控制。完整策略樣本如下:
{
"Version": "1",
"Statement": [{
"Effect": "Allow",
"Action": ["oss:GetObject"],
"Principal": ["*"],
"Resource": ["acs:oss:{region-id}:179882766168****:accesspoint/{ap-name}/object/*"],
"Condition": {
"IpAddress": {
"acs:SourceIp": ["192.168.1.0/24", "203.0.113.5"]
}
}
}]
}
以上策略僅允許來自指定IP或網段的請求通過存取點訪問資源。樣本中的"203.0.113.5"是單IP的推薦寫法(裸IP,不帶掩碼)。如果您習慣使用CIDR掩碼寫法(如/32表示單個IP),請注意選擇正確的條件操作符:
|
條件操作符 |
行為 |
適用情境 |
|
|
不包含邊界IP(網路地址和廣播位址) |
裸IP或/1~/31網段 |
|
|
包含邊界IP |
需使用/32表示單IP時 |
IpAddress在計算CIDR範圍時會排除邊界IP(網路地址和廣播位址)。當使用/32掩碼時,該IP本身即為邊界IP,會被排除,導致策略不生效。此時應改用IpAddressIncludeBorder:
"Condition": {
"IpAddressIncludeBorder": {
"acs:SourceIp": ["203.0.113.5/32"]
}
}
通過RAM使用者建立存取點時需具備哪些許可權?
需要具備以下許可權:oss:CreateAccessPoint、oss:GetAccessPoint、oss:DeleteAccessPoint、oss:ListAccessPoints、oss:PutAccessPointPolicy、oss:GetAccessPointPolicy、oss:DeleteAccessPointPolicy、oss:PutBucketPolicy、oss:GetBucketPolicy、oss:DeleteBucketPolicy。