上面章节只用到了 RAM 的子账号功能,这些子账号都是可以长期正常使用的,发生泄露后如果无法及时解除权限,会非常危险。

当开发者的 app 被用户使用之后,用户的数据要写入 ram-test-dev 这个实例。当 app 的用户数据很多时,要求能够安全地授权给众多的 app 用户上传数据,并且保证多个用户之间存储的隔离。

类似这种场景需要临时访问权限,应该使用 STS 来完成。STS 可以指定复杂的策略来对特定的用户进行限制,仅提供最小的权限。

创建角色

  1. 创建一个名为 ram_test_app 的子账号,不需要赋予任何权限,因为在扮演角色的时候会自动获得被扮演角色的所有权限。有关创建RAM用户更多详情,请参见使用示例中的步骤1至步骤7。
  2. 创建两个角色,RamTestAppReadOnly 和 RamTestAppWrite。一个用于读取等操作,一个用于上传文件的操作。
    1. 登录RAM 控制台
    2. 选择角色管理 > 新建角色
    3. 选择角色类型。这里选择用户角色
    4. 填写类型信息。因为角色是被阿里云账号使用过的,因此选择默认的即可。然后单击下一步
    5. 配置角色基本信息。本实例中角色名称填写 RamTestAppReadOnly,然后单击创建
    6. 完成角色创建后,单击关闭。
  3. 创建完角色之后,角色是没有任何权限的,因此需要新建一个自定义的授权策略。
    1. 选择策略管理 > 新建授权策略
    2. 选择空白模板
    3. 填写授权策略名称。该示例中填写ram-test-app-readonly,策略内容填写如下:
      {
      "Statement": [
      	{
      	  "Effect": "Allow",
      	  "Action": [
      		"ots:BatchGet*",
      		"ots:Describe*",
      		"ots:Get*",
      		"ots:List*"
      	  ],
      	  "Resource": [
      		"acs:ots:*:*:instance/ram-test-app",
      		"acs:ots:*:*:instance/ram-test-app/table/*"
      	  ]
      	}
      ],
      "Version": "1"
      }
      


      该策略内容表示对 ram-test-app 授予只读权限。

    4. 单击创建授权策略,然后单击关闭
  4. 为 RamTestAppReadOnly 添加上 ram-test-app 的只读授权。
    1. 角色管理页面,单击 RamTestAppReadOnly 右侧操作栏中的授权按钮。
    2. 将 ram-test-app-readonly 权限添加至右侧栏中。完成给该角色赋予对 ram-test-app 拥有只读的权限。

    3. 单击确定

      表示已为 RamTestAppReadOnly 角色授予了 ram-test-app 的只读权限。

  5. 参考步骤 2 ~ 步骤 4,建立一个 RamTestAppWrite 的角色,并赋予该角色写 ram-test-app 的自定义授权,步骤 3 中填写的策略内容如下:
    	{
     "Statement": [
    		{
    		  "Effect": "Allow",
    		  "Action": [
    			"ots:Create*",
    			"ots:Insert*",
    			"ots:Put*",
    			"ots:Update*",
    			"ots:Delete*",
    			"ots:BatchWrite*"
    		  ],
    		  "Resource": [
    			"acs:ots:*:*:instance/ram-test-app",
    			"acs:ots:*:*:instance/ram-test-app/table/*"
    		  ]
    		}
     ],
     "Version": "1"
    	}
    

在角色管理页面,可以看到已经新建好了 RamTestAppReadOnly 和 RamTestAppWrite 两个角色,分别表示了对于 ram-test-app 的读和写权限。

临时授权访问

