本教程樣本詳細示範了如何使用RAM Policy控制使用者對OSS儲存空間(Bucket)、檔案夾以及檔案夾下檔案(Object)的存取權限。
背景資訊
RAM Policy是基於使用者的授權策略。通過設定RAM Policy,您可以集中管理您的使用者(例如員工、系統或應用程式),以及控制使用者可以訪問您名下哪些資源的許可權,例如限制您的使用者只擁有對某一個Bucket的讀許可權。
RAM Policy為JSON格式。各欄位定義如下:
- Statement:授權語句,一個權限原則可以有多條授權語句。
- Effect:授權效力,包括允許(Allow)和拒絕(Deny)兩種。說明 當權限原則中既有Allow又有Deny的授權語句時,遵循Deny優先的原則。
- Action:對具體資源的操作許可權。
如果您選擇使用RAM Policy,建議您通過官方工具RAM策略編輯器快速產生RAM策略。
相比於RAM Policy,Bucket Policy支援在控制台直接進行圖形化配置操作,並且Bucket擁有者可以直接進行授權訪問。更多資訊,請參見使用Bucket Policy授權其他使用者訪問OSS資源。
儲存空間和檔案夾的基本概念
OSS提供使用索引值(key)對格式的分布式Object Storage Service服務。您可以根據其唯一的key(對象名)檢索對象的內容。例如,名為examplebucket的儲存空間有三個檔案夾,分別為Development、Marketing和Private,以及一個對象oss-dg.pdf。
- 在建立Development檔案夾時,控制台會建立一個key為
Development/
的對象,檔案夾的key包括分隔字元/
。 - 當您將名為ProjectA.docx 的對象上傳到Development 檔案夾中時,控制台會上傳該對象並將其key設定為
Development/ProjectA.docx
。在該key中,
Development
為首碼,而/
為分隔字元。您可以從儲存空間中擷取具有特定首碼和分隔字元的所有對象的列表。在控制台中,單擊Development 檔案夾時,控制台會列出檔案夾中的對象,如下圖所示。說明 當控制台列舉examplebucket儲存空間中的 Development檔案夾時,它會向OSS發送一個用於指定首碼Development
和分隔字元/
的請求。因此,儲存空間examplebucket有三個對象,其key分別為Development/Alibaba Cloud.pdf
、Development/ProjectA.docx
及Development/ProjectB.docx
。
在本教程開始之前,您還需要瞭解根級儲存空間內容的概念。假設examplebucket儲存空間包含以下對象:
- Development/Alibaba Cloud.pdf
- Development/ProjectA.docx
- Development/ProjectB.docx
- Marketing/data2020.xlsx
- Marketing/data2021.xlsx
- Private/2017/images.zip
- Private/2017/promote.pptx
- oss-dg.pdf
這些對象的key構建了一個以Development、Marketing和Private作為根級檔案夾並以oss-dg.pdf作為根級對象的邏輯階層。當您單擊OSS控制台中的儲存空間名時,控制台會將一級首碼和一個分隔字元,例如Development/、Marketing/和Private/顯示為根級檔案夾。對象oss-dg.pdf沒有首碼,因此顯示為根層級項。
OSS的請求和響應邏輯
在授予RAM使用者相關許可權之前,您需要瞭解單擊某個儲存空間的名字時控制台向OSS發送請求、OSS返迴響應,以及控制台如何解析該響應的邏輯。
- 請求某個儲存空間
單擊examplebucket儲存空間時,控制台會將GetBucket (ListObjects)請求發送至OSS。
- 請求樣本
GET /?prefix=&delimiter=/ HTTP/1.1 Host: examplebucket.oss-cn-hangzhou.aliyuncs.com Date: Fri, 24 Feb 2012 08:43:27 GMT Authorization: OSS qn6qrrqxo2oawuk53otf****:DNrnx7xHk3sgysx7I8U9I9IY****
此請求包括prefix和delimiter參數,其中prefix的值為空白字串,delimiter的值為正斜線(/)。
- 響應樣本
HTTP/1.1 200 OK x-oss-request-id: 534B371674E88A4D8906**** Date: Fri, 7 Aug 2020 08:43:27 GMT Content-Type: application/xml Content-Length: 712 Connection: keep-alive Server: AliyunOSS <?xml version="1.0" encoding="UTF-8"?> <ListBucketResult xmlns=¡±http://doc.oss-cn-hangzhou.aliyuncs.com¡±> <Name>examplebucket</Name> <Prefix></Prefix> <Marker></Marker> <MaxKeys>100</MaxKeys> <Delimiter>/</Delimiter> <IsTruncated>false</IsTruncated> <Contents> <Key>oss-dg.pdf</Key> ... </Contents> <CommonPrefixes> <Prefix>Development</Prefix> </CommonPrefixes> <CommonPrefixes> <Prefix>Marketing</Prefix> </CommonPrefixes> <CommonPrefixes> <Prefix>Private</Prefix> </CommonPrefixes> </ListBucketResult>
- 控制台解析
控制台會解析此結果並顯示如下的根層級項:
- 請求樣本
- 請求儲存空間下的某個檔案夾
單擊Development/檔案夾,控制台會將GetBucket (ListObjects)請求發送至OSS。此請求包括以下參數:
- 請求樣本
GET /?prefix=Development/&delimiter=/ HTTP/1.1 Host: examplebucket.oss-cn-hangzhou.aliyuncs.com Date: Fri, 24 Feb 2012 08:43:27 GMT Authorization: OSS qn6qrrqxo2oawuk53otf****:DNrnx7xHk3sgysx7I8U9I9IY****
此請求包括prefix和delimiter參數,其中prefix的值為
Development/
,delimiter的值為正斜線(/)。 - 響應樣本
作為響應,OSS返回以指定首碼開頭的key:
HTTP/1.1 200 OK x-oss-request-id: 534B371674E88A4D8906**** Date: Fri, 7 Aug 2020 08:43:27 GMT Content-Type: application/xml Content-Length: 712 Connection: keep-alive Server: AliyunOSS <?xml version="1.0" encoding="UTF-8"?> <ListBucketResult xmlns=¡±http://doc.oss-cn-hangzhou.aliyuncs.com¡±> <Name>examplebucket</Name> <Prefix>Development/</Prefix> <Marker></Marker> <MaxKeys>100</MaxKeys> <Delimiter>/</Delimiter> <IsTruncated>false</IsTruncated> <Contents> <Key>ProjectA.docx</Key> ... </Contents> <Contents> <Key>ProjectB.docx</Key> ... </Contents> <Contents> <Key>Alibaba Cloud.pdf</Key> ... </Contents> </ListBucketResult>
- 控制台解析
控制台會解析此結果並顯示如下的key:
- 請求樣本
情境樣本
假設您是目標儲存空間examplebucket
的Owner,且該Bucket下所有的檔案或目錄讀寫權限ACL預設為私人。現在,您希望授予RAM使用者Anne訪問該Bucket下檔案夾Development
及其子檔案夾和檔案的讀寫權限,RAM使用者Leo訪問檔案夾Marketing
及其子檔案夾和檔案的唯讀許可權,以及當前阿里雲帳號下的所有RAM使用者均無權訪問檔案夾Private
的許可權。
步驟一:建立儲存空間並上傳檔案
步驟二:建立RAM使用者Anne和Leo
步驟三:授予RAM使用者Anne擁有檔案夾Development的讀寫權限
- 建立自訂權限原則AllowAnneToReadAndWriteFolderDevelopment。
- 在左側導覽列,選擇 。
- 在頁面,單擊。
- 在頁面,單擊指令碼編輯頁簽。
- 輸入以下權限原則內容,然後單擊繼續編輯基本資料。以下策略用於授予RAM使用者Anne擁有檔案夾Development及檔案夾下所有檔案的讀寫權限。
{ "Version":"1", "Statement":[ { "Effect":"Allow", "Action":[ "oss:ListObjects" ], "Resource":[ "acs:oss:*:*:examplebucket" ], "Condition":{ "StringLike":{ "oss:Prefix":[ "Development", "Development/*" ] } } }, { "Effect":"Allow", "Action":[ "oss:GetObject", "oss:PutObject", "oss:GetObjectAcl" ], "Resource":[ "acs:oss:*:*:examplebucket/Development/*" ] } ] }
- 輸入權限原則和備忘。
- 單擊。
- 為RAM使用者Anne添加自訂權限原則AllowAnneToReadAndWriteFolderDevelopment。具體操作,請參見為RAM使用者授權。
步驟四:授予RAM使用者Leo擁有檔案夾Marketing的唯讀許可權
{
"Version":"1",
"Statement":[
{
"Effect":"Allow",
"Action":[
"oss:ListObjects"
],
"Resource":[
"acs:oss:*:*:examplebucket"
],
"Condition":{
"StringLike":{
"oss:Prefix":[
"Marketing",
"Marketing/*"
]
}
}
},
{
"Effect":"Allow",
"Action":[
"oss:GetObject",
"oss:GetObjectAcl"
],
"Resource":[
"acs:oss:*:*:examplebucket/Marketing/*"
]
}
]
}
步驟5:拒絕當前阿里雲帳號下的所有RAM使用者訪問Private檔案夾
- 建立使用者組並添加使用者群組成員。建立使用者組的具體操作,請參見建立使用者組。使用者組建立完成後,將當前阿里雲帳號下的所有RAM使用者添加到該使用者組。具體操作,請參見為使用者組添加RAM使用者。
- 建立自訂權限原則DenyAllRamToAccessFolderPrivate。
- 在左側導覽列,選擇 。
- 在頁面,單擊。
- 輸入以下權限原則內容,然後單擊繼續編輯基本資料。以下策略用於授予當前阿里雲帳號下的所有RAM使用者拒絕訪問Private檔案夾的許可權。
{ "Version":"1", "Statement":[ { "Effect":"Deny", "Action":[ "oss:*" ], "Resource":[ "acs:oss:*:*:examplebucket/Private/*" ], "Condition":{ } }, { "Effect":"Deny", "Action":[ "oss:ListObjects" ], "Resource":[ "acs:oss:*:*:*" ], "Condition":{ "StringLike":{ "oss:Prefix":[ "Private/", "Private/*" ] } } } ] }
- 輸入權限原則和備忘。
- 單擊。
- 為使用者組添加自訂權限原則DenyAllRamToAccessFolderPrivate。具體操作,請參見為使用者組授權。添加權限原則後,使用者組中的任何RAM使用者都不能訪問您儲存空間
examplebucket
中的檔案夾Private
,且當RAM使用者請求列舉Private
檔案夾下的Private/2017/images.zip
、Private/2017/promote.pptx
檔案時,OSS也將返回錯誤響應。