针对移动设备应用面临的安全、数据直传等问题,您需要对移动设备应用设置访问控制。本文介绍了通过使用身份管理与资源访问控制服务(Resource Access Management,RAM)提供的RAM角色安全令牌对移动设备进行临时授权,以实现使用临时安全令牌直接访问相关资源。

使用场景

企业A开发了一款移动App,并购买了OSS服务。移动App需要直连OSS上传或下载数据,但是移动App运行在用户自己的终端设备上,这些设备并不受A的控制。

企业A有如下需求:
  • 直传数据:企业A不希望所有移动设备都通过自己的服务端应用服务器(AppServer)来进行数据中转,而希望让App能直连OSS上传或下载数据。
  • 安全考虑:企业A不能将访问密钥保存到移动App中,因为移动设备是归属于用户控制,属于不可信任的运行环境。
  • 风险管控:企业A希望将安全风险控制到最小,每个移动App直连OSS时都必须只能访问该用户可见的数据且访问时效也要很短。

临时访问授权解决方案

  1. 云账号A在RAM中创建一个角色,给角色授予合适的权限,并允许AppServer以RAM用户身份使用该角色。详情参见创建角色、用户及授权
  2. 当App需要直连OSS上传或下载数据时,AppServer可以扮演角色(调用STS AssumeRole),获取角色的一个临时安全令牌并传送给App,App就可以使用临时安全令牌直接访问OSS API。详情参见获取、传递角色令牌及访问OSS
  3. AppServer可以在使用角色时进一步限制临时安全令牌的资源操作权限,以更精细地控制每个App的权限。详情参见限制 STS token 权限

创建角色、用户及授权

假设云账号A的AccountID为:11223344。
  1. 云账号A创建RAM角色:oss-readonly,并选择当前云账号作为受信云账号,即只允许云账号A下的RAM用户来扮演该角色。角色创建成功后,在角色详情中可以查看到该角色的基本信息:
    • 角色的Role Arn如下:
      acs:ram::11223344:role/oss-readonly
    • 角色的信任策略(只允许云账号A下的RAM角色来扮演角色)如下:
      {
      "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
         "RAM": [
           "acs:ram::11223344:root"
         ]
       }
      }
      ],
      "Version": "1"
      }
  2. 云账号A给角色授权,向RAM角色(oss-readonly)授予AliyunOSSReadOnlyAccess(只读访问OSS)的权限。具体操作请参考为RAM角色授权
  3. 云账号A为AppServer创建RAM用户身份:Appserver,并为该RAM用户创建AccessKey并授予AliyunSTSAssumeRoleAccess(调用STS AssumeRole接口)的系统策略。

获取、传递角色令牌及访问OSS

App获取并使用角色令牌调用OSS API的操作示意图如下:
  1. AppServer使用已拥有的RAM用户的AccessKey调用STS API AssumeRole
    说明 必须配置AppServer的AccessKey,而非主账号A的AccessKey。
    使用Alibaba Cloud CLI调用AssumeRole的命令示例如下:
    $ aliyun sts AssumeRole --RoleArn acs:ram::11223344:role/oss-readonly --RoleSessionName client-001
     {
         "AssumedRoleUser": {
             "AssumedRoleId": "<your-assumedRole-id>", 
             "Arn": "acs:ram::11223344:role/oss-readonly/client-001"
         }, 
         "Credentials": {
             "AccessKeySecret": "<your-access-key-secret>", 
             "SecurityToken": "<your-security-token>", 
             "Expiration": "2016-01-13T15:02:37Z", 
             "AccessKeyId": "<your-access-key-id>"
         }, 
         "RequestId": "E1779AAB-E7AF-47D6-A9A4-53128708B6CE"
     }
  2. AppServer获取并解析临时凭证。
    • AppServer从AssumeRole返回的临时凭证中获取AccessKey ID、AccessKey Secret和STS token。
    • 考虑到STS token过期时间较短,如果应用业务需要一个较长的过期时间,需要AppServer重新颁发新的STS token(例如每隔1800秒颁发一次STS token)。
  3. AppServer将临时凭证传递给App。
  4. App使用STS token直接访问云服务的API(例如 OSS)。以下是Alibaba Cloud CLI使用STS token访问OSS对象的操作命令(颁发给client-002的STS token):
    说明 配置STS token语法:
    $ aliyun oss Config --host  --accessid  --accesskey  --sts_token
    $ aliyun oss Config --host oss.aliyuncs.com --accessid <your-access-key-id> --accesskey <your-access-key-secret> --sts_token <your-sts-token>
    $ aliyun oss Get oss://sample-bucket/2015/01/01/grass.jpg grass.jpg

限制 STS token 权限

上述步骤中,调用AssumeRole时没有指定Policy参数,意味着该STS token拥有oss-readonly的所有权限。如果需要进一步限制STS token的权限(例如:只允许访问sample-bucket/2015/01/01/*.jpg),那么可以通过设置如下Policy参数:
$ aliyun 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": "<your-assumedRole-id>", 
       "Arn": "acs:ram::11223344:role/oss-readonly/client-002"
   }, 
   "Credentials": {
       "AccessKeySecret": "<your-access-key-secret>", 
       "SecurityToken": "<your-security-token>", 
       "Expiration": "2016-01-13T15:03:39Z", 
       "AccessKeyId": "<your-access-key-id>"
   }, 
   "RequestId": "98835D9B-86E5-4BB5-A6DF-9D3156ABA567"
}
上述STS token的默认过期时间为3600秒,用户还可以通过DurationSeconds参数来限制STS token的过期时间(最长不超过3600秒)。