阿里云权限管理机制包括访问控制(Resource Access Management,简称 RAM)和安全凭证管理(Security Token Service,简称 STS),可以根据需求使用不同权限的子账号来访问表格存储,也支持为用户提供访问的临时授权。使用RAM和STS能极大地提高管理的灵活性和安全性。

RAM 的主要作用是控制账号系统的权限。通过使用 RAM 可以在主账号的权限范围内创建子账号,给不同的子账号分配不同的权限,从而达到授权管理的目的。详情请参见访问控制产品帮助文档

STS 是一个安全凭证(Token)的管理系统,用来授予临时的访问权限,这样就可以通过 STS 来完成对于临时用户的访问授权。

背景介绍

RAM 和 STS 需要解决的一个核心问题是如何在不暴露主账号的 AccessKey 的情况下安全地授权别人访问。因为一旦主账号的 AccessKey 暴露出去,会带来极大的安全风险,别人可以随意操作该账号下所有的资源、盗取重要信息等。

RAM 提供了一种长期有效的权限控制机制,通过分出不同权限的子账号,将不同的权限分给不同的用户,即使子账号泄露也不会造成全局的信息泄露。子账号在一般情况下是长期有效的。因此,子账号的 AccessKey 是不能泄露的。

相对于 RAM 提供的长效控制机制,STS 提供的是一种临时访问授权,通过 STS 可以返回临时的 AccessKey 和 Token,这些信息可以直接发给临时用户用来访问表格存储。一般来说,从 STS 获取的权限会受到更加严格的限制,并且拥有时间限制,因此即使这些信息泄露,对于系统的影响也很小。

基本概念

下表是一些基本概念的简单解释:

基本概念 描述
子账号 从阿里云的主账号中创建出来的子账号,在创建的时候可以分配独立的密码和权限,每个子账号拥有自己的 AccessKey,可以和阿里云主账号一样正常完成有权限的操作。一般来说,这里的子账号可以理解为具有某种权限的用户,可以被认为是一个具有某些权限的操作发起者。
角色(Role) 表示某种操作权限的虚拟概念,但是没有独立的登录密码和 AccessKey。子账号可以扮演角色,扮演角色时的权限是该角色自身的权限。
授权策略(Policy) 用来定义权限的规则,例如允许用户读取或者写入某些资源。
资源(Resource) 代表用户可访问的云资源,例如表格存储所有的实例、某个实例或者实例下面的某个表等。

子账号和角色可以类比为某个个人和其身份的关系,某人在公司的角色是员工,在家里的角色是父亲,在不同的场景扮演不同的角色,但是还是同一个人。在扮演不同角色的时候也就拥有对应角色的权限。单独的员工或者父亲概念并不能作为一个操作的实体,只有有人扮演了之后才是一个完整的概念。这里还可以体现一个重要的概念,那就是角色可以被多个不同的个人同时扮演。完成角色扮演之后,该个人就自动拥有该角色的所有权限。

使用示例:

某个阿里云用户,名为 alice,其在表格存储有 alice_a 和 alice_b 两个实例。alice 对这两个实例都拥有完全的权限。

为避免阿里云账号的 AccessKey 泄露而导致安全风险,alice 使用 RAM 创建了两个子账号 bob 和 carol。bob 对 alice_a 拥有读/写权限,carol 对 alice_b 拥有读/写权限。bob 和 carol 都拥有独立的 AccessKey,这样万一泄露了也只会影响其中一个实例,而且 alice 可以很方便地在控制台取消泄露用户的权限。

假设现在需要授权给别人读取 alice_a 中的数据表。这种情况下不应该直接把 bob 的 AccessKey 透露出去,可以新建一个角色,例如 AliceAReader,给这个角色赋予读取 alice_a 的权限。但请注意,这个时候 AliceAReader 还是没法直接用的,因为并不存在对应 AliceAReader 的 AccessKey,AliceAReader 现在仅仅表示一个拥有访问 alice_a 权限的虚拟实体。

为了能获取临时授权,这时可以调用 STS 的 AssumeRole 接口,告诉 STS bob 将要扮演 AliceAReader 这个角色。如果成功,STS 会返回一个临时的 AccessKeyId、AccessKeySecret 和 SecurityToken 作为访问凭证。将这个凭证发给需要访问的临时用户就可以获得访问 alice_a 的临时权限了。凭证的过期时间在调用 AssumeRole 的时候指定。

为什么 RAM 和 STS 这么复杂

RAM 和 STS 的概念之所以复杂,是为了权限控制的灵活性而牺牲了部分的易用性。

将子账号和角色分开,主要是为了将执行操作的实体和代表权限集合的虚拟实体分开。如果用户本身需要的权限很多,例如读/写权限,但是实际上每次操作只需要其中的一部分权限,那么我们就可以创建两个角色,分别具有读和写权限,然后创建一个没有任何权限但是可以拥有扮演这两个角色权限的用户。当用户需要读的时候就可以临时扮演其中拥有读权限的角色,写的时候同理,以降低每次操作中权限泄露的风险。而且通过扮演角色可以将权限授予其他的阿里云用户,更加方便了协同使用。

当然,提供了灵活性并不代表一定要使用全部的功能,应该根据需求来使用其中的一个子集。例如,不需要带过期时间的临时访问凭证的话,完全可以只使用 RAM 的子账号功能而无需使用 STS。

下面的章节会用范例提供一些 RAM 和 STS 的使用指南以及使用上的建议。示例在操作上会尽量使用控制台和命令行等操作方式,减少实际代码使用。如果需要使用代码来实现请参见RAMSTS的 API 手册。