RAM (Resource Access Management)是阿里雲提供的資源存取控制服務。RAM Policy是基於使用者的授權策略。通過設定RAM Policy,您可以集中管理您的使用者(比如員工、系統或應用程式),以及控制使用者可以訪問您名下哪些資源的許可權。比如能夠限制您的使用者只擁有對某一個 Bucket 的讀許可權。子帳號是從屬於主帳號的,並且這些帳號下不能擁有實際的任何資源,所有資源都屬於主帳號。
常見Policy樣本
- 完全授權的Policy
完全授權的Policy表示允許應用可以對OSS進行任何操作。
警告 完全授權的Policy對行動裝置 App來說是不安全的授權,不推薦使用。{ "Statement": [ { "Action": [ "oss:*" ], "Effect": "Allow", "Resource": ["acs:oss:*:*:*"] } ], "Version": "1" }
對OSS的操作 結果 列舉所有建立的Bucket 成功 上傳不帶首碼的Object,test.txt 成功 下載不帶首碼的Object,test.txt 成功 上傳帶首碼的Object,user1/test.txt 成功 下載帶首碼的Object,user1/test.txt 成功 列舉Object,test.txt 成功 帶首碼的Object,user1/test.txt 成功 - 不限制首碼的唯讀不寫Policy
此Policy表示應用對Bucket
app-base-oss
下所有的Object可列舉,可下載。{ "Statement": [ { "Action": [ "oss:GetObject", "oss:ListObjects" ], "Effect": "Allow", "Resource": ["acs:oss:*:*:app-base-oss/*", "acs:oss:*:*:app-base-oss"] } ], "Version": "1" }
對OSS的操作 結果 列舉所有建立的Bucket 失敗 上傳不帶首碼的Object,test.txt 失敗 下載不帶首碼的Object,test.txt 成功 上傳帶首碼的Object,user1/test.txt 失敗 下載帶首碼的Object,user1/test.txt 成功 列舉不帶首碼的Object,test.txt 成功 列舉帶首碼的Object,user1/test.txt 成功 - 限制首碼的唯讀不寫Policy
此Policy表示應用對Bucket
app-base-oss
下帶有首碼user1/
的Object可列舉、可下載,但無法下載其他首碼的Object。採用此種Policy,如果不同的應用對應不同的首碼,就可以達到在同一個Bucket中空間隔離的效果。{ "Statement": [ { "Action": [ "oss:GetObject", "oss:ListObjects" ], "Effect": "Allow", "Resource": ["acs:oss:*:*:app-base-oss/user1/*", "acs:oss:*:*:app-base-oss"] } ], "Version": "1" }
對OSS的操作 結果 列舉所有建立的Bucket 失敗 上傳不帶首碼的Object,test.txt 失敗 下載不帶首碼的Object,test.txt 失敗 上傳帶首碼的Object,user1/test.txt 失敗 下載帶首碼的Object,user1/test.txt 成功 列舉Object,test.txt 成功 帶首碼的Object,user1/test.txt 成功 - 不限制首碼的唯寫不讀Policy
此Policy表示應用可以對Bucket
app-base-oss
下所有的Object進行上傳。{ "Statement": [ { "Action": [ "oss:PutObject" ], "Effect": "Allow", "Resource": ["acs:oss:*:*:app-base-oss/*", "acs:oss:*:*:app-base-oss"] } ], "Version": "1" }
對OSS的操作 結果 列舉所有建立的Bucket 失敗 上傳不帶首碼的Object,test.txt 成功 下載不帶首碼的Object,test.txt 失敗 上傳帶首碼的Object,user1/test.txt 成功 下載帶首碼的Object,user1/test.txt 成功 列舉Object,test.txt 成功 帶首碼的Object,user1/test.txt 成功 - 限制首碼的唯寫不讀Policy
此Policy表示應用可以對Bucket
app-base-oss
下帶有首碼user1/
的Object進行上傳。但無法上傳其他首碼的Object。採用此種Policy,如果不同的應用對應不同的首碼,就可以達到在同一個Bucket中空間隔離的效果。{ "Statement": [ { "Action": [ "oss:PutObject" ], "Effect": "Allow", "Resource": ["acs:oss:*:*:app-base-oss/user1/*", "acs:oss:*:*:app-base-oss"] } ], "Version": "1" }
對OSS的操作 結果 列舉所有建立的Bucket 失敗 上傳不帶首碼的Object,test.txt 失敗 下載不帶首碼的Object,test.txt 失敗 上傳帶首碼的Object,user1/test.txt 成功 下載帶首碼的Object,user1/test.txt 失敗 列舉Object,test.txt 失敗 帶首碼的Object,user1/test.txt 失敗 - 不限制首碼的讀寫Policy
此Policy表示應用可以對Bucket
app-base-oss
下所有的Object進行列舉、下載、上傳和刪除。{ "Statement": [ { "Action": [ "oss:GetObject", "oss:PutObject", "oss:DeleteObject", "oss:ListParts", "oss:AbortMultipartUpload", "oss:ListObjects" ], "Effect": "Allow", "Resource": ["acs:oss:*:*:app-base-oss/*", "acs:oss:*:*:app-base-oss"] } ], "Version": "1" }
對OSS的操作 結果 列舉所有建立的Bucket 失敗 上傳不帶首碼的Object,test.txt 成功 下載不帶首碼的Object,test.txt 成功 上傳帶首碼的Object,user1/test.txt 成功 下載帶首碼的Object,user1/test.txt 成功 列舉Object,test.txt 成功 帶首碼的Object,user1/test.txt 成功 - 限制首碼的讀寫Policy
此Policy表示應用可以對Bucket
app-base-oss
下帶有首碼user1/
的Object進行列舉、下載、上傳和刪除,但無法對其他首碼的Object進行讀寫。採用此種Policy,如果不同的應用對應不同的首碼,就可以達到在同一個Bucket中空間隔離的效果。{ "Statement": [ { "Action": [ "oss:GetObject", "oss:PutObject", "oss:DeleteObject", "oss:ListParts", "oss:AbortMultipartUpload", "oss:ListObjects" ], "Effect": "Allow", "Resource": ["acs:oss:*:*:app-base-oss/user1/*", "acs:oss:*:*:app-base-oss"] } ], "Version": "1" }
對OSS的操作 結果 列舉所有建立的Bucket 失敗 上傳不帶首碼的Object,test.txt 失敗 下載不帶首碼的Object,test.txt 失敗 上傳帶首碼的Object,user1/test.txt 成功 下載帶首碼的Object,user1/test.txt 成功 列舉Object,test.txt 成功 帶首碼的Object,user1/test.txt 成功
複雜Policy樣本
{
"Version": "1",
"Statement": [
{
"Action": [
"oss:GetBucketAcl",
"oss:ListObjects"
],
"Resource": [
"acs:oss:*:1775305056529849:mybucket"
],
"Effect": "Allow",
"Condition": {
"StringEquals": {
"acs:UserAgent": "java-sdk",
"oss:Prefix": "foo"
},
"IpAddress": {
"acs:SourceIp": "192.168.0.1"
}
}
},
{
"Action": [
"oss:PutObject",
"oss:GetObject",
"oss:DeleteObject"
],
"Resource": [
"acs:oss:*:1775305056529849:mybucket/file*"
],
"Effect": "Allow",
"Condition": {
"IpAddress": {
"acs:SourceIp": "192.168.0.1"
}
}
}
]
}
這是一個較為複雜的授權 Policy,使用者用這樣的一個 Policy 通過 RAM 或 STS 服務向其他使用者授權。Policy 當中有一個 Statement(一條 Policy 當中可以有多條 Statement)。Statement 裡面規定了相應的 Action、Resource、Effect 和 Condition。
這條 Policy 把使用者自己名下的mybucket
和mybucket/file*
這些資源授權給相應的使用者,並且支援 GetBucketAcl、GetBucket、PutObject、GetObject 和 DeleteObject 這幾種操作。Condition
中的條件表示 UserAgent為 java-sdk,源IP為192.168.0.1的時候鑒權才能通過,被授權的使用者才能訪問相關的資源。Prefix 這個 Condition
是在 GetBucket(ListObjects)的時候起作用的,關於這個欄位的解釋詳見 OSS的 API 文檔。
Version
Version定義了Policy的版本,本文檔中 Version 設定為1。
Statement
通過Statement描述授權語義,其中可以根據業務情境包含多條語義,每條包含對 Action、Effect、Resource 和 Condition 的描述。每次請求系統會逐條依次匹配檢查,所有匹配成功的 Statement 會根據 Effect 的設定不同分為通過(Allow)、禁止(Deny),其中禁止(Deny)的優先。如果匹配成功的都為通過,該條請求即鑒權通過。如果匹配成功有一條禁止,或者沒有任何條目匹配成功,該條請求被禁止訪問。
Action
Action 分為三大類:
- Service 層級操作,對應的是 GetService 操作,用來列出所有屬於該使用者的 Bucket 列表。
- Bucket 層級操作,對應類似於 oss:PutBucketAcl、oss:GetBucketLocation之類的操作,操作的對象是 Bucket,它們的名稱和相應的介面名稱一一對應。
- Object 層級操作,分為 oss:GetObject、oss:PutObject、oss:DeleteObject和oss:AbortMultipartUpload,操作對象是 Object。
如想授權某一類的 Object 的操作,可以選擇這幾種的一種或幾種。另外,所有的 Action 前面都必須加上oss:
,如上面例子所示。Action 是一個列表,可以有多個 Action。具體的 Action 和 API 介面的對應關係如下:
- Service層級
API Action GetService(ListBuckets) oss:ListBuckets - Bucket 層級
API Action PutBucket oss:PutBucket GetBucket(ListObjects) oss:ListObjects PutBucketAcl oss:PutBucketAcl DeleteBucket oss:DeleteBucket GetBucketLocation oss:GetBucketLocation GetBucketAcl oss:GetBucketAcl GetBucketLogging oss:GetBucketLogging PutBucketLogging oss:PutBucketLogging DeleteBucketLogging oss:DeleteBucketLogging GetBucketWebsite oss:GetBucketWebsite PutBucketWebsite oss:PutBucketWebsite DeleteBucketWebsite oss:DeleteBucketWebsite GetBucketReferer oss:GetBucketReferer PutBucketReferer oss:PutBucketReferer GetBucketLifecycle oss:GetBucketLifecycle PutBucketLifecycle oss:PutBucketLifecycle DeleteBucketLifecycle oss:DeleteBucketLifecycle ListMultipartUploads oss:ListMultipartUploads PutBucketCors oss:PutBucketCors GetBucketCors oss:GetBucketCors DeleteBucketCors oss:DeleteBucketCors PutBucketReplication oss:PutBucketReplication GetBucketReplication oss:GetBucketReplication DeleteBucketReplication oss:DeleteBucketReplication GetBucketReplicationLocation oss:GetBucketReplicationLocation GetBucketReplicationProgress oss:GetBucketReplicationProgress - Object 層級
API Action GetObject oss:GetObject HeadObject oss:GetObject PutObject oss:PutObject PostObject oss:PutObject InitiateMultipartUpload oss:PutObject UploadPart oss:PutObject CompleteMultipart oss:PutObject DeleteObject oss:DeleteObject DeleteMultipleObjects oss:DeleteObject AbortMultipartUpload oss:AbortMultipartUpload ListParts oss:ListParts CopyObject oss:GetObject,oss:PutObject UploadPartCopy oss:GetObject,oss:PutObject AppendObject oss:PutObject GetObjectAcl oss:GetObjectAcl PutObjectAcl oss:PutObjectAcl RestoreObject oss:RestoreObject
Resource
Resource 指代的是 OSS 上面的某個具體的資源或者某些資源(支援*通配),resource的規則是acs:oss:{region}:{bucket_owner}:{bucket_name}/{object_name}
。對於所有 Bucket 層級的操作來說不需要最後的斜杠和{object_name},即acs:oss:{region}:{bucket_owner}:{bucket_name}
。Resource 也是一個列表,可以有多個 Resource。其中的 region 欄位暫時不做支援,設定為*。
Effect
Effect 代表本條的Statement的授權的結果,分為 Allow 和 Deny,分別指代通過和禁止。多條 Statement 同時匹配成功時,禁止(Deny)的優先順序更高。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"oss:*"
],
"Resource": [
"acs:oss:*:*:bucketname"
]
},
{
"Effect": "Deny",
"Action": [
"oss:DeleteObject"
],
"Resource": [
"acs:oss:*:*:bucketname/index/*",
]
}
]
}
Condition
Condition 代表 Policy 授權的一些條件,上面的樣本裡面可以設定對於 acs:UserAgent 的檢查、acs:SourceIp 的檢查,還有 oss:Prefix 項用來在 GetBucket 的時候對資源進行限制。
OSS 支援的 Condition 如下:
condition | 功能 | 合法取值 |
---|---|---|
acs:SourceIp | 指定 ip 網段 | 普通的 ip,支援*通配 |
acs:UserAgent | 指定 http useragent 頭 | 字串 |
acs:CurrentTime | 指定合法的訪問時間 | ISO8601格式 |
acs:SecureTransport | 是否是 https 協議 | “true”或者”false” |
oss:Prefix | 用作 ListObjects 時的 prefix | 合法的object name |
最佳實務
OSS提供了RAM策略編輯器協助您快速產生RAM Policy。您也可以使用圖形化管理工具 ossbrowser 的簡化 Policy 授權,一鍵完成對子帳號授予特定 Bucket 或特定目錄的許可權 。
針對具體情境更多的授權策略配置樣本,可以參考教程樣本:控制儲存空間和檔案夾的存取權限和OSS 授權常見問題。