閱讀128 返回首頁    go 汽車大全


針對移動App的臨時授權管理__使用場景_用戶指南_訪問控製-阿裏雲

場景描述

企業A開發了一款移動App,並購買了OSS服務。移動App需要上傳數據到OSS(或從OSS下載數據),A不希望所有App都通過AppServer來進行數據中轉,而希望讓App能直連OSS上傳/下載數據。由於移動App運行在用戶自己的終端設備上,這些設備並不受A的控製。出於安全考慮,A不能將訪問密鑰保存到移動App中。A希望將安全風險控製到最小,比如,每個移動App直連OSS時都必須使用最小權限的訪問令牌,而且訪問時效也要很短(比如30分鍾)。

需求說明

  • 移動App需要直傳數據到OSS,不需要經過數據proxy
  • 不能將AK交給移動App,因為移動設備歸屬於您的用戶來控製(所以並不可信),最佳實踐是使用帶過期時間的訪問令牌
  • 每個移動App的訪問權限都可以限製,支持到OSS對象的粒度

解決方法:使用RAM角色令牌

1. 授權流程

步驟1:A創建角色

(1) 進入RAM控製台 -> 角色管理 -> 創建角色。

(2) 在創建角色彈窗中:選擇“用戶角色” -> 選擇“當前雲賬號” -> 填寫角色名稱(假設為oss-readonly)和備注 -> 確定創建角色。

創建角色成功後,可以在角色詳情中查看到該角色的基本信息,比如角色的全局名稱Arn如下:

acs:ram::11223344:role/oss-readonly

角色的信任策略(隻允許A自己來扮演角色)如下:

{
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Effect": "Allow",
      "Principal": {
        "RAM": [
          "acs:ram::11223344:root"
        ]
      }
    }
  ],
  "Version": "1"
}

步驟2:A給角色授權,即給角色綁定合適的授權策略。

(1) 在上一步的創建角色完成時,可以直接按照引導進入授權操作界麵;也可以選擇進入角色詳情頁麵,進入“編輯授權策略”進入授權操作界麵。

(2) 在授權操作界麵上,可以選擇係統授權策略,如AliyunOSSReadOnlyAccess,然後點擊確定。

步驟3:A為AppServer創建一個RAM用戶身份,並授權該用戶可以扮演上述角色。

(1) 進入RAM控製台 -> 用戶管理 -> 創建用戶,輸入用戶名,比如appserver,為該用戶創建AccessKey;

(2) 創建用戶後,進入用戶詳情頁 -> 用戶授權策略。在編輯授權策略窗口中,選擇係統授權策略,如AliyunSTSAssumeRoleAccess,然後點擊確定。

2. AppServer頒發STS-Token訪問資源

RAM角色身份訪問

步驟1:AppServer使用RAM用戶appserver的AccessKey調用STS AssumeRole

比如,使用aliyuncli來調用AssumeRole的方法(注意:必須配置appserver的AccessKey,而不允許是主賬號A的AccessKey):

$ aliyuncli sts AssumeRole --RoleArn acs:ram::11223344:role/oss-readonly --RoleSessionName client-001

{
    "AssumedRoleUser": {
        "AssumedRoleId": "391578752573972854:client-001", 
        "Arn": "acs:ram::11223344:role/oss-readonly/client-001"
    }, 
    "Credentials": {
        "AccessKeySecret": "93ci2umK1QKNEja6WGqi1Ba7Q2Fv9PwxZqtVF2VynUvz", 
        "SecurityToken": "CAES6AIIARKAAUiwSHpkD3GXRMQk9stDr3YSVbyGqanqkS+fPlEEkjZ+dlgFnGdCI2PV93jksole8ijH8dHJrHRA5JA1YCGsfX5hrzcNM37Vr4eVdWFVQhoCw0DXBpHv//ZcITp+ELRr4MHsnyGiErnDsXLkI7q/sbuWg6PACZ/jzQfEWQb/f7Y1Gh1TVFMuRjEzR2pza1hUamszOGRCWTZZeEp0WEFaayISMzkxNTc4NzUyNTczOTcyODU0KgpjbGllbnQtMDAxMKT+lIHBKjoGUnNhTUQ1QkoKATEaRQoFQWxsb3cSGwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aAwoBKhIfCg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaAwoBKkoFNDMyNzRSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzkxNTc4NzUyNTczOTcyODU0cgllY3MtYWRtaW544Mbewo/26AE=", 
        "Expiration": "2016-01-13T15:02:37Z", 
        "AccessKeyId": "STS.F13GjskXTjk38dBY6YxJtXAZk"
    }, 
    "RequestId": "E1779AAB-E7AF-47D6-A9A4-53128708B6CE"
}

