STS临时授权访问OSS
STS临时授权访问OSS
OSS 可以通过阿里云 STS (Security Token Service) 进行临时授权访问。阿里云 STS 是为云计算用户提供临时访问令牌的Web服务。通过 STS,您可以为第三方应用或子用户(即用户身份由您自己管理的用户)颁发一个自定义时效和权限的访问凭证。
使用场景
对于您本地身份系统所管理的用户,比如您的 App 的用户、您的企业本地账号、第三方 App ,将这部分用户称为联盟用户。这些联盟用户可能需要直接访问 OSS 资源。此外,还可以是您创建的能访问您的阿里云资源应用程序的用户。
对于这部分联盟用户,通过阿里云 STS 服务为阿里云账号(或 RAM 用户)提供短期访问权限管理。您不需要透露云账号(或 RAM 用户)的长期密钥(如登录密码、AccessKey),只需要生成一个短期访问凭证给联盟用户使用即可。这个凭证的访问权限及有效期限都可以由您自定义。您不需要关心权限撤销问题,访问凭证过期后会自动失效。
通过 STS 生成的凭证包括安全令牌(SecurityToken)、临时访问密钥(AccessKeyId, AccessKeySecret)。使用AccessKey 方法与您在使用阿里云账户或 RAM 用户 AccessKey 发送请求时的方法相同。需要注意的是在每个向 OSS 发送的请求中必须携带安全令牌。
实现原理
以一个移动 App 举例。假设您是一个移动 App 开发者,打算使用阿里云 OSS 服务来保存App 的终端用户数据,并且要保证每个 App 用户之间的数据隔离,防止一个 App 用户获取到其它 App 用户的数据。你可以使用 STS 授权用户直接访问 OSS。
使用 STS 授权用户直接访问 OSS 的流程如下:
- App 用户登录。App 用户和云账号无关,它是 App 的终端用户,AppServer 支持 App 用户登录。对于每个有效的 App 用户来说,需要 AppServer 能定义出每个 App 用户的最小访问权限。
- AppServer 请求 STS 服务获取一个安全令牌(SecurityToken)。在调用 STS 之前,AppServer 需要确定 App 用户的最小访问权限(用 Policy 语法描述)以及授权的过期时间。然后通过扮演角色(AssumeRole)来获取一个代表角色身份的安全令牌。
- STS 返回给 AppServer 一个有效的访问凭证,包括一个安全令牌(SecurityToken)、临时访问密钥(AccessKeyId, AccessKeySecret)以及过期时间。
- AppServer 将访问凭证返回给 ClientApp。ClientApp 可以缓存这个凭证。当凭证失效时,ClientApp 需要向 AppServer 申请新的有效访问凭证。比如,访问凭证有效期为1小时,那么 ClientApp 可以每 30 分钟向 AppServer 请求更新访问凭证。
- ClientApp 使用本地缓存的访问凭证去请求 Aliyun Service API。云服务会感知 STS 访问凭证,并会依赖 STS 服务来验证访问凭证,正确响应用户请求。
STS 安全令牌、角色管理和使用相关内容详情,请参考 RAM 角色管理。调用 STS 服务接口AssumeRole来获取有效访问凭证即可。
操作步骤
假设有一个名为 ram-test 的 Bucket 用于存储用户数据,现将利用用户子账号结合 STS 实现 OSS 权限控制访问。
您可以通过 OSS SDK 与 STS SDK 的结合使用,实现使用 STS 临时授权访问 OSS 实例。
- 创建用户子账号。
- 登录 RAM 访问控制管理控制台。
- 在 RAM 访问控制页面,单击用户。
- 在用户页面,单击新建用户。
- 在新建用户页面,用户账号信息填写登录名称、显示名称,访问方式下勾选编程访问,并单击确定。
- 单击权限管理 > 添加权限。
- 在添加权限页面,为已创建子账号添加 AliyunSTSAssumeRoleAccess 权限。
说明 尽量不要赋予子账号其他任意权限,因为在扮演角色的时候会自动获得被扮演角色的所有(部分)权限。
- 创建权限策略。
- 登录 RAM 访问控制管理控制台。
- 在 RAM 访问控制页面,单击权限策略管理。
- 单击新建权限策略。
- 在新建自定义权限策略页面,填写策略名称、备注,配置模式选择可视化配置或脚本配置。
以脚本配置为例,对 ram-test 添加 GetObject与 PutObject等权限,在 策略内容中配置脚本如下:
{
"Statement": [
{
"Action": [
"oss:GetObject",
"oss:PutObject",
"oss:DeleteObject",
"oss:ListParts",
"oss:AbortMultipartUpload",
"oss:ListObjects"
],
"Effect": "Allow",
"Resource": [
"acs:oss:*:*:ram-test/*",
"acs:oss:*:*:ram-test"
]
}
],
"Version": "1"
}
- 创建角色。
- 登录 RAM 访问控制管理控制台。
- 在 RAM 访问控制页面,单击RAM 角色管理。
- 在 RAM 角色管理页面,单击新建 RAM 角色。
- 在新建 RAM 角色页面,填写 RAM 角色名称,本示例 RAM 角色名称为 RamOssTest,选择可信实体类型及受信云账号 ID 保留默认选项。
- 单击已创建 RAM 角色 RamOssTest 右侧对应的添加权限 。
- 在添加权限页面,选择自定义权限策略,添加步骤 2 中创建的策略 Ramtest。
添加策略后,页面如下图所示:
说明 ARN 代表需要扮演角色的 ID。
- 通过 STS API 获取 STS AK 与 SecurityToken。
通过调用 STS SDK 请求 STS 服务获取一个安全令牌。STS SDK 的安装及使用详见STS Java SDK安装及使用。
以 STS Java SDK 为例:<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-sts</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>3.5.0</version>
</dependency>@ResponseBody
@RequestMapping("/sts")
public AssumeRoleResponse.Credentials sts(HttpServletRequest req) { AssumeRoleResponse.Credentials credentials = null;
String endpoint = "sts.cn-beijing.aliyuncs.com";
String accessKeyId = "LTAIz5f---Pg8";
String accessKeySecret = "yO7yzqxCZjgWCY----8l0fFHaPd3Gwug";
String roleArn = "acs:ram::184810807023---6:role/ggband";
String roleSessionName = "AliyunDMSRol--ePolicy";
String policy = "{\n" +
" \"Statement\": [\n" +
" {\n" +
" \"Action\": [\n" +
" \"oss:GetObject\",\n" +
" \"oss:PutObject\",\n" +
" \"oss:DeleteObject\",\n" +
" \"oss:ListParts\",\n" +
" \"oss:AbortMultipartUpload\",\n" +
" \"oss:ListObjects\"\n" +
" ],\n" +
" \"Effect\": \"Allow\",\n" +
" \"Resource\": [\n" +
" \"acs:oss:*:*:ram-test/*\",\n" +
" \"acs:oss:*:*:ram-test\"\n" +
" ]\n" +
" }\n" +
" ],\n" +
" \"Version\": \"1\"\n" +
"}";
try {
// 添加endpoint(直接使用STS endpoint,前两个参数留空,无需添加region ID)
DefaultProfile.addEndpoint("", "", "Sts", endpoint);
// 构造default profile(参数留空,无需添加region ID)
IClientProfile profile = DefaultProfile.getProfile("", accessKeyId, accessKeySecret);
// 用profile构造client
DefaultAcsClient client = new DefaultAcsClient(profile);
final AssumeRoleRequest request = new AssumeRoleRequest();
request.setMethod(MethodType.POST);
request.setRoleArn(roleArn);
request.setRoleSessionName(roleSessionName);
request.setPolicy(policy); // Optional
request.setProtocol(ProtocolType.HTTPS); // 必须使用HTTPS协议访问STS服务);
final AssumeRoleResponse response = client.getAcsResponse(request);
credentials = response.getCredentials();
System.out.println("Expiration: " + credentials.getExpiration());
System.out.println("Access Key Id: " + credentials.getAccessKeyId());
System.out.println("Access Key Secret: " + credentials.getAccessKeySecret());
System.out.println("Security Token: " + credentials.getSecurityToken());
System.out.println("RequestId: " + response.getRequestId());
} catch (ClientException e) {
System.out.println("Failed:");
System.out.println("Error code: " + e.getErrCode());
System.out.println("Error message: " + e.getErrMsg());
System.out.println("RequestId: " + e.getRequestId());
}
return credentials;
}5. 前端代码如下:(以上传oss文件为例)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Oss demo</title> <input type="file" name="picFieldName" id="picFieldId" onchange="uploadPic(this)"/> <!-- 兼容ie -->
<script src="https://www.promisejs.org/polyfills/promise-6.1.0.js"></script>
<!-- oss 上传文件 JavaScript 库 -->
<script src="http://gosspublic.alicdn.com/aliyun-oss-sdk-4.3.0.min.js"></script>
<script src="../../js/jquery.min.js"></script>
<script> function uploadPic(obj) { //请求自己后台 获取sts等相关信息后,调用oss-sdk方法直传oss
$.ajax({
url: "/ueditor/sts", success: function (result) {
var client = new OSS.Wrapper({
region: 'oss-cn-beijing',
accessKeyId: result.accessKeyId,
accessKeySecret: result.accessKeySecret,
bucket: 'rem-test',
stsToken: result.securityToken });
var file = obj.files[0];//获取文件流
var val = obj.value;
var suffix = val.substr(val.indexOf("."));
var storeAs = "tally_ueditor/" + timestamp() + suffix;
console.log(file.name + ' => ' + storeAs);
client.multipartUpload(storeAs, file).then(function (result) {
console.log("result:" + JSON.stringify(result));
}).catch(function (err) {
console.log("err:" + JSON.stringify(err)); });
}
}); } /**
* 生成文件名
* @returns
*/
function timestamp() {
var time = new Date();
var y = time.getFullYear();
var m = time.getMonth() + 1;
var d = time.getDate();
var h = time.getHours();
var mm = time.getMinutes();
var s = time.getSeconds();
console.log(y);
return "" + y + add0(m) + add0(d) + add0(h) + add0(mm) + add0(s);
} function add0(m) {
return m < 10 ? '0' + m : m;
}
</script>
</head>
<body> </body>
</html>6、前端上传时出现403错误,请进行跨域设置
STS临时授权访问OSS的更多相关文章
- js实现OSS上传图片,STS临时授权访问OSS
1. 引入aliyun-oss-sdk.min.js <script type="text/javascript" src="/static/js/common/a ...
- golang对接阿里云私有Bucket上传图片、授权访问图片
golang对接阿里云私有Bucket上传图片.授权访问图片 1.为什么要设置私有bucket 公共读写:互联网上任何用户都可以对该 Bucket 内的文件进行访问,并且向该 Bucket 写入数据. ...
- 如何限制用户仅通过HTTPS方式访问OSS?
一.当前存在的问题 当前OSS支持用户使用HTTPS/HTTP协议访问Bucket.但由于HTTP存在安全漏洞.大型企业客户都要求使用HTTPS方式访问OSS,并且拒绝HTTP访问请求. 目前OSS可 ...
- Zookeeper未授权访问测试
前言 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提 ...
- 基于Redis未授权访问的挖矿蠕虫分析
0x01 攻击方式 利用的是通用漏洞入侵服务器并获得相关权限,从而植入挖矿程序再进行隐藏. 通过对脚本的分析,发现黑客主要是利用 Redis未授权访问漏洞进行入侵.脚本里有个python函数. imp ...
- Jboss未授权访问漏洞复现
一.前言 漏洞原因:在低版本中,默认可以访问Jboss web控制台(http://127.0.0.1:8080/jmx-console),无需用户名和密码. 二.环境配置 使用docker搭建环境 ...
- ZooKeeper未授权访问漏洞确认与修复
目录 探测2181 探测四字命令 用安装好zk环境的客户端连接测试 修复 修复步骤一 关闭四字命令 修复步骤二 关闭未授权访问 zookeeper未授权访问测试参考文章: https://www.cn ...
- mongodb未授权访问漏洞
catalogue . mongodb安装 . 未授权访问漏洞 . 漏洞修复及加固 . 自动化检测点 1. mongodb安装 apt-get install mongodb 0x1: 创建数据库目录 ...
- 本地hosts临时域名访问
当刚购买了空间,域名和空间还未进行绑定,可以用临时域名访问主机调试网站.您可通过本地hosts指向访问网站,具体方法如下: 特别说明:设置以后,只有当前设置的电脑才能访问,其他电脑访问无效. 第一步: ...
随机推荐
- 引擎设计跟踪(九.14.2j) TableView工具填坑以及多国语言
Blade的UI都是预定义的接口, 然后由插件来负责实现, 目前只有MFC的插件. 最近加上了TableView的视图, 用于一些文件的查看和编辑, 比如前面在文件包的笔记中提到需写一个package ...
- 货币转换 I
描述 人民币和美元是世界上通用的两种货币之一,写一个程序进行货币间币值转换,其中: 人民币和美元间汇率固定为:1美元 = 6.78人民币. 程序可以接受人民币或美元输入,转换为美元或人民币输出.人民币 ...
- 前端基础:canvas概述
1:并不是所有的浏览器都支持canvas,若是不支持则浏览器会弹出 <canvas>Update your browser to enjoy canvas</canvas> 浏 ...
- Git与Github的连接与使用
下面继续,使用git 将项目上传到GitHub上 首先要有GitHub账号,这就不用说了,没有的先注册,地址:https://github.com 没有仓库的话,先新创建一个仓库 填写新仓库名称,备注 ...
- flutter 容器 几种写法
1.Stack: 取代线性布局 (译者语:和Android中的LinearLayout相似),Stack允许子 widget 堆叠, 你可以使用 Positioned 来定位他们相对于Stack的上下 ...
- 3、Linux连接oracle
su - oracle //登录sqlplus sqlplus /nolog //连接orcale conn xx/xx;(用户名/密码) 或者 connect /as sysdba;
- python selenium-webdriver 登录验证码的处理(十二)
很多系统为了防止坏人,会增加各样形式的验证码,做测试最头痛的莫过于验证码的处理,验证码的处理一般分为三种方法 1.开发给我们设置一个万能的验证码: 2.开发将验证码给屏蔽掉: 3.自己识别图片的上的千 ...
- shibie
var mStream: TMemoryStream; vcode: ..] of AnsiChar; buffer: array of AnsiChar; begin mStream := TMem ...
- Skin Microstructure Deformation with Displacement Map Convolution项目小结
经常有人问我你最近在干什么,但一句话真的很难说明白,最近两个月一直在尝试将Skin Microstructure Deformation with Displacement Map Convoluti ...
- Azure CosmosDB (12) 创建Cosmos DB并执行查询语句
<Windows Azure Platform 系列文章目录> The SQL API supports the following aggregate functions. SUM an ...