閱讀766 返回首頁    go 魔獸


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

  上一篇:go linux 整理
  下一篇:go PostgreSQL壓測工具之pgbench-tools使用指南