使用RAMPolicy控制OSS的訪問權(quán)限
本教程示例詳細(xì)演示了如何使用RAM Policy控制用戶對OSS存儲空間(Bucket)、文件夾以及文件夾下文件(Object)的訪問權(quán)限。
背景信息
RAM Policy是基于用戶的授權(quán)策略。通過設(shè)置RAM Policy,您可以集中管理您的用戶(例如員工、系統(tǒng)或應(yīng)用程序),以及控制用戶可以訪問您名下哪些資源的權(quán)限,例如限制您的用戶只擁有對某一個Bucket的讀權(quán)限。
RAM Policy為JSON格式。各字段定義如下:
Statement:授權(quán)語句,一個權(quán)限策略可以有多條授權(quán)語句。
Effect:授權(quán)效力,包括允許(Allow)和拒絕(Deny)兩種。
說明當(dāng)權(quán)限策略中既有Allow又有Deny的授權(quán)語句時,遵循Deny優(yōu)先的原則。
Action:對具體資源的操作權(quán)限。
如果您選擇使用RAM Policy,建議您通過官方工具RAM策略編輯器快速生成RAM策略。
相比于RAM Policy,Bucket Policy支持在控制臺直接進(jìn)行圖形化配置操作,并且Bucket擁有者可以直接進(jìn)行授權(quán)訪問。更多信息,請參見使用Bucket Policy授權(quán)其他用戶訪問OSS資源。
存儲空間和文件夾的基本概念
阿里云OSS的數(shù)據(jù)模型為扁平型結(jié)構(gòu),所有文件都直接隸屬于其對應(yīng)的存儲空間。因此,OSS缺少文件系統(tǒng)中類似于目錄與子文件夾的層次結(jié)構(gòu)。但是,您可以在OSS控制臺上模擬文件夾層次結(jié)構(gòu)。在該控制臺中,您可以按文件夾對相關(guān)文件進(jìn)行分組、分類和管理,如下圖所示。
OSS提供使用鍵值(key)對格式的分布式對象存儲服務(wù)。您可以根據(jù)其唯一的key(對象名)檢索對象的內(nèi)容。例如,名為examplebucket的存儲空間有三個文件夾,分別為Development、Marketing和Private,以及一個對象oss-dg.pdf。
在創(chuàng)建Development文件夾時,控制臺會創(chuàng)建一個key為
Development/
的對象,文件夾的key包括分隔符/
。當(dāng)您將名為ProjectA.docx 的對象上傳到Development 文件夾中時,控制臺會上傳該對象并將其key設(shè)置為
Development/ProjectA.docx
。在該key中,
Development
為前綴,而/
為分隔符。您可以從存儲空間中獲取具有特定前綴和分隔符的所有對象的列表。在控制臺中,單擊Development 文件夾時,控制臺會列出文件夾中的對象,如下圖所示。說明當(dāng)控制臺列舉examplebucket存儲空間中的 Development文件夾時,它會向OSS發(fā)送一個用于指定前綴
Development
和分隔符/
的請求。因此,存儲空間examplebucket有三個對象,其key分別為Development/Alibaba Cloud.pdf
、Development/ProjectA.docx
及Development/ProjectB.docx
。
在本教程開始之前,您還需要了解根級存儲空間內(nèi)容的概念。假設(shè)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構(gòu)建了一個以Development、Marketing和Private作為根級文件夾并以oss-dg.pdf作為根級對象的邏輯層次結(jié)構(gòu)。當(dāng)您單擊OSS控制臺中的存儲空間名時,控制臺會將一級前綴和一個分隔符,例如Development/、Marketing/和Private/顯示為根級文件夾。對象oss-dg.pdf沒有前綴,因此顯示為根級別項。
OSS的請求和響應(yīng)邏輯
在授予RAM用戶相關(guān)權(quán)限之前,您需要了解單擊某個存儲空間的名字時控制臺向OSS發(fā)送請求、OSS返回響應(yīng),以及控制臺如何解析該響應(yīng)的邏輯。
請求某個存儲空間
單擊examplebucket存儲空間時,控制臺會將GetBucket (ListObjects)請求發(fā)送至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參數(shù),其中prefix的值為空字符串,delimiter的值為正斜線(/)。
響應(yīng)示例
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>
控制臺解析
控制臺會解析此結(jié)果并顯示如下的根級別項:
請求存儲空間下的某個文件夾
單擊Development/文件夾,控制臺會將GetBucket (ListObjects)請求發(fā)送至OSS。此請求包括以下參數(shù):
請求示例
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參數(shù),其中prefix的值為
Development/
,delimiter的值為正斜線(/)。響應(yīng)示例
作為響應(yīng),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>
控制臺解析
控制臺會解析此結(jié)果并顯示如下的key:
場景示例
假設(shè)您是目標(biāo)存儲空間examplebucket
的Owner,且該Bucket下所有的文件或目錄讀寫權(quán)限ACL默認(rèn)為私有?,F(xiàn)在,您希望授予RAM用戶Anne訪問該Bucket下文件夾Development
及其子文件夾和文件的讀寫權(quán)限,RAM用戶Leo訪問文件夾Marketing
及其子文件夾和文件的只讀權(quán)限,以及當(dāng)前阿里云賬號下的所有RAM用戶均無權(quán)訪問文件夾Private
的權(quán)限。
步驟一:創(chuàng)建存儲空間并上傳文件
創(chuàng)建存儲空間examplebucket。
使用阿里云賬號登錄OSS控制臺。
創(chuàng)建名為examplebucket的存儲空間。具體操作,請參見創(chuàng)建存儲空間。
創(chuàng)建目錄Development、Marketing和Private。具體操作,請參見創(chuàng)建目錄。
按如下要求將文件上傳至指定路徑。
將oss-dg.pdf文件上傳至examplebucket的根目錄。
將文件Alibaba Cloud.pdf、ProjectA.docx以及ProjectB.docx上傳至Development目錄。
將文件data2020.xlsx和data2021.xlsx上傳至Marketing目錄。
將文件images.zip和promote.pptx上傳至Private目錄。
具體操作,請參見上傳文件。
步驟二:創(chuàng)建RAM用戶Anne和Leo
通過RAM控制臺創(chuàng)建RAM用戶Anne和Leo為例。關(guān)于創(chuàng)建RAM用戶的具體操作,請參見創(chuàng)建RAM用戶。
步驟三:授予RAM用戶Anne擁有文件夾Development的讀寫權(quán)限
創(chuàng)建自定義權(quán)限策略AllowAnneToReadAndWriteFolderDevelopment。
在左側(cè)導(dǎo)航欄,選擇 。
在權(quán)限策略頁面,單擊創(chuàng)建權(quán)限策略。
在創(chuàng)建權(quán)限策略頁面,單擊腳本編輯頁簽。
輸入以下權(quán)限策略內(nèi)容,然后單擊繼續(xù)編輯基本信息。
以下策略用于授予RAM用戶Anne擁有文件夾Development及文件夾下所有文件的讀寫權(quán)限。
{ "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/*" ] } ] }
輸入權(quán)限策略名稱和備注。
單擊確定。
為RAM用戶Anne添加自定義權(quán)限策略AllowAnneToReadAndWriteFolderDevelopment。具體操作,請參見為RAM用戶授權(quán)。
步驟四:授予RAM用戶Leo擁有文件夾Marketing的只讀權(quán)限
參見步驟三創(chuàng)建自定義權(quán)限策略AllowLeoToReadAndWriteFolderMarketing,并授予RAM用戶Leo只讀訪問文件夾Marketing及文件夾下所有文件的權(quán)限。其策略內(nèi)容配置如下:
{
"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:拒絕當(dāng)前阿里云賬號下的所有RAM用戶訪問Private文件夾
創(chuàng)建用戶組并添加用戶組成員。
創(chuàng)建用戶組的具體操作,請參見創(chuàng)建RAM用戶組。用戶組創(chuàng)建完成后,將當(dāng)前阿里云賬號下的所有RAM用戶添加到該用戶組。具體操作,請參見為RAM用戶組添加RAM用戶。
創(chuàng)建自定義權(quán)限策略DenyAllRamToAccessFolderPrivate。
在左側(cè)導(dǎo)航欄,選擇 。
在權(quán)限策略頁面,單擊創(chuàng)建權(quán)限策略。
輸入以下權(quán)限策略內(nèi)容,然后單擊繼續(xù)編輯基本信息。
以下策略用于授予當(dāng)前阿里云賬號下的所有RAM用戶拒絕訪問Private文件夾的權(quán)限。
{ "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/*" ] } } } ] }
輸入權(quán)限策略名稱和備注。
單擊確定。
為用戶組添加自定義權(quán)限策略DenyAllRamToAccessFolderPrivate。具體操作,請參見為RAM用戶組授權(quán)。
添加權(quán)限策略后,用戶組中的任何RAM用戶都不能訪問您存儲空間
examplebucket
中的文件夾Private
,且當(dāng)RAM用戶請求列舉Private
文件夾下的Private/2017/images.zip
、Private/2017/promote.pptx
文件時,OSS也將返回錯誤響應(yīng)。