使用STS授权您的客户端直接访问云存储

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介:

摘要:当阿里云客户使用云存储服务来保存来自其客户端的用户数据时,现有的解决方案都存在一些问题。针对这一场景及问题,本文介绍了一种轻量级的安全解决方案,即使用STS服务授权客户端直接访问云存储。本文阐述了STS方案的基本原理,并且结合具体应用场景,对实施步骤进行了详细的描述。

1 引言

假设您是阿里云客户,您打算使用公共云服务来构建应用系统,比如为您的用户提供安防监控视频存储解决方案。当您使用云存储服务来保存来自客户端的用户数据(如支持wifi的摄像头所记录的数据)时,一种典型设计模式是让客户端通过一个前端代理服务来实现数据的上传下载,如图1所示。

图1

图1. 使用代理服务进行数据中转

这个代理服务需要实现对您的客户端的身份验证、业务规则验证,并提供数据缓存与中转功能。这种设计模式存在一个缺点,当客户端规模较大时,设计这种满足规模扩展且支持大批量事务处理的代理服务是非常困难的,而且研发成本也非常昂贵。

一种改造方案是实现一个轻量级的前端服务(本文称之为AppServer),它只需要实现对客户端的身份认证,并为客户端读写OSS数据的调用请求提供签名授权。如图2所示。

图2

图2. 使用代理服务计算消息签名

这种改造方案使代理服务能有效避免进行数据中转,能让客户端有权限直接操作您的云存储。但这一改造方案也存在一个不足,就是这个代理服务会成为整个解决方案的单点,因为您所有的客户端到OSS的访问请求都需要通过这个代理服务进行签名授权。为了避免单点故障,您需要将这个代理服务设计成支持高并发和高可用的在线服务,这个设计和研发成本也比较昂贵。

针对这一场景及现有方案存在的问题,本文将介绍一种更轻量、更安全的基于STS (Security Token Service)的解决方案——使用STS授权您的客户端直接访问云存储。

2 阿里云STS服务简介

STS是阿里云为客户提供的一种安全令牌管理服务,它是资源访问管理(RAM)产品家族中的一员。通过STS,获得许可的云服务或RAM用户可以自主颁发自定义时效和子权限的一个访问令牌。获得访问令牌的应用程序可以使用令牌直接调用阿里云服务API操作资源。

欲了解STS的更多内容,请参考RAM在线文档: https://docs.aliyun.com/#/pub/ram

3 使用STS授权您的客户端直接访问云存储

基于STS方案的一个顶层描述如图3所示。AppServer是一个轻量级的前端服务。它不必做数据中转工作,也不必为所有的客户端到OSS的访问请求计算消息签名,而只需进行客户端认证并且根据需要为客户端颁发一个具有指定权限、带过期时间的访问令牌,让客户端在一定时间内可以使用该令牌直接操作您的OSS存储。

图3

图3. 基于STS方案的顶层描述

下面我们假设一个场景:您购买的OSS存储桶名称是thevideos,对第1个售出的安防监控设备命名为Device-001,每个设备都有自己的OSS存储目录。比如,只允许设备Device-001上传视频数据到oss://thevideos/d-001/目录下,不同设备之间的数据存储和访问是隔离的。

针对这一具体场景,我们来逐步揭开使用STS授权的面纱。(注意:在进行下文的实际操作之前,请确保您的云账号已经开通RAM服务。)

3.1初始化配置与部署

在使用STS之前,我们需要在RAM中进行适当的配置,具体流程如图4所示。

图4

图4. 配置RAM与部署

请使用您的云账号(或称为主账号)身份登陆阿里云RAM管理控制台,执行以下操作:

Step 1. 为AppServer创建一个RAM用户身份

进入RAM控制台,选择用户管理 -> 新建用户,填写登录名,并选择“为该用户自动生成AccessKey”,选择确定后RAM会创建用户并为该用户创建AccessKeyId和AccessKeySecret(这个密钥后续将无法)。

Step 2. 为AppServer创建一个RAM角色并授权

进入RAM控制台,选择角色管理 -> 新建角色,在创建角色的弹窗中,选择角色类型为用户角色 -> 选择允许扮演此角色的可信身份(这里按默认值选择当前云账号) -> 填写角色名称和备注 ->创建成功。创建角色成功后,可以在角色详情页中查看RoleARN(角色的全局资源名称),比如 acs:ram::1234567890123456:role/appserverrole

