本文介紹移動應用如何使用RAM角色的臨時安全令牌(STS Token)訪問阿里云資源。

背景信息

企業A開發了一款移動應用(App),并購買了對象存儲(OSS)服務。App需要直連OSS上傳或下載數據,但是App運行在用戶自己的移動設備上,這些設備不受企業A的控制。

企業A有如下要求:

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

解決方案

當移動應用(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-objectmanager
    說明 創建RAM角色時選擇當前云賬號作為受信阿里云賬號,即只允許阿里云賬號A下的RAM用戶來扮演該RAM角色。

    具體操作,請參見創建可信實體為阿里云賬號的RAM角色

    RAM角色創建成功后,在角色基本信息頁面可以查看到該RAM角色的ARN和信任策略。

    • RAM角色的ARN為acs:ram::123456789012****:role/oss-objectmanager
    • RAM角色的信任策略如下。
      說明 以下策略表示只允許阿里云賬號A下的RAM用戶來扮演RAM角色。
      {
          "Statement": [{
              "Action": "sts:AssumeRole",
              "Effect": "Allow",
              "Principal": {
                  "RAM": [
                      "acs:ram::123456789012****:root"
                  ]
              }
          }],
          "Version": "1"
      }
  2. 為RAM角色授權。為RAM角色oss-objectmanager授予OSS的管理權限AliyunOSSFullAccess

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

創建RAM用戶并允許扮演RAM角色

  1. 使用阿里云賬號A為應用服務器創建RAM用戶appserver

    具體操作,請參見創建RAM用戶

  2. 為創建好的RAM用戶授予AliyunSTSAssumeRoleAccess權限,即允許RAM用戶扮演RAM角色。

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

應用服務器獲取臨時安全令牌

  1. 應用服務器使用RAM用戶的訪問密鑰調用STS AssumeRole接口。
    說明 必須配置應用服務器的訪問密鑰,而非阿里云賬號A的訪問密鑰。

    使用阿里云CLI調用AssumeRole的示例如下。

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

限制臨時安全令牌的權限

在線上系統,請務必通過使用Policy參數來根據用戶或設備限制不同臨時安全令牌的權限,避免越權風險。以下是此參數的使用示例。

以下示例表示:只允許下載sample-bucket/2015/01/01/*.jpg

  • 請求示例
    aliyuncli sts AssumeRole --RoleArn acs:ram::123456789012****:role/oss-objectmanager --RoleSessionName client-002 --Policy "{\"Version\":\"1\", \"Statement\": [{\"Effect\":\"Allow\", \"Action\":\"oss:GetObject\", \"Resource\":\"acs:oss:*:*:sample-bucket/2015/01/01/*.jpg\"}]}"
    說明 臨時安全令牌過期時間默認值為3600秒,通過DurationSeconds參數可以設置過期時間。更多信息,請參見AssumeRole - 獲取扮演角色的臨時身份憑證
  • 返回示例
    {
       "AssumedRoleUser": {
           "AssumedRoleId": "391578752573****:client-002", 
           "Arn": "acs:ram::123456789012****:role/oss-objectmanager/client-002"
       }, 
       "Credentials": {
           "AccessKeySecret": "28Co5Vyx2XhtTqj3RJgdud4ntyzrSNdUvNygAj7x****", 
           "SecurityToken": "********", 
           "Expiration": "2016-01-13T15:03:39Z", 
           "AccessKeyId": "STS.FJ6EMcS1JLZgAcBJSTDG1****"
       }, 
       "RequestId": "98835D9B-86E5-4BB5-A6DF-9D3156ABA567"
    }

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