STS临时授权访问OSS设置

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

修改时间 2021-08-18

真诚赞赏,手留余香
赞赏
随机推荐
CSS3 实现 Switch 开关
Nodejs路由实现方式和顺序
Linux 目录结构
Nodejs连接MySQL
网游类似魔兽世界的服务器维护都是在干嘛?
uniapp 开发笔记 (二)
MySQL 中使用 GROUP BY 对后分组的数据进行 COUNT() 统计
Android Studio 导出APK
ThinkPHP v3.1.2版本独立分组功能的解决思路
JS生成 UUID的四种方法
QQ号

微信联系我

夜间模式切换
回到顶部