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

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

1 引言

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

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

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

一种改造方案是实现一个轻量级的前端服务(本文称之为AppServer),它只需要实现对客户端的身份认证,并为客户端读写OSS数据的调用请求提供签名授权。如图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. 基于STS方案的顶层描述

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

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

3.1初始化配置与部署

在使用STS之前,我们需要在RAM中进行适当的配置,具体流程如图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. 临时授权令牌的颁发与使用

我们假设当客户端设备连接到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可以帮助客户有效解决移动领域、游戏领域或物联网领域的一类典型应用场景或解决方案的最小授权问题,进而有效控制业务上云所带来的信息安全风险。

时间: 2025-01-21 14:41:16

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

云存储的访问控制措施应如何解决?

如今,不管在什么领域,企业亦或是家庭,云存储正成为一种流行产品.就像亚马逊S3.Box.Copiun和Thru等服务拥有功能丰富的产品,使用户可以轻松地备份.同步和存储文档和文件. 尽管对于普通消费者来说,在使用这类服务时,不需要有太多的顾虑,但其实在选择云存储服务时,需要解决很多从加密到数据生命周期管理,组织等安全方面的问题.企业的新兴领域关注于定义和控制访问方法以及定义实现基于云存储的控制 .本篇文章主要介绍为什么云存储访问控制是一个重要问题,以及在制定和实施云存储访问控制和架构时,企业应考

云存储访问控制措施实战经验

尽管普通消费者在使用这类服务时,不需要有太多的顾虑,但是,在选择云存储服务时,从加密到数据生命周期管理,需要解决很多安全方面的问题.企业的新兴领域关注于定义和控制访问方法以及定义实现基于云存储的控制 . 在本文中,我们将解释为什么云存储访问控制是一个重要问题,以及在制定和实施云存储访问控制和架构时,企业应考虑哪些问题. 我们还将讨论,在云提供商情境下,如何评估访问控制. 云存储访问控制措施 无论是云提供商管理员还是企业用户,管理访问控制应该是首要考虑的问题. 例如,Jacob Williams在

云存储中双备份数据的安全访问

云存储中双备份数据的安全访问 李红卫 叶飞跃 古春生 于志敏 景征骏 在云存储中,云服务提供商能否保证客户数据的完整性和私密性是每一位客户关心的问题如何恢复 因设备故障或管理不当而丢失的数据,如何防范敌手对客户的攻击篡改数据或窥视客户访问云存储的地址序列,这些都是客户存储重要且私密数据时须考虑的问题. 云存储中双备份数据的安全访问

Windows 2008添加且制成“NFS服务器”角色后与Unix客户端匿名访问常见问题

在复杂的主机与网络环境中,我们可能会接触到多种主机与操作系统,配合Windows Server 2008 R2的原生"NFS服务器"功能可以让这样的复杂操作系统更方便应用. 然而面对网络上众多的帮助指南和设置向导难免会造成一些操作不够全面,本博文进行相关尝试后对其中的匿名访问的少支持进行一些弥补,同时也欢迎诸多网友的指正. 微软官方网站上提供相应NFS服务器配置指南,如果您是初次使用可以参考这个链接:http://technet.microsoft.com/zh-cn/library/

向日葵客户端快速访问码连接不上,提示主机不存在或不在线

  向日葵客户端快速访问码连接不上,提示找不到主机,提示主机不存在或不在线 这样情况最近发现了,希望官网解决 解放方法是修改dns,不过还是比较难的,因为电信虚拟内网的问题,没公网ip是搞不定的

sql server-sqlserver同时支持多少客户端进行访问

问题描述 sqlserver同时支持多少客户端进行访问 sqlserver2008.sqlserver2012分别能同时支持多少客户端进行访问 解决方案 开发版.速成版有客户连接限制,一般是10个连接.企业版.标准版没有限制,你的硬件能支持多少就能支持多少. 解决方案二: PHP多进程模拟多客户端并发访问远程mysql数据库进行网络压力测试

求大神指点 急急急-客户端与客户端的访问

问题描述 客户端与客户端的访问 用客户端时间,怎么去访问别人电脑的客户端的时间.同时我看见对方时间,对方也看见我的时间? 解决方案 不知道你用的是什么语言,一般可以用socket网络通讯实现 解决方案二: 需要用代码写个程序,在两台电脑运行,然后用socket或者其它协议通讯,把时间相互传递就可以显示出来了 解决方案三: NIO中的服务器端和客户端的连接

不同web客户端访问同一台应用服务,能否为不同客户端增加访问应用的服务的不同二级域名链接访问方式

问题描述 现在项目中采用ssh+tomcat 想通过不同的客户端登陆来实现以不同的访问路径去访问同一个部署在服务器上的应用程序.其应用程序是唯一的.希望有想法者给予提示.谢谢了!如webapps下有OA项目,现在分别以客户1,客户2登陆客户1:登陆方式:http://192.168.1.168:8080/OA/client01客户2:登陆方式:http://192.168.1.168:8080/OA/client02两个客户端虽访问链接不同但访问资源一样 问题补充:xxq 写道 解决方案 通过域

在同一台机器上,让这3个模拟客户端同时访问这台机器上的同一个数据库。但不知道如何实现,请赐教!

问题描述 在同一台机器上,让这3个模拟客户端同时访问这台机器上的同一个数据库.但不知道如何实现,请赐教! 解决方案 解决方案二:用VB+SQLSERVER2000+ADO练习编写网络版软件,那么在同一台电脑上如何模拟出3个客户端?在同一台机器上,让这3个模拟客户端同时访问这台机器上的同一个数据库.但不知道如何实现,请赐教!解决方案三:数据库连接上直接用IP,不要用(local)就可以模拟了解决方案四:不了解,顶一下~解决方案五:顶................