通過完整的企業情境示範,掌握針對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.comOSS返回所有以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.pdfDevelopment/目錄:Alibaba Cloud.pdf、ProjectA.docx、ProjectB.docxMarketing/目錄:data2020.xlsx、data2021.xlsxPrivate/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都將返回許可權拒絕的錯誤響應。