本文介紹行動裝置 App如何使用RAM角色的臨時安全性權杖(STS Token)訪問阿里雲資源。

背景信息

企業A開發了一款行動裝置 App(App),併購買了Object Storage Service服務。App需要直連OSS上傳或下載資料,但是App運行在使用者自己的行動裝置上,這些裝置不受企業A的控制。

企業A有如下要求:

  • 直傳資料:企業A不希望所有App都通過企業的服務端應用伺服器(Application Server)來進行資料中轉,而希望能夠直連OSS上傳或下載資料。
  • 安全管控:企業A不希望將存取金鑰(AccessKey)儲存到行動裝置中,因為行動裝置是歸屬於使用者控制,屬於不可信的運行環境。
  • 風險控制:企業A希望將風險控制到最小,每個App直連OSS時都必須擁有最小的存取權限且訪問時效需要很短。

解決方案

當行動裝置 App(App)直連OSS上傳或下載資料時,App需要嚮應用伺服器申請訪問憑證。應用伺服器以RAM使用者身份扮演RAM角色,調用STS API AssumeRole介面擷取臨時安全性權杖,並將臨時安全性權杖傳遞給App,App使用臨時安全性權杖訪問OSS。

  1. App嚮應用伺服器申請訪問憑證。
  2. 使用阿里雲帳號A建立一個RAM角色,並為RAM角色授予合適的許可權。
    具體操作,請參見建立RAM角色並授權
  3. 使用阿里雲帳號A為應用伺服器建立一個RAM使用者,並允許應用伺服器以RAM使用者身份扮演該RAM角色。
    具體操作,請參見建立RAM使用者並允許扮演RAM角色
  4. 應用伺服器通過調用STS API AssumeRole介面擷取RAM角色的臨時安全性權杖。
    具體操作,請參見應用伺服器擷取臨時安全性權杖
  5. 應用伺服器可以進一步限制臨時安全性權杖的許可權,以更精細地控制每個App的許可權。
    具體操作,請參見限制臨時安全性權杖的許可權
  6. 當App需要直連OSS上傳或下載資料時,可以使用臨時安全性權杖訪問OSS進行資料直傳。
    具體操作,請參見App使用臨時安全性權杖並訪問OSS

建立RAM角色並授權

假設阿里雲帳號A的帳號ID為123456789012****

  1. 使用阿里雲帳號A建立可信實體為阿里雲帳號的RAM角色oss-readonly
    说明 建立RAM角色時選擇當前雲帳號作為受信阿里雲帳號,即只允許阿里雲帳號A下的RAM使用者來扮演該RAM角色。

    具體操作,請參見建立可信實體為阿里雲帳號的RAM角色

    RAM角色建立成功後,在角色基本資料頁面可以查看到該RAM角色的ARN和信任策略。

    • RAM角色的ARN為acs:ram::123456789012****:role/oss-readonly
    • RAM角色的信任策略如下。
      说明 以下策略表示只允許阿里雲帳號A下的RAM使用者來扮演RAM角色。
      {
          "Statement": [{
              "Action": "sts:AssumeRole",
              "Effect": "Allow",
              "Principal": {
                  "RAM": [
                      "acs:ram::123456789012****:root"
                  ]
              }
          }],
          "Version": "1"
      }
  2. 為RAM角色授權。為RAM角色oss-readonly授予OSS的唯讀存取權限AliyunOSSReadOnlyAccess

    具體操作,請參見為RAM角色授權

建立RAM使用者並允許扮演RAM角色

  1. 使用阿里雲帳號A為應用伺服器建立RAM使用者appserver

    具體操作,請參見建立RAM使用者

  2. 為建立好的RAM使用者授予AliyunSTSAssumeRoleAccess許可權,即允許RAM使用者扮演RAM角色。

    具體操作,請參見為RAM使用者授權

