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

真诚赞赏,手留余香
赞赏
随机推荐
Photoshop 色彩基础
PHP 一次查询生成二维 Json
Parameter 一个轻量的 Node.js 数据验证工具
PHP把时间转换成几分钟前、几小时前、几天前
手绘板如何画好线条
Cordova 权限问题 Error: spawn EACCES
MAC 环境下初始化mysql root 密码
Express.js 日志模块
Chrome开发者工具的实用技巧(译)
PHP判断file框是否已选择文件