创建角色后,就可以使用临时授权来访问表格存储了。

  • 准备工作

    在使用 STS 来授权访问前,需要先对子账号进行需扮演角色的授权。若任意子账号都可以扮演这些角色,会带来不可预估的风险,因此有扮演对应角色需求的子账号需要被赋予相应的配置权限。在授权管理策略中新建两个自定义的授权策略并将其赋予 ram_test_app 这个子账号,操作步骤如下:

    1. 单击页面左侧的策略管理,进入策略管理页面。
    2. 单击新建授权策略按钮,进入创建授权策略的页面。
    3. 选择空白模板,进入创建自定义授权策略的页面。
    4. 填写授权策略名称,并将如下内容填写至策略内容栏。
      • AliyunSTSAssumeRolePolicy2016011401
      {
      "Version": "1",
      "Statement": [
          {
              "Effect": "Allow",
              "Action": "sts:AssumeRole",
              "Resource": "acs:ram:1983407596944237:role/ramtestappreadonly"
          }
      ]
      }
      
      • AliyunSTSAssumeRolePolicy2016011402
      {
      "Version": "1",
      "Statement": [
          {
              "Effect": "Allow",
              "Action": "sts:AssumeRole",
              "Resource": "acs:ram:1983407596944237:role/ramtestappwrite"
          }
      ]
      }
      
      说明 下文中 Resource 后面填写的内容表示某个角色 ID,角色的 ID 可以在 角色管理页面,单击 管理按钮,进入角色详情的页面中找到。
    5. 上述的两个授权策略都建成后,单击页面左侧的用户管理,进入用户管理页面。
    6. 单击 ram_test_app 右侧操作栏中的授权按钮。进入编辑个人授权策略页面。
    7. 搜索AliyunSTSAssumeRolePolicy2016011401和AliyunSTSAssumeRolePolicy2016011402,选中后单击 > 将该权限添加至右侧栏中。
    8. 单击确定,完成将这两个授权赋给 ram_test_app 这个账号的操作。
  • 使用 STS

    上述准备工作完成后,就可以正式使用 STS 来进行授权访问。这里需要使用 STS 的 Python 命令行工具,该工具安装包的下载地址:sts.py

    具体的调用方法如下,更详细的参数解释可以参考STS 帮助文档

    $python ./sts.py AssumeRole RoleArn=acs:ram::1983407596944237:role/ramtestappreadonly RoleSessionName=usr001 Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":["ots:ListTable","ots:DescribeTable"],"Resource":["acs:ots:*:*:ram-test-app","acs:ots:*:*:ram-test-app/*"]}]}' DurationSeconds=1000 --id=id --secret=secret
    

    参数说明:

    参数 说明
    RoleArn 指需要扮演的角色 ID。角色的 ID 可以在角色管理页面,单击管理按钮进入角色详情的页面中找到。
    RoleSessionName 指临时凭证的名称,一般来说建议使用不同的应用程序用户来区分。
    Policy 指在扮演角色时额外加上的一个权限限制。
    说明 这里传入的 Policy 是用来限制扮演角色之后的临时凭证的权限。最后临时凭证获得的权限是角色的权限和这里传入的 Policy 的交集。在扮演角色时传入 Policy 是为了灵活性,比如上传文件时可以根据不同的用户添加对于上传文件路径的限制。
    DurationSeconds 指临时凭证的有效期。单位是秒,最小为 900,最大为 3600。
    id and secret 指需要扮演角色的子账号的 AccessKey 的 AccessKeyID 和 AccessKeySecret。
  • 测试 STS 的作用

    先在表格存储控制台创建名称为 test_write_read 的表,主键为 name,类型为 string,然后使用 CLI 工具测试读/写操作。

    使用 ram_test_app 这个子账号直接来访问,请将下面的 AccessKey 换成自己测试用的 AccessKey。

    python2.7 ots_console --url https://TableStoreTest.cn-hangzhou.ots.aliyuncs.com --id 6iTlV1uhiY71mlRt --key clkkuDiq69IJWJ7PnA9PXJxhRWMr3P
    You cannot access the instance!
    ErrorCode: OTSNoPermissionAccess
    ErrorMessage: You have no permission to access the requested resource, please contact the resource owner.
    

    由于 ram_test_app 这个子账号没有访问权限,因此访问失败。

  • 使用临时授权写入数据

    使用 STS 来写入数据。这里为了简单,传入的 Policy 和角色的 Policy 一致,过期时间使用默认的 3600s,SessionName 假定为 session001。操作步骤如下:

    1. 使用 STS 来获取临时凭证。
      python2.7 ./sts.py AssumeRole RoleArn=acs:ram::1983407596944237:role/ramtestappwrite RoleSessionName=session001 Policy='{"Statement": [{"Effect": "Allow","Action": ["ots:Create*","ots:BatchWrite*","ots:Put*","ots:Insert*","ots:Update*","ots:Delete*"],"Resource": ["acs:ots:*:*:instance/ram-test-app","acs:ots:*:*:instance/ram-test-app/table/*"]}],"Version": "1"}' --id=6iTlV1uhiY71mlRt --secret=clkkuDiq69IJWJ7PnA9PXJxhRWMr3P
      {
      "AssumedRoleUser": {
          "Arn": "acs:ram::1983407596944237:role/ramtestappwrite/session001", 
          "AssumedRoleId": "330629052749595885:session001"
      }, 
      "Credentials": {
          "AccessKeyId": "STS.x4gG7KMsfHckQe8nPKLO", 
          "AccessKeySecret": "IA6CJh5kE5J5m8mR6aQXWbMemSL63Xh7SIhrEcke", 
          "Expiration": "2016-01-14T07:58:14Z", 
          "SecurityToken": "CAESgAQIARKAATDsbhiBSujhVEHoMKm1i17pyZhPTCe1BnVF5YzdNyRos4WuQjalxLkOE/hNNxg25vTo9bljKg4VCcrfh6GkJNujMMcJ4V1i/0RMDLfXwa0/vOHP9W/oSQpwAD5EaWJfqVY/nxwmJ0aKJDHPmSieWssnlmocaOZAgHkpCqQSSDA8GhhTVFMueDRnRzdLTXNmSGNrUWU4blBLTE8iEjMzMDYyOTA1Mjc0OTU5NTg4NSoGdXNyMDAxMPnCkfmjKjoGUnNhTUQ1QuIBCgExGtwBCgVBbGxvdxJnCgxBY3Rpb25FcXVhbHMSBkFjdGlvbhpPCgtvdHM6Q3JlYXRlKgoPb3RzOkJhdGNoV3JpdGUqCghvdHM6UHV0KgoLb3RzOkluc2VydCoKC290czpVcGRhdGUqCgtvdHM6RGVsZXRlKhJqCg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaTgohYWNzOm90czoqOio6aW5zdGFuY2UvcmFtLXRlc3QtYXBwCilhY3M6b3RzOio6KjppbnN0YW5jZS9yYW0tdGVzdC1hcHAvdGFibGUvKkoQMTk4MzQwNzU5Njk0NDIzN1IFMjY4NDJaD0Fzc3VtZWRSb2xlVXNlcmAAahIzMzA2MjkwNTI3NDk1OTU4ODVyD3JhbXRlc3RhcHB3cml0ZQ=="
      }, 
      "RequestId": "5F92B248-F200-40F8-A05A-C9C7D018E351"
      }
      
    2. 使用 CLI 工具写入数据(版本 V1.2 开始支持 token 参数,待发布)。
      	python2.7 ots_console --url https://TableStoreTest.cn-hangzhou.ots.aliyuncs.com --id STS.x4gG7KMsfHckQe8nPKLO --key IA6CJh5kE5J5m8mR6aQXWbMemSL63Xh7SIhrEcke --token=CAESgAQIARKAATDsbhiBSujhVEHoMKm1i17pyZhPTCe1BnVF5YzdNyRos4WuQjalxLkOE/hNNxg25vTo9bljKg4VCcrfh6GkJNujMMcJ4V1i/0RMDLfXwa0/vOHP9W/oSQpwAD5EaWJfqVY/nxwmJ0aKJDHPmSieWssnlmocaOZAgHkpCqQSSDA8GhhTVFMueDRnRzdLTXNmSGNrUWU4blBLTE8iEjMzMDYyOTA1Mjc0OTU5NTg4NSoGdXNyMDAxMPnCkfmjKjoGUnNhTUQ1QuIBCgExGtwBCgVBbGxvdxJnCgxBY3Rpb25FcXVhbHMSBkFjdGlvbhpPCgtvdHM6Q3JlYXRlKgoPb3RzOkJhdGNoV3JpdGUqCghvdHM6UHV0KgoLb3RzOkluc2VydCoKC290czpVcGRhdGUqCgtvdHM6RGVsZXRlKhJqCg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaTgohYWNzOm90czoqOio6aW5zdGFuY2UvcmFtLXRlc3QtYXBwCilhY3M6b3RzOio6KjppbnN0YW5jZS9yYW0tdGVzdC1hcHAvdGFibGUvKkoQMTk4MzQwNzU5Njk0NDIzN1IFMjY4NDJaD0Fzc3VtZWRSb2xlVXNlcmAAahIzMzA2MjkwNTI3NDk1OTU4ODVyD3JhbXRlc3RhcHB3cml0ZQ==
      
      	OTS-TableStoreTest>$ put test_write_read '001' age:integer=30
      	A new row has been put in table test_write_read
      
  • 使用临时授权读取数据

    使用 STS 来读取数据。这里为了简单,传入的 Policy 和角色的 Policy 一致,过期时间使用默认的 3600s,SessionName 假定为 session002。操作步骤如下:

    1. 使用 STS 来获取临时凭证。
      python2.7 ./sts.py AssumeRole RoleArn=acs:ram::1983407596944237:role/ramtestappreadonly RoleSessionName=session002 Policy='{"Statement": [{"Effect": "Allow","Action": ["ots:BatchGet*","ots:Describe*","ots:Get*","ots:List*"],"Resource": ["acs:ots:*:*:instance/ram-test-app","acs:ots:*:*:instance/ram-test-app/table/*"]}],"Version": "1"}' --id=6iTlV1uhiY71mlRt --secret=clkkuDiq69IJWJ7PnA9PXJxhRWMr3P
      {
      "AssumedRoleUser": {
          "Arn": "acs:ram::1983407596944237:role/ramtestappreadonly/session002",
          "AssumedRoleId": "396025752746614078:session002"
      },
      "Credentials": {
          "AccessKeyId": "STS.0qJ2UE8AalcHdQ6n2Q8Q",
          "AccessKeySecret": "pSaUjb8O9mU5M76nkC6FHt6wKwbCVYO27gxSEBAu",
          "Expiration": "2016-01-14T08:14:16Z",
          "SecurityToken": "CAES6wMIARKAAVtHeNgUnhk132OwDfxZTu8gPQCxfakYLeWha/FxoEYNqBKQTtyI4WPC5mpYuu8+n+yamSYTI2VPQ/z44fcYCNT1bQ0km87F3nb6EJxVvCdJIPNGVwQBMdQl/FLwBVhEGJ9BIwog4fMzwhERjqnAP8HbynAIQpG55BHaIXmv53x+GhhTVFMuMHFKMlVFOEFhbGNIZFE2bjJROFEiEjM5NjAyNTc1Mjc0NjYxNDA3OCoKc2Vzc2lvbjAwMjConMz5oyo6BlJzYU1ENULGAQoBMRrAAQoFQWxsb3cSSwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aMwoNb3RzOkJhdGNoR2V0KgoNb3RzOkRlc2NyaWJlKgoIb3RzOkdldCoKCW90czpMaXN0KhJqCg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaTgohYWNzOm90czoqOio6aW5zdGFuY2UvcmFtLXRlc3QtYXBwCilhY3M6b3RzOio6KjppbnN0YW5jZS9yYW0tdGVzdC1hcHAvdGFibGUvKkoQMTk4MzQwNzU5Njk0NDIzN1IFMjY4NDJaD0Fzc3VtZWRSb2xlVXNlcmAAahIzOTYwMjU3NTI3NDY2MTQwNzhyEnJhbXRlc3RhcHByZWFkb25seQ=="
      }, 
      "RequestId": "EE788165-B760-4014-952C-E58ED229C80D"
      }
      
    2. 使用 CLI 工具读取数据(版本 V1.2 开始支持 token 参数,待发布)。
      	python2.7 ots_console --url https://TableStoreTest.cn-hangzhou.ots.aliyuncs.com --id STS.0qJ2UE8AalcHdQ6n2Q8Q --key pSaUjb8O9mU5M76nkC6FHt6wKwbCVYO27gxSEBAu --token=CAES6wMIARKAAVtHeNgUnhk132OwDfxZTu8gPQCxfakYLeWha/FxoEYNqBKQTtyI4WPC5mpYuu8+n+yamSYTI2VPQ/z44fcYCNT1bQ0km87F3nb6EJxVvCdJIPNGVwQBMdQl/FLwBVhEGJ9BIwog4fMzwhERjqnAP8HbynAIQpG55BHaIXmv53x+GhhTVFMuMHFKMlVFOEFhbGNIZFE2bjJROFEiEjM5NjAyNTc1Mjc0NjYxNDA3OCoKc2Vzc2lvbjAwMjConMz5oyo6BlJzYU1ENULGAQoBMRrAAQoFQWxsb3cSSwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aMwoNb3RzOkJhdGNoR2V0KgoNb3RzOkRlc2NyaWJlKgoIb3RzOkdldCoKCW90czpMaXN0KhJqCg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaTgohYWNzOm90czoqOio6aW5zdGFuY2UvcmFtLXRlc3QtYXBwCilhY3M6b3RzOio6KjppbnN0YW5jZS9yYW0tdGVzdC1hcHAvdGFibGUvKkoQMTk4MzQwNzU5Njk0NDIzN1IFMjY4NDJaD0Fzc3VtZWRSb2xlVXNlcmAAahIzOTYwMjU3NTI3NDY2MTQwNzhyEnJhbXRlc3RhcHByZWFkb25seQ==
      
      	OTS-TableStoreTest>: get test_write_read '001'
      	age:INTEGER='30'
      
  • 使用临时授权访问控制台

    STS 临时授权允许子账户登录表格存储控制台,并管理和查看主账号的实例和表资源。上面的例子中,子账号 ram_test_app 可以扮演 RamTestAppReadOnly 角色,从而拥有查看所有实例和所有表的权限。登录步骤如下:

    1. 使用主账号登录访问控制RAM控制台
    2. 使用主账号登录访问控制RAM控制台,进入概览页面。
    3. 单击RAM 用户登录链接后面的链接,进入阿里云 RAM 用户登录页面,输入子账号的 ram_test_app 用户名及密码进行登录。
    4. 登录成功后,单击页面右上角的用户名,然后单击切换身份,进入角色切换页面。
    5. 输入企业姓名和角色名,然后单击切换

使用临时授权调用 JAVA SDK

请参考以下方式创建 OTSClient 对象,传入 STS Token 的 AccessKeyId、AccessKeySecret 和 Token 等参数。

OTSClient client = new OTSClient(otsEndpoint, stsAccessKeyId, stsAccessKeySecret, instanceName, stsToken);

总结

本章主要介绍了如何使用 STS 来临时授权用户访问表格存储。在典型的移动开发场景中,通过使用 STS,不同的 app 用户需要访问 app 时,可以通过获取到的临时授权来访问表格存储,临时授权可以指定过期时间,因此大大降低了泄露子账号信息的危害。在获取临时授权的时候,可以根据 app 用户的不同,传入不同的授权策略来限制用户的访问权限,比如限制用户访问的表路径,从而达到隔离不同 app 用户的存储空间的目的。