通過完整的企業情境示範,掌握針對OSS儲存空間、目錄和檔案配置精細化存取權限的方法。深入瞭解OSS扁平化儲存結構和首碼列舉機制對策略配置的影響,掌握為不同RAM使用者授予目錄層級讀寫、唯讀及拒絕存取權限。
儲存結構與授權
OSS儲存模型
OSS採用扁平化儲存模型,以索引值(Key-Value)對格式儲存物件檔案,所有檔案直接隸屬於儲存空間,物理上不存在目錄層級結構。控制台中顯示的“目錄”通過對象檔案Key的首碼和分隔字元(/)類比出資料夾階層,實現檔案的分組、分類和管理功能。
以儲存空間examplebucket為例,控制台顯示的目錄結構及對應的對象Key如下:
examplebucket
├── Development/ # Key: Development/(目錄對象)
│ ├── Alibaba Cloud.pdf # Key: Development/Alibaba Cloud.pdf
│ ├── ProjectA.docx # Key: Development/ProjectA.docx
│ └── ProjectB.docx # Key: Development/ProjectB.docx
├── Marketing/ # Key: Marketing/(目錄對象)
│ ├── data2020.xlsx # Key: Marketing/data2020.xlsx
│ └── data2021.xlsx # Key: Marketing/data2021.xlsx
├── Private/ # Key: Private/(目錄對象)
│ └── 2017/ # Key: Private/2017/(目錄對象)
│ ├── images.zip # Key: Private/2017/images.zip
│ └── promote.pptx # Key: Private/2017/promote.pptx
└── oss-dg.pdf # Key: oss-dg.pdf
目錄對象的Key以/結尾,這是OSS識別“目錄”的標誌。實際儲存中,所有對象(包括目錄對象)都是扁平儲存的。
由於OSS沒有真正的目錄層級,當需要授權訪問某個“目錄”時,實際上是在授權訪問具有特定首碼的所有對象。例如授權訪問Development/目錄,等同於授權訪問所有Key以Development/開頭的對象。
Bucket、目錄、檔案請求差異
不同的操作目標對應不同的API請求和Resource配置,理解這些差異是正確配置權限原則的關鍵。
ListObjects請求機制
控制台檔案清單顯示目錄結構的核心是GetBucket (ListObjects)介面的兩個參數:
|
參數 |
作用 |
樣本值 |
|
|
限制返回的對象必須以該首碼開頭 |
|
|
|
對象分組的字元,通常為 |
|
使用者在控制台點擊Development/檔案夾時,控制台向OSS發送如下請求:
GET /?prefix=Development/&delimiter=/ HTTP/1.1
Host: examplebucket.oss-cn-hangzhou.aliyuncs.com
OSS返回所有以Development/開頭的對象。由於指定了delimiter=/,OSS會將子目錄(如Development/SubFolder/)作為CommonPrefixes返回,而非展開其下的所有檔案。
不同操作的Resource配置
|
操作目標 |
觸發的API |
Resource配置 |
策略配置要點 |
|
列舉儲存空間根目錄 |
ListObjects,prefix為空白,delimiter為 |
|
Resource指向Bucket本身 ,而非具體路徑 |
|
進入某個檔案夾 |
ListObjects,prefix為 |
|
Resource指向Bucket本身
,而非具體路徑,通過Condition的 |
|
讀寫檔案內容 |
|
Resource可精確到路徑,支援萬用字元 |
控制台與API/SDK訪問差異
通過OSS控制台訪問時,使用者需要從Bucket列表逐層導航進入目標目錄,這比直接使用API/SDK需要更多的許可權:
|
訪問方式 |
要求的權限 |
|
API/SDK |
僅需目標資源的操作許可權(如 |
|
控制台 |
除目標資源許可權外,還需 |
情境說明
假設儲存空間examplebucket所有檔案的讀寫權限ACL預設為私人。儲存空間結構如下:
examplebucket
├── Development/ # 開發部門檔案夾
│ ├── Alibaba Cloud.pdf
│ ├── ProjectA.docx
│ └── ProjectB.docx
├── Marketing/ # 市場部門檔案夾
│ ├── data2020.xlsx
│ └── data2021.xlsx
├── Private/ # 機密檔案夾
│ └── 2017/
│ ├── images.zip
│ └── promote.pptx
└── oss-dg.pdf
許可權控制目標如下:
|
RAM使用者/使用者組 |
授權目標 |
權限類別型 |
|
RAM使用者 Anne |
|
讀寫權限 |
|
RAM使用者 Leo |
|
唯讀許可權 |
|
指定使用者組的所有成員 |
|
禁止訪問 |
步驟一:建立儲存空間並上傳檔案
-
前往Bucket列表,建立 Bucket,如
examplebucket。 -
在儲存空間內新建目錄:
Development、Marketing和Private(在Private下再建立子目錄2017)。 -
按如下路徑上傳文件:
-
根目錄:
oss-dg.pdf -
Development/目錄:Alibaba Cloud.pdf、ProjectA.docx、ProjectB.docx -
Marketing/目錄:data2020.xlsx、data2021.xlsx -
Private/2017/目錄:images.zip、promote.pptx
-
步驟二:建立RAM使用者Anne和Leo
前往RAM使用者列表,建立使用者Anne和Leo。
步驟三:授予Anne對Development檔案夾的讀寫權限
策略設計思路
要實現對Development/檔案夾的讀寫訪問,需要授予兩類許可權:
-
列舉許可權:允許使用者查看
Development/檔案夾的內容(oss:ListObjects),通過Condition限制只能列舉以Development開頭的對象。 -
讀寫權限:允許使用者讀取和上傳
Development/下的檔案(oss:GetObject、oss:PutObject),Resource指向examplebucket/Development/*。
建立並授權策略
-
前往RAM權限原則列表,單擊建立權限原則。
-
選擇指令碼編輯,輸入以下策略內容:
{ "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/*" } ] }策略解析:
-
第一個Statement:授予列舉許可權,Resource為Bucket本身,通過
Condition的oss:Prefix條件限制只能列舉Development及其子目錄下的內容。 -
第二個Statement:授予讀寫權限,Resource精確指向
Development/*路徑下的所有對象。
-
-
單擊确定,輸入策略名稱稱(如
AllowAnneAccessDevelopment),單擊确定完成建立。 -
前往RAM使用者列表,為RAM使用者Anne添加許可權,選擇剛建立的策略。
步驟四:授予Leo對Marketing檔案夾的唯讀許可權
參照步驟三,為RAM使用者Leo建立並授予唯讀策略。與讀寫策略的區別在於Action只包含讀取相關操作。策略內容:
{
"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/*"
}
]
}
Action中移除了oss:PutObject,Leo只能讀取而不能上傳或修改檔案。
步驟五:禁止指定使用者組訪問Private檔案夾
通過使用者組統一系統管理權限,將需要禁止訪問Private/檔案夾的RAM使用者添加到同一使用者組,然後為該使用者組配置拒絕策略。
此方法僅對已加入使用者組的RAM使用者生效。如需對帳號下所有RAM使用者(包括後續新增的使用者)生效,建議使用Bucket Policy在資源側配置拒絕策略。
建立使用者組並新增成員
-
前往RAM使用者組列表,建立使用者組(如
DenyPrivateAccessGroup)。 -
添加群組成員,將需要禁止訪問
Private/檔案夾的RAM使用者添加到使用者組。
建立並授予拒絕策略
-
前往RAM權限原則列表,單擊建立權限原則。
-
選擇指令碼編輯,輸入以下策略內容:
{ "Version": "1", "Statement": [ { "Effect": "Deny", "Action": "oss:*", "Resource": "acs:oss:*:*:examplebucket/Private/*" }, { "Effect": "Deny", "Action": "oss:ListObjects", "Resource": "acs:oss:*:*:examplebucket", "Condition": { "StringLike": { "oss:Prefix": [ "Private/", "Private/*" ] } } } ] }策略解析:
-
第一個Statement:拒絕對
Private/路徑下所有檔案的任何操作。 -
第二個Statement:拒絕列舉
Private/檔案夾的內容,防止使用者查看檔案清單。
-
-
單擊确定,輸入策略名稱稱(如
DenyAccessPrivateFolder),單擊确定完成建立。 -
前往RAM使用者組列表,為RAM使用者組添加許可權,選擇剛建立的策略。
使用者組中的RAM使用者嘗試訪問Private/檔案夾時,無論是列舉檔案還是下載檔案,OSS都將返回許可權拒絕的錯誤響應。