766
魔獸
OSS移動開發實戰3 (30分鍾快速搭建移動應用之安全策略)
搭建應用服務器之STS Policy
上一篇文章中介紹了如何快速搭建應用服務器,在本文中會基於上文提到的應用服務器,以上海的Bucket app-base-oss
為例子,配置不同的Policy以實現不同的權限控製。
以下說明中假設你已經開通了STS,並完全閱讀了上一篇文章。以下提到的Policy都是指上文提到的config.json中指定的Policy文件的內容。
以下講述的獲取STS Token 後對OSS操作
指的是應用服務器指定Policy,從STS獲取臨時憑證後,應用通過臨時憑證訪問OSS。
常見Policy
完全授權的Policy
上文為了演示方便,默認Policy如下,表示的意思是允許應用對所有OSS的操作。
這對移動應用來說是不安全的授權,不推薦。
{
"Statement": [
{
"Action": [
"oss:*"
],
"Effect": "Allow",
"Resource": ["acs:oss:*:*:*"]
}
],
"Version": "1"
}
獲取STS Token 後對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
這個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"
}
獲取STS Token 後對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。
這樣不同的應用如果對應不同的前綴,就可以達到在同一個bucket中空間隔離的效果。
{
"Statement": [
{
"Action": [
"oss:GetObject",
"oss:ListObjects"
],
"Effect": "Allow",
"Resource": ["acs:oss:*:*:app-base-oss/user1/*", "acs:oss:*:*:app-base-oss"]
}
],
"Version": "1"
}
獲取STS Token 後對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
這個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"
}
獲取STS Token 後對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。
這樣不同的應用如果對應不同的前綴,就可以達到在同一個bucket中空間隔離的效果。
{
"Statement": [
{
"Action": [
"oss:PutObject"
],
"Effect": "Allow",
"Resource": ["acs:oss:*:*:app-base-oss/user1/*", "acs:oss:*:*:app-base-oss"]
}
],
"Version": "1"
}
獲取STS Token 後對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
這個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"
}
獲取STS Token 後對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進行讀寫。
這樣不同的應用如果對應不同的前綴,就可以達到在同一個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"
}
獲取STS Token 後對OSS操作 | 結果 |
---|---|
列出所有創建的Bucket | 失敗 |
上傳不帶前綴的Object,test.txt | 失敗 |
下載不帶前綴的Object, test.txt | 失敗 |
上傳帶前綴的Object, user1/test.txt | 成功 |
下載帶前綴的Object, user1/test.txt | 成功 |
列出Object, test.txt | 成功 |
帶前綴的Object, user1/test.txt | 成功 |
小結
從上麵的例子可以看出
- 可以根據不同的應用場景製定不同的Policy,然後對應用服務器稍作修改就可以實現對不用的應用用戶實現不同的權限控製。
- 另外也可以在應用端做優化,在STS Token過期之前不需要向應用服務器再次請求。這裏就不多講。
- 需要特別注意的是Token實際頒發是由STS頒發的,應用服務器相當於定製了Policy,向STS請求Token,然後將Token轉發給應用。 這裏的Token是一個簡略的說法。實際上包含了"AccessKeyId","AccessKeySecret","Expiration","SecurityToken",這些在OSS提供給應用的SDK中會用到。 詳細參見各個SDK的實現。
- 以上的Policy中的
app-base-oss
是本文使用的Bucket,如果在實際使用中需要替換成自己的Bucket。
更多參考資料
最後更新:2017-04-01 13:38:49