然后再给角色授权。在角色详情页中,选择“添加授权策略”,这里选择“AliyunOSSFullAccess”系统授权策略,完成授权。此处若为了进一步限制角色的权限,您也可以选择自定义授权策略来代替“AliyunOSSFullAccess”系统授权策略。

Step 3. 授权AppServer用户可以扮演该角色

进入用户授权策略页面,选择添加授权策略,选择AliyunSTSAssumeRoleAccess系统授权策略即可。

Step 4. 部署AppServer

由于AppServer访问Aliyun服务时是以RAM用户身份,而且需要使用到上述角色的权限,所以部署时需要配置(AccessKeyId, AccessKeySecret)及RoleARN。由于这些配置属于敏感信息,我们建议您对该配置信息进行加密。

3.2 临时授权令牌的颁发与使用

RAM配置完成后,AppServer便可以使用STS为客户端颁发临时授权令牌,具体流程如图5所示。

图5

图5. 临时授权令牌的颁发与使用

我们假设当客户端设备连接到AppServer之后,开始向AppServer请求访问OSS的临时授权令牌。临时授权令牌的颁发和使用流程如下:

Step 1. 获取临时授权令牌

当客户端设备向AppServer请求访问OSS的临时授权临牌时,AppServer调用STS的AssumeRole接口来申请一个满足客户端设备所需的临时授权令牌。AppServer调用AssumeRole的一个Java代码样例如下:

