阅读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 不同企业之间的资源操作与授权管理__使用场景_用户指南_访问控制-阿里云