OSS可以通过阿里云STS(Security Token Service)进行临时授权访问。通过STS,您可以为第三方应用或子用户(即用户身份由您自己管理的用户)颁发一个自定义时效和权限的访问凭证。
使用场景
对于您本地身份系统所管理的用户,例如您的App的用户,将这部分用户称为联盟用户。通过阿里云STS服务为阿里云账号(或RAM用户)提供临时访问权限管理。您不需要透露云账号(或RAM用户)的长期密钥(如登录密码、AccessKey),只需要生成一个临时访问凭证给联盟用户使用即可。这个凭证的访问权限及有效期限都可以由您自定义。您不需要关心权限撤销问题,临时访问凭证过期后会自动失效。
实现原理
以一个移动App举例。假设您是一个移动App开发者,打算使用阿里云OSS服务来保存App的终端用户数据,并且要保证每个App用户之间的数据隔离,防止一个App用户获取到其他App用户的数据。您可以使用STS授权用户直接访问OSS。
使用STS授权用户直接访问OSS的流程如下:
1,App用户登录。App用户和云账号无关,它是App的终端用户,App服务器支持App用户登录。对于每个有效的App用户来说,需要App服务器能定义出每个App用户的最小访问权限。
2,App服务器请求STS服务获取一个安全令牌(SecurityToken)。在调用STS之前,App服务器需要确定App用户的最小访问权限(用RAM Policy来自定义授权策略)以及凭证的过期时间。然后通过扮演角色(AssumeRole)来获取一个代表角色身份的安全令牌(SecurityToken)。
3,STS返回给App服务器一个临时访问凭证,包括一个安全令牌(SecurityToken)、临时访问密钥(AccessKeyId和AccessKeySecret)以及过期时间。
4,App服务器将临时访问凭证返回给App客户端,App客户端可以缓存这个凭证。当凭证失效时,App客户端需要向App服务器申请新的临时访问凭证。例如,临时访问凭证有效期为1小时,那么App客户端可以每30分钟向App服务器请求更新临时访问凭证。
5,App客户端使用本地缓存的临时访问凭证去请求OSS API。OSS收到访问请求后,会通过STS服务来验证访问凭证,正确响应用户请求。
操作步骤
您可以通过OSS SDK与STS SDK的结合使用,实现使用STS临时授权访问OSS。假设有一个名为ram-test的Bucket用于存储用户数据,现将通过用户子账号(RAM用户)结合STS实现OSS权限控制访问。
第一步 创建子账号
RAM控制台 》 人员管理菜单下 》 新建用户 》 选择编程访问 》 生成AccessKey ID 和 AccessKey Secret
选中创建的子账号,单击添加权限。
在添加权限页面,为已创建的子账号添加 AliyunSTSAssumeRoleAccess 权限。
第二步 创建权限策略
RAM控制台 》权限管理菜单 》新建权限策略 》脚本配置
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:PutObject" ], "Resource": [ "acs:oss:*:*:bucket-name/test", "acs:oss:*:*:bucket-name/test/*" //限制到最后一级可访问路径。 ] } ] }
第三步 创建角色ARN
RAM角色管理 》 新建RAM角色,选择实体类型为阿里云账号 》选择云账号为当前云账号。
为角色授权 》添加权限页面,选择自定义权限策略,添加步骤2中创建的权限策略。
角色的ID。页面如下图所示:
第四步,可以使用STS
var policy = '{ \ "Statement": [ \ { \ "Effect": "Allow", \ "Action": "oss:*",\ "Resource": [ \ "acs:oss:*:*:palace", \ "acs:oss:*:*:palace/*" \ ] \ }\ ],\ "Version": "1"\ }'; console.log({ accessKeyId: config.oss.ram1.accessKeyId, accessKeySecret: config.oss.ram1.accessKeySecret }); const client = new STS({ accessKeyId: config.oss.ram1.accessKeyId, accessKeySecret: config.oss.ram1.accessKeySecret }); var result = await client.assumeRole(config.oss.ram1.roleArn, policy, config.oss.ram1.tokenExpireTime); var response = { AccessKeyId: result.credentials.AccessKeyId, AccessKeySecret: result.credentials.AccessKeySecret, SecurityToken: result.credentials.SecurityToken, Expiration: result.credentials.Expiration } return ctx.body = response;
备注:
创建用户,创建权限,创建角色。用户和角色都要关联创建的权限即可。
参考:
https://help.aliyun.com/document_detail/32068.html
修改时间 2024-03-05