應用伺服器擷取臨時安全性權杖

  1. 應用伺服器使用RAM使用者的存取金鑰調用STS API AssumeRole介面。
    说明 必須配置應用伺服器的存取金鑰,而非阿里雲帳號A的存取金鑰。

    使用阿里雲CLI調用AssumeRole的樣本如下。

    • 請求樣本
      aliyuncli sts AssumeRole --RoleArn acs:ram::123456789012****:role/oss-readonly --RoleSessionName client-001
    • 返回樣本
      {
           "AssumedRoleUser": {
               "AssumedRoleId": "391578752573****:client-001", 
               "Arn": "acs:ram::123456789012****:role/oss-readonly/client-001"
           }, 
           "Credentials": {
               "AccessKeySecret": "93ci2umK1QKNEja6WGqi1Ba7Q2Fv9PwxZqtVF2Vy****", 
               "SecurityToken": "********", 
               "Expiration": "2016-01-13T15:02:37Z", 
               "AccessKeyId": "STS.F13GjskXTjk38dBY6YxJt****"
           }, 
           "RequestId": "E1779AAB-E7AF-47D6-A9A4-53128708B6CE"
       }
    说明 上述樣本未指定Policy參數,因此返回的臨時安全性權杖將擁有RAM角色oss-readonly的所有許可權。您也可以額外限制臨時安全性權杖的許可權,更多資訊,請參見限制臨時安全性權杖的許可權
  2. STS服務將臨時安全性權杖返回給應用伺服器。返回的臨時安全性權杖中包含AccessKeyIdAccessKeySecretSecurityToken
    说明 SecurityToken到期時間較短。如果需要一個較長的到期時間,應用伺服器需要重新頒發臨時安全性權杖,例如:每隔1800秒頒發一次。

限制臨時安全性權杖的許可權

線上上系統,請務必通過使用Policy參數來根據使用者或裝置限制不同臨時安全性權杖的許可權,避免越權風險。以下是此參數的使用樣本。

以下樣本表示:只允許訪問sample-bucket/2015/01/01/*.jpg

  • 請求樣本
    aliyuncli sts AssumeRole --RoleArn acs:ram::123456789012****:role/oss-readonly --RoleSessionName client-002 --Policy "{\"Version\":\"1\", \"Statement\": [{\"Effect\":\"Allow\", \"Action\":\"oss:GetObject\", \"Resource\":\"acs:oss:*:*:sample-bucket/2015/01/01/*.jpg\"}]}"
  • 返回樣本
    {
       "AssumedRoleUser": {
           "AssumedRoleId": "391578752573****:client-002", 
           "Arn": "acs:ram::123456789012****:role/oss-readonly/client-002"
       }, 
       "Credentials": {
           "AccessKeySecret": "28Co5Vyx2XhtTqj3RJgdud4ntyzrSNdUvNygAj7x****", 
           "SecurityToken": "********", 
           "Expiration": "2016-01-13T15:03:39Z", 
           "AccessKeyId": "STS.FJ6EMcS1JLZgAcBJSTDG1****"
       }, 
       "RequestId": "98835D9B-86E5-4BB5-A6DF-9D3156ABA567"
    }
说明 臨時安全性權杖的預設到期時間為3600秒。通過DurationSeconds參數可以限制其到期時間,最長不超過3600秒。

App使用臨時安全性權杖並訪問OSS

  1. 應用伺服器將臨時安全性權杖傳遞給App。
  2. App使用臨時安全性權杖訪問OSS。

    下面是阿里雲CLI使用臨時安全性權杖訪問OSS的樣本。

    • 配置臨時安全性權杖

      文法:aliyuncli oss Config --host --accessid --accesskey --sts_token

      aliyuncli oss Config --host oss.aliyuncs.com --accessid STS.FJ6EMcS1JLZgAcBJSTDG1**** --accesskey 28Co5Vyx2XhtTqj3RJgdud4ntyzrSNdUvNygAj7x**** --sts_token CAESnQMIARKAASJgnzMzlXVyJn4KI+FsysaIpTGm8ns8Y74HVEj0pOevO8ZWXrnnkz4a4rBEPBAdFkh3197GUsprujsiU78FkszxhnQPKkQKcyvPihoXqKvuukrQ/Uoudk31KAJEz5o2EjlNUREcxWjRDRSISMzkxNTc4NzUyNTczOTcyODU0KgpjbGllbnQtMDAxMKmZxIHBKjoGUnNhTUQ1Qn8KATEaegoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOkdldE9iamVjdBJICg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaLAoqYWNzOm9zczoqOio6c2FtcGxlLWJ1Y2tldC8yMDE1LzAxLzAxLyouanBnSgU0MzI3NFIFMjY4NDJaD0Fzc3VtZWRSb2xlVXNlcmAAahIzOTE1Nzg3NTI1NzM5NzI4NTRyCWVjcy1hZG1pbnjgxt7Cj/bo****
    • 訪問OSS
      aliyuncli oss Get oss://sample-bucket/2015/01/01/grass.jpg