本教程樣本示範了如何使用RAM Policy控制OSS儲存空間、檔案夾及檔案的存取權限。
背景資訊
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的資料模型為扁平型結構,所有檔案都直接隸屬於其對應的儲存空間,不存在目錄與子檔案夾的階層。但您可以在OSS控制台上類比資料夾階層。在該控制台中,您可以按檔案夾對相關檔案進行分組、分類和管理,如下圖所示。
OSS使用索引值(key)對格式的分布式Object Storage Service服務。您可以根據其唯一的key(對象名)檢索對象內容。例如,名為examplebucket的儲存空間有三個檔案夾:Development、Marketing和Private,以及一個對象oss-dg.pdf。
建立檔案夾時,控制台會建立一個key為
檔案夾名/
的對象。上傳對象到檔案夾中時,控制台會將對象的 key設定為
檔案夾名/對象名
。在key中,檔案夾名為首碼,而
/
為分隔字元。您可以從儲存空間中擷取具有特定首碼和分隔字元的所有對象的列表。在控制台中,單擊檔案夾時,控制台會列出檔案夾中的對象,如下圖所示。說明當控制台列舉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之間的請求和響應邏輯。
請求某個儲存空間
單擊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 qn6q*******************:DNrn******************
此請求包括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 qn6q*******************:DNrn******************
此請求包括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。
在左側導覽列,選擇 。
單擊创建权限策略,選擇並單擊指令碼編輯頁簽。
輸入以下權限原則內容,然後單擊確定。
{ "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使用者Leo擁有檔案夾Marketing的唯讀許可權
參見步驟三建立自訂權限原則AllowLeoToReadAndWriteFolderMarketing,並授予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使用者添加到該使用者組。
建立自訂權限原則DenyAllRamToAccessFolderPrivate。
在左側導覽列,選擇
。在权限策略頁面,單擊创建权限策略。
輸入以下權限原則內容,然後單擊確定。
{ "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也將返回錯誤響應。