注意,上述AssumeRole調用時沒有指定Policy參數,那麼意味著該STS-Token擁有oss-readonly的所有權限。如果您的應用場景需要對STS-Token的權限進一步限製,比如隻允許訪問“sample-bucket/2015/01/01/*.jpg”,那麼可以通過Policy參數對STS-Token的權限進一步限製。比如,

$ aliyuncli sts AssumeRole --RoleArn acs:ram::11223344: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": "391578752573972854:client-002", 
        "Arn": "acs:ram::11223344:role/oss-readonly/client-002"
    }, 
    "Credentials": {
        "AccessKeySecret": "28Co5Vyx2XhtTqj3RJgdud4ntyzrSNdUvNygAj7xEMow", 
        "SecurityToken": "CAESnQMIARKAASJgnzMzlXVyJn4KI+FsysaIpTGm8ns8Y74HVEj0pOevO8ZWXrnnkz4a4rBEPBAdFkh3197GUsprujsiU78FkszxhnQPKkQKcyvPihoXqKvuukrQ/Uoudk31KAJEz5o2EjlNUREcxWjRDRSISMzkxNTc4NzUyNTczOTcyODU0KgpjbGllbnQtMDAxMKmZxIHBKjoGUnNhTUQ1Qn8KATEaegoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOkdldE9iamVjdBJICg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaLAoqYWNzOm9zczoqOio6c2FtcGxlLWJ1Y2tldC8yMDE1LzAxLzAxLyouanBnSgU0MzI3NFIFMjY4NDJaD0Fzc3VtZWRSb2xlVXNlcmAAahIzOTE1Nzg3NTI1NzM5NzI4NTRyCWVjcy1hZG1pbnjgxt7Cj/boAQ==", 
        "Expiration": "2016-01-13T15:03:39Z", 
        "AccessKeyId": "STS.FJ6EMcS1JLZgAcBJSTDG1Z4CE"
    }, 
    "RequestId": "98835D9B-86E5-4BB5-A6DF-9D3156ABA567"
}

此外,上述STS-Token的默認過期時間為3600秒,用戶還可以通過DurationSeconds參數來限製STS-Token的過期時間(最長不超過3600秒)。

步驟2:AppServer獲取並解析Credentials

AppServer從AssumeRole返回的Credentials中獲取AccessKeyId、AccessKeySecret和SecurityToken。考慮到STS-Token過期時間較短,如果應用業務需要一個較長的過期時間,需要AppServer重新頒發新的STS-Token(比如每隔1800秒頒發一次STS-Token)。

步驟3:AppServer將STS-Token安全傳遞給AppClient

步驟4:AppClient使用STS-Token直接訪問雲服務的API(比如OSS)

下麵是aliyuncli使用STS-Token訪問OSS對象的操作命令(頒發給client-002的STS-Token):

配置STS-Token語法:aliyuncli oss Config --host <OssEndPoint> --accessid <AccessKeyId> --accesskey <AccessKeySecret> --sts_token <SecurityToken>

$ aliyuncli oss Config --host oss.aliyuncs.com --accessid STS.FJ6EMcS1JLZgAcBJSTDG1Z4CE --accesskey 28Co5Vyx2XhtTqj3RJgdud4ntyzrSNdUvNygAj7xEMow  --sts_token CAESnQMIARKAASJgnzMzlXVyJn4KI+FsysaIpTGm8ns8Y74HVEj0pOevO8ZWXrnnkz4a4rBEPBAdFkh3197GUsprujsiU78FkszxhnQPKkQKcyvPihoXqKvuukrQ/Uoudk31KAJEz5o2EjlNUREcxWjRDRSISMzkxNTc4NzUyNTczOTcyODU0KgpjbGllbnQtMDAxMKmZxIHBKjoGUnNhTUQ1Qn8KATEaegoFQWxsb3cSJwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aDwoNb3NzOkdldE9iamVjdBJICg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaLAoqYWNzOm9zczoqOio6c2FtcGxlLWJ1Y2tldC8yMDE1LzAxLzAxLyouanBnSgU0MzI3NFIFMjY4NDJaD0Fzc3VtZWRSb2xlVXNlcmAAahIzOTE1Nzg3NTI1NzM5NzI4NTRyCWVjcy1hZG1pbnjgxt7Cj/boAQ==

訪問OSS對象

$ aliyuncli oss Get oss://sample-bucket/2015/01/01/grass.jpg grass.jpg

更多參考材料

關於移動應用直傳場景的更多參考材料

最後更新:2016-11-23 16:04:01

  上一篇:go 企業子賬號管理與分權__使用場景_用戶指南_訪問控製-阿裏雲
  下一篇:go 不同企業之間的資源操作與授權管理__使用場景_用戶指南_訪問控製-阿裏雲