public static void main(String[] args)
{
String accessKeyId = “************”; // RAM用户(代表AppServer)的AccessKeyId
String accessKeySecret = “*******************”; // RAM用户(代表AppServer)的AccessKeySecret
String roleArn = “acs:ram::1234567890123456:role/appserverrole”; //角色的全局资源名称
String roleSessionName = “device-001″; //此处可以自定义令牌的使用者身份,方便你完成操作审计
String sessionAccessPolicy = // 当角色权限过大是,此处可以进一步限制令牌的权限
“{” +
” \”Version\”: \”1\”, ” +
” \”Statement\”: [{" +
" \"Action\": \"oss:PutObject\"" +
" \"Resource\": \"acs:oss:*:*:thevideos/d-001/*\"" +
" \"Effect\": \"Allow\"" +
" }]” +
“}”;

ProtocolType protocolType = ProtocolType.HTTPS; // 必须使用HTTPS协议访问STS服务

try
{
final AssumeRoleResponse response = (AssumeRoleResponse)assumeRole(
accessKeyId,
accessKeySecret,
roleArn,
roleSessionName,
sessionAccessPolicy,
protocolType);

System.out.println(“STS AccessKeyId: ” + response.getCredentials().getAccessKeyId());
System.out.println(“STS AccessKeySecret: ” + response.getCredentials().getAccessKeySecret());
System.out.println(“STS SecurityToken: ” + response.getCredentials().getSecurityToken());
System.out.println(“Expiration: ” + response.getCredentials().getExpiration());
}
catch (ClientException e)
{
System.out.println(“Failed to get a STS token.”);
System.out.println(“Error code: ” + e.getErrCode());
System.out.println(“Error message: ” + e.getErrMsg());
}
}

Step 2. 获得一个临时授权令牌

在上述例子中,AssumeRole执行成功后将返回有效的临时授权令牌。临时授权令牌包括AccessKeyId, AccessKeySecret, SecurityToken以及令牌的过期时间。默认的过期时间是1小时,建议客户端设备每半小时就要请求一次新的临时授权令牌。

Step 3. AppServer安全传递令牌给客户端设备,比如使用HTTPS。

Step 4. 客户端设备可以直接使用令牌访问OSS,新版本OSS SDK已经支持STS授权令牌来访问OSS服务。

4. 安全性分析

避免安全风险的最佳实践原则之一是让每个子系统在运行时都使用最小权限。那么,当一个子系统被攻破时,它不会对全局造成系统性破坏。

(1) 在本文的案例中,您的用户购买设备之后,这个设备就可以由您的用户完全控制。满足该设备工作所需要的最小权限是能上传数据到指定的目录(如oss://thevideos/d-001/ )。由于AppServer的角色拥有OSS完全访问权限,所以您在实施中应使用sessionAccessPolicy来进一步限制STS令牌的权限,从而满足最小授权原则。假设该设备被不可信用户攻破,那么攻击者获得的能力应是最小的。

(2) AppServer也有可能被攻击,所以您也应该对代表AppServer的RAM用户及RAM角色授予最小权限。如果检测到有攻击发生,您可以随时撤销RAM角色的权限。一旦撤销RAM角色的授权,那么AppServer将会立即失去访问权限,而且由AppServer所颁发的那些STS令牌也会立即失去访问权限,即使那些STS令牌还没有过期。

5. 结语

STS是阿里云为客户提供的一种安全令牌管理服务。通过STS,您可以给您的客户端或任意第三方应用颁发一个自定义时效和子权限的访问令牌,客户端或第三方应用可以直接使用STS令牌访问您的云服务。STS可以帮助客户有效解决移动领域、游戏领域或物联网领域的一类典型应用场景或解决方案的最小授权问题,进而有效控制业务上云所带来的信息安全风险。

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
相关文章
|
2月前
|
对象存储
minio临时凭证直传切换到阿里云oss
minio临时凭证直传切换到阿里云oss
178 1
|
存储 安全 对象存储
OSS对接-STS认证模式接入参考文档
背景之前项目中用到文件上传的场景中,都是由服务端做转发到OSS,存在着性能损耗。我们在 高德文件直传能力建设 项目中需要探索使用客户端直连OSS的方式来做,了解到OSS提供了STS认证的方式,通过子账号生成的临时AK作为客户端短期访问OSS的凭证,也不同担心AK安全的问题。具体方案见官方文档:STS临时授权访问OSSOSS可以通过阿里云STS(Security Token Service)进行临时
1919 0
OSS对接-STS认证模式接入参考文档
|
9天前
|
存储 弹性计算 小程序
对象存储OSS产品常见问题之Bucket授权策略中授权用户的id如何解决
对象存储OSS是基于互联网的数据存储服务模式,让用户可以安全、可靠地存储大量非结构化数据,如图片、音频、视频、文档等任意类型文件,并通过简单的基于HTTP/HTTPS协议的RESTful API接口进行访问和管理。本帖梳理了用户在实际使用中可能遇到的各种常见问题,涵盖了基础操作、性能优化、安全设置、费用管理、数据备份与恢复、跨区域同步、API接口调用等多个方面。
32 0
|
19天前
|
弹性计算 运维 安全
访问控制(RAM)|云上程序使用临时凭证的最佳实践
STS临时访问凭证是阿里云提供的一种临时访问权限管理服务,通过STS获取可以自定义时效和访问权限的临时身份凭证,减少长期访问密钥(AccessKey)泄露的风险。本文将为您介绍产品原理,以及具体的使用步骤。
151086 4
|
5月前
|
前端开发 JavaScript Java
阿里云OSS临时凭证前后端配合上传文件
阿里云OSS临时凭证前后端配合上传文件
114 0
|
存储 JSON API
AWS-assumeRole.控制不同token访问不同目录
应用程序需要做sessionToken,提供给用户访问S3的存储资源,但是需要做用户隔离(只能访问自己应用内的资源,不能访问别的用户的资源)
236 0
|
运维 安全 前端开发
oss资源访问连接问题
ssl证书 域名绑定 自有域名
711 0
oss资源访问连接问题
|
存储 监控 安全
谈AK管理之基础篇 - 如何进行访问密钥的全生命周期管理?
我们也常有听说例如AK被外部攻击者恶意获取,或者员工无心从github泄露的案例,最终导致安全事故或生产事故的发生。AK的应用场景极为广泛,因此做好AK的管理和治理就尤为重要了。本文将通过两种AK使用不安全的典型案例,进行分析和介绍。
谈AK管理之基础篇 - 如何进行访问密钥的全生命周期管理?
|
对象存储
实现 STS 方式访问 OSS
实现 STS 方式访问 OSS
实现 STS 方式访问 OSS
|
Java 专有云 开发工具
阿里云基于STS获取临时访问权限使用示例
通过STS服务,您所授权的身份主体(RAM用户或RAM角色)可以获取一个自定义时效和访问权限的临时访问令牌。本文基于JAVA SDK演示如何使用RAM子账户进行STS认证信息的获取以及使用。
3115 0
阿里云基于STS获取临时访问权限使用示例