针对移动设备应用面临的安全、数据直传等问题,您需要对移动设备应用设置访问控制。本文介绍了通过使用身份管理与资源访问控制服务(Resource Access Management,RAM)提供的RAM角色安全令牌对移动设备进行临时授权,以实现使用临时安全令牌直接访问相关资源。
使用场景
企业A开发了一款移动App,并购买了OSS服务。移动App需要直连OSS上传或下载数据,但是移动App运行在用户自己的终端设备上,这些设备并不受A的控制。
企业A有如下需求:
- 直传数据:企业A不希望所有移动设备都通过自己的服务端应用服务器(AppServer)来进行数据中转,而希望让App能直连OSS上传或下载数据。
- 安全考虑:企业A不能将访问密钥保存到移动App中,因为移动设备是归属于用户控制,属于不可信任的运行环境。
- 风险管控:企业A希望将安全风险控制到最小,每个移动App直连OSS时都必须只能访问该用户可见的数据且访问时效也要很短。
临时访问授权解决方案
- 云账号A在RAM中创建一个角色,给角色授予合适的权限,并允许AppServer以RAM用户身份使用该角色。详情参见创建角色、用户及授权。
- 当App需要直连OSS上传或下载数据时,AppServer可以扮演角色(调用STS AssumeRole),获取角色的一个临时安全令牌并传送给App,App就可以使用临时安全令牌直接访问OSS API。详情参见获取、传递角色令牌及访问OSS 。
- AppServer可以在使用角色时进一步限制临时安全令牌的资源操作权限,以更精细地控制每个App的权限。详情参见限制 STS token 权限 。
创建角色、用户及授权
假设云账号A的AccountID为:11223344。
- 云账号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" }
- 角色的Role Arn如下:
- 云账号A给角色授权,向RAM角色(oss-readonly)授予AliyunOSSReadOnlyAccess(只读访问OSS)的权限。具体操作请参考为RAM角色授权。
- 云账号A为AppServer创建RAM用户身份:Appserver,并为该RAM用户创建AccessKey并授予
AliyunSTSAssumeRoleAccess
(调用STS AssumeRole接口)的系统策略。
获取、传递角色令牌及访问OSS
App获取并使用角色令牌调用OSS API的操作示意图如下:
- 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" }
- AppServer获取并解析临时凭证。
- AppServer从AssumeRole返回的临时凭证中获取AccessKey ID、AccessKey Secret和STS token。
- 考虑到STS token过期时间较短,如果应用业务需要一个较长的过期时间,需要AppServer重新颁发新的STS token(例如每隔1800秒颁发一次STS token)。
- AppServer将临时凭证传递给App。
- 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秒)。