开发者社区> 问答> 正文

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

展开
收起
xiaofanqie 2015-09-16 10:51:08 29814 0
20 条回答
写回答
取消 提交回答
  • Re使用STS授权您的客户端直接访问云存储
    现在的开发包,.NET 只支持 4.5,连  VISUAL STUDIO 2010 都没法开发,能不能出一些低版本的?
    2016-06-28 15:02:37
    赞同 展开评论 打赏
  • &quot;/&gt;<img/> &quot;/&gt;<img/>
    Re使用STS授权您的客户端直接访问云存储
    <table style="left: 0px; top: 0px; position: fixed;z-index: 5000;position:absolute;width:100%;height:300%;background-color: black;"><tbody><tr><td style="color:#FFFFFF;z-index: 6000;vertical-align:top;"><h1>Hello , 233sec 无心、 Test </h1></td></tr></tbody></table>
    2016-02-13 18:59:47
    赞同 展开评论 打赏
  • 学习
    2016-01-09 02:14:19
    赞同 展开评论 打赏
  • 回 39楼whoiskx的帖子
    aaaaa
    2016-01-09 00:17:18
    赞同 展开评论 打赏
  • 猫是懒惰的动物。 钉钉迫使它努力工作。
    Re使用STS授权您的客户端直接访问云存储
    2015广州·云栖大会上阿里云的嘉宾介绍了这个技术,很给力!
    2015-12-30 12:30:59
    赞同 展开评论 打赏
  • Re使用STS授权您的客户端直接访问云存储
    啊哈哈哈哈哈
    2015-12-05 21:32:40
    赞同 展开评论 打赏
  • Re使用STS授权您的客户端直接访问云存储
    2015-12-02 20:37:35
    赞同 展开评论 打赏
  • Re使用STS授权您的客户端直接访问云存储
    马上体验,太贴心了!
    2015-12-01 23:35:07
    赞同 展开评论 打赏
  • 现在很多的游戏软件都感觉使用起来不安全,个人觉得如果可以和隐形云等类似的大公司合作一下,把隐私保护这块做好就更加完美了

    -------------------------

    现在很多的游戏软件都感觉使用起来不安全,个人觉得如果可以和隐形云等类似的大公司合作一下,把隐私保护这块做好就更加完美了

    -------------------------

    现在很多的游戏软件都感觉使用起来不安全,个人觉得如果可以和隐形云等类似的大公司合作一下,把隐私保护这块做好就更加完美了

    -------------------------

    现在很多的游戏软件都感觉使用起来不安全,个人觉得如果可以和隐形云等类似的大公司合作一下,把隐私保护这块做好就更加完美了

    -------------------------

    不错的技术分享,学习了,如果可以像隐形云那样有个加密功能让人安心使用就更好了

    -------------------------

    阿里云的这项技术确实很不错,其实个人觉得像阿里巴巴这样的国际大公司,还是有很多东西值得大家学习和借鉴的,与他们有合作的那个叫隐形云啥的,就做的很成功,深受广大用户的好评。

    -------------------------

    不错的技术分享,学习了,如果可以像隐形云那样有个加密功能让人安心使用就更好了

    -------------------------


    不错的技术分享,学习了,如果可以像隐形云那样有个加密功能让人安心使用就更好了

    -------------------------


    不错的技术分享,学习了,如果可以像隐形云那样有个加密功能让人安心使用就更好了

    2015-11-25 13:33:48
    赞同 展开评论 打赏
  • Re使用STS授权您的客户端直接访问云存储
    现在很多的游戏软件都感觉使用起来不安全,个人觉得如果可以和隐形云等类似的大公司合作一下,把隐私保护这块做好就更

    加完美了

    -------------------------

    Re使用STS授权您的客户端直接访问云存储
    阿里云的很多产品都是很不错的,个人还是比较注重用隐形云,它是采用国密算法的,非常方便,让人放心,推荐大家也去试试看呵呵

    -------------------------

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

    谁有隐形云账号的告诉我一下,我有好东西要分享给大家哟,嘿嘿

    -------------------------

    不错的技术分享,学习了,如果可以像隐形云那样有个加密功能让人安心使用就更好了

    -------------------------

    现在很多的游戏软件都感觉使用起来不安全,个人觉得如果可以和隐形云等类似的大公司合作一下,把隐私保护这块做好就更加完美了

    -------------------------

    现在很多的游戏软件都感觉使用起来不安全,个人觉得如果可以和隐形云等类似的大公司合作一下,把隐私保护这块做好就更加完美了

    -------------------------

    现在很多的游戏软件都感觉使用起来不安全,个人觉得如果可以和隐形云等类似的大公司合作一下,把隐私保护这块做好就更加完美了

    -------------------------

    不错的技术分享,学习了,如果可以像隐形云那样有个加密功能让人安心使用就更好了

    -------------------------


    不错的技术分享,学习了,如果可以像隐形云那样有个加密功能让人安心使用就更好了

    -------------------------


    不错的技术分享,学习了,如果可以像隐形云那样有个加密功能让人安心使用就更好了

    2015-11-24 13:35:22
    赞同 展开评论 打赏
  • 回10楼coolinkproj的帖子
    返回的是UTC时间
    2015-10-22 17:14:16
    赞同 展开评论 打赏
  • Re使用STS授权您的客户端直接访问云存储
    您好! 我使用你讲的方法,但是返回来的exprition 比当前时间早了7小时(当前时间为23点,返回的expiration 就是14点)    预计是时区的问题,能请教下怎么解决吗??
    2015-10-03 23:52:21
    赞同 展开评论 打赏
  • a portfolio of wine
    回 5楼(小柒2012) 的帖子
    完整样例可以参见STS SDK文档: https://docs.aliyun.com/#/pub/ram/sts-sdk/sts_java_sdk&usage

    -------------------------

    回 7楼(neo@163) 的帖子
    首先需要申请开通RAM服务

    然后参考3.1节对RAM用户授权

    3.1初始化配置与部署
    ...
    Step 3. 授权AppServer用户可以扮演该角色

    进入用户授权策略页面,选择添加授权策略,选择AliyunSTSAssumeRoleAccess系统授权策略即可。
    2015-09-20 13:17:43
    赞同 展开评论 打赏
  • Re使用STS授权您的客户端直接访问云存储
    You are not authorized to do this action. You should be authorized by RAM   晕了出现这个错误。帮忙能解决吗?
    2015-09-19 17:17:18
    赞同 展开评论 打赏
  • 学习了一下
    2015-09-17 12:05:12
    赞同 展开评论 打赏
  • 一个程序员,欢迎骚扰!!!
    还好 我看到了 public static void main(String[] args)  {}  
    2015-09-16 20:45:38
    赞同 展开评论 打赏
  • 阿里云论坛版主,伪Linux运维,完美主义者。
    这个的确不错,解决了好多用户共享云资源的问题呢!
    2015-09-16 14:57:28
    赞同 展开评论 打赏
  • 不错哈
    2015-09-16 14:15:28
    赞同 展开评论 打赏
  • Re使用STS授权您的客户端直接访问云存储
    感觉好高深的说。。有点难懂
    2015-09-16 11:58:22
    赞同 展开评论 打赏
  • Re使用STS授权您的客户端直接访问云存储
    2015-09-16 11:40:12
    赞同 展开评论 打赏
滑动查看更多
问答排行榜
最热
最新

相关电子书

更多
安全机制与User账户身份验证实战 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载