使用STS授权您的客户端直接访问云存储-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

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

xiaofanqie 2015-09-16 10:51:08 27549
摘要:当阿里云客户使用云存储服务来保存来自其客户端的用户数据时,现有的解决方案都存在一些问题。针对这一场景及问题,本文介绍了一种轻量级的安全解决方案,即使用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可以帮助客户有效解决移动领域、游戏领域或物联网领域的一类典型应用场景或解决方案的最小授权问题,进而有效控制业务上云所带来的信息安全风险。

存储 设计模式 缓存 监控 安全 前端开发 Java API 对象存储 数据安全/隐私保护
分享到
取消 提交回答
全部回答(20)
  • 旷野的风
    2016-06-28 15:02:37
    Re使用STS授权您的客户端直接访问云存储
    现在的开发包,.NET 只支持 4.5,连  VISUAL STUDIO 2010 都没法开发,能不能出一些低版本的?
    0 0
  • 无心之人
    2016-02-13 18:59:47
    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>
    0 0
  • 2016-01-09 02:14:19
    学习
    0 0
  • whoiskx
    2016-01-09 00:17:18
    回 39楼whoiskx的帖子
    aaaaa
    0 0
  • 钉猫师兄
    2015-12-30 12:30:59
    Re使用STS授权您的客户端直接访问云存储
    2015广州·云栖大会上阿里云的嘉宾介绍了这个技术,很给力!
    0 0
滑动查看更多
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题