全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网
表格存储

STS临时授权访问

更新时间:2017-11-14 16:27:42

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

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

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

创建角色

之前已经解释过了角色的一些概念,本节将会给出使用角色的实际示例。

  1. 参考使用示例中步骤 1 ~ 步骤 5 创建一个名为 ram_test_app 的子账号。

    创建完成后自动跳转至用户管理页面,名为 ram_test_app 的账号会出现在该页面上。不需要赋予其任何权限,因为在扮演角色的时候会自动获得被扮演角色的所有权限。

  2. 创建角色并授予其权限。这里创建两个角色,一个用于读取等操作,一个用于上传文件的操作。

    1. 在 RAM 控制台上,选择角色管理 > 新建角色

      角色管理

    2. 选中用户角色,即直接进入填写角色类型信息页面。

    3. 由于角色本身是被阿里云账号使用过的,因此选择默认的即可。

      类型信息

    4. 配置角色基本信息,本实例中角色名称为 RamTestAppReadOnly,然后单击创建关闭,完成角色创建。

      角色信息

  3. 创建完角色之后,角色是没有任何权限的,因此需要新建一个自定义的授权策略。

    1. 选择策略管理 > 新建授权策略

    2. 选择空白模板

    3. 填写策略内容,如下图所示:

      填写策略内容

      • 本示例中授权策略名称为 ram-test-app-readonly。

      • 策略内容如下所示,表示对 ram-test-app 拥有只读权限。

        1. {
        2. "Statement": [
        3. {
        4. "Effect": "Allow",
        5. "Action": [
        6. "ots:BatchGet*",
        7. "ots:Describe*",
        8. "ots:Get*",
        9. "ots:List*"
        10. ],
        11. "Resource": [
        12. "acs:ots:*:*:instance/ram-test-app",
        13. "acs:ots:*:*:instance/ram-test-app/table/*"
        14. ]
        15. }
        16. ],
        17. "Version": "1"
        18. }
  4. 为 RamTestAppReadOnly 添加上 ram-test-app 的只读授权。

    1. 角色管理页面,单击 RamTestAppReadOnly 右侧操作栏中的授权按钮。

      授权

    2. ram-test-app-readonly 权限添加至右侧栏中,完成给该角色赋予对 ram-test-app 拥有只读的权限。

      授权2

  5. 参考步骤 2 ~ 步骤 4,建立一个 RamTestAppWrite 的角色,并赋予该角色写 ram-test-app 的自定义授权,步骤 3 中填写的策略内容如下:

    1. {
    2. "Statement": [
    3. {
    4. "Effect": "Allow",
    5. "Action": [
    6. "ots:Create*",
    7. "ots:Insert*",
    8. "ots:Put*",
    9. "ots:Update*",
    10. "ots:Delete*",
    11. "ots:BatchWrite*"
    12. ],
    13. "Resource": [
    14. "acs:ots:*:*:instance/ram-test-app",
    15. "acs:ots:*:*:instance/ram-test-app/table/*"
    16. ]
    17. }
    18. ],
    19. "Version": "1"
    20. }

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

读写权限

临时授权访问

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

准备工作

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

  1. 单击页面左侧的策略管理,进入策略管理页面。

  2. 单击页面右侧的新建授权策略按钮,进入创建授权策略的页面。

  3. 选择空白模板,进入创建自定义授权策略的页面。

  4. 填写授权策略名称,并将如下内容填写至策略内容栏。两个授权策略的内容分别为:

    注意:下文中 Resource 后面填写的内容表示某个角色 ID,角色的 ID 可以在角色管理页面,单击管理按钮,进入角色详情的页面中找到。

    • AliyunSTSAssumeRolePolicy2016011401

      1. {
      2. "Version": "1",
      3. "Statement": [
      4. {
      5. "Effect": "Allow",
      6. "Action": "sts:AssumeRole",
      7. "Resource": "acs:ram:1983407596944237:role/ramtestappreadonly"
      8. }
      9. ]
      10. }
    • AliyunSTSAssumeRolePolicy2016011402

      1. {
      2. "Version": "1",
      3. "Statement": [
      4. {
      5. "Effect": "Allow",
      6. "Action": "sts:AssumeRole",
      7. "Resource": "acs:ram:1983407596944237:role/ramtestappwrite"
      8. }
      9. ]
      10. }
  5. 上述的两个授权策略都建成后,单击页面左侧的用户管理,进入用户管理页面。

  6. 单击 ram_test_app 右侧操作栏中的授权按钮,进入编辑个人授权策略页面。

  7. 搜索AliyunSTSAssumeRolePolicy2016011401AliyunSTSAssumeRolePolicy2016011402,选中后单击 > 将该权限添加至右侧栏中,最后单击确定,完成将这两个授权赋给 ram_test_app 这个账号的操作。

使用 STS

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

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

  1. $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 和 secret:指需要扮演角色的子账号的 AccessKey 的 AccessKeyID 和 AccessKeySecret。

测试 STS 的作用

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

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

  1. python2.7 ots_console --url https://TableStoreTest.cn-hangzhou.ots.aliyuncs.com --id 6iTlV1uhiY71mlRt --key clkkuDiq69IJWJ7PnA9PXJxhRWMr3P
  2. You cannot access the instance!
  3. ErrorCode: OTSNoPermissionAccess
  4. 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 来获取临时凭证。

    1. 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
    2. {
    3. "AssumedRoleUser": {
    4. "Arn": "acs:ram::1983407596944237:role/ramtestappwrite/session001",
    5. "AssumedRoleId": "330629052749595885:session001"
    6. },
    7. "Credentials": {
    8. "AccessKeyId": "STS.x4gG7KMsfHckQe8nPKLO",
    9. "AccessKeySecret": "IA6CJh5kE5J5m8mR6aQXWbMemSL63Xh7SIhrEcke",
    10. "Expiration": "2016-01-14T07:58:14Z",
    11. "SecurityToken": "CAESgAQIARKAATDsbhiBSujhVEHoMKm1i17pyZhPTCe1BnVF5YzdNyRos4WuQjalxLkOE/hNNxg25vTo9bljKg4VCcrfh6GkJNujMMcJ4V1i/0RMDLfXwa0/vOHP9W/oSQpwAD5EaWJfqVY/nxwmJ0aKJDHPmSieWssnlmocaOZAgHkpCqQSSDA8GhhTVFMueDRnRzdLTXNmSGNrUWU4blBLTE8iEjMzMDYyOTA1Mjc0OTU5NTg4NSoGdXNyMDAxMPnCkfmjKjoGUnNhTUQ1QuIBCgExGtwBCgVBbGxvdxJnCgxBY3Rpb25FcXVhbHMSBkFjdGlvbhpPCgtvdHM6Q3JlYXRlKgoPb3RzOkJhdGNoV3JpdGUqCghvdHM6UHV0KgoLb3RzOkluc2VydCoKC290czpVcGRhdGUqCgtvdHM6RGVsZXRlKhJqCg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaTgohYWNzOm90czoqOio6aW5zdGFuY2UvcmFtLXRlc3QtYXBwCilhY3M6b3RzOio6KjppbnN0YW5jZS9yYW0tdGVzdC1hcHAvdGFibGUvKkoQMTk4MzQwNzU5Njk0NDIzN1IFMjY4NDJaD0Fzc3VtZWRSb2xlVXNlcmAAahIzMzA2MjkwNTI3NDk1OTU4ODVyD3JhbXRlc3RhcHB3cml0ZQ=="
    12. },
    13. "RequestId": "5F92B248-F200-40F8-A05A-C9C7D018E351"
    14. }
  2. 使用 CLI 工具写入数据(版本 V1.2 开始支持 token 参数,待发布)。

    1. python2.7 ots_console --url https://TableStoreTest.cn-hangzhou.ots.aliyuncs.com --id STS.x4gG7KMsfHckQe8nPKLO --key IA6CJh5kE5J5m8mR6aQXWbMemSL63Xh7SIhrEcke --token=CAESgAQIARKAATDsbhiBSujhVEHoMKm1i17pyZhPTCe1BnVF5YzdNyRos4WuQjalxLkOE/hNNxg25vTo9bljKg4VCcrfh6GkJNujMMcJ4V1i/0RMDLfXwa0/vOHP9W/oSQpwAD5EaWJfqVY/nxwmJ0aKJDHPmSieWssnlmocaOZAgHkpCqQSSDA8GhhTVFMueDRnRzdLTXNmSGNrUWU4blBLTE8iEjMzMDYyOTA1Mjc0OTU5NTg4NSoGdXNyMDAxMPnCkfmjKjoGUnNhTUQ1QuIBCgExGtwBCgVBbGxvdxJnCgxBY3Rpb25FcXVhbHMSBkFjdGlvbhpPCgtvdHM6Q3JlYXRlKgoPb3RzOkJhdGNoV3JpdGUqCghvdHM6UHV0KgoLb3RzOkluc2VydCoKC290czpVcGRhdGUqCgtvdHM6RGVsZXRlKhJqCg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaTgohYWNzOm90czoqOio6aW5zdGFuY2UvcmFtLXRlc3QtYXBwCilhY3M6b3RzOio6KjppbnN0YW5jZS9yYW0tdGVzdC1hcHAvdGFibGUvKkoQMTk4MzQwNzU5Njk0NDIzN1IFMjY4NDJaD0Fzc3VtZWRSb2xlVXNlcmAAahIzMzA2MjkwNTI3NDk1OTU4ODVyD3JhbXRlc3RhcHB3cml0ZQ==
    2. OTS-TableStoreTest>$ put test_write_read '001' age:integer=30
    3. A new row has been put in table test_write_read

使用临时授权读取数据

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

  1. 使用 STS 来获取临时凭证。

    1. 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
    2. {
    3. "AssumedRoleUser": {
    4. "Arn": "acs:ram::1983407596944237:role/ramtestappreadonly/session002",
    5. "AssumedRoleId": "396025752746614078:session002"
    6. },
    7. "Credentials": {
    8. "AccessKeyId": "STS.0qJ2UE8AalcHdQ6n2Q8Q",
    9. "AccessKeySecret": "pSaUjb8O9mU5M76nkC6FHt6wKwbCVYO27gxSEBAu",
    10. "Expiration": "2016-01-14T08:14:16Z",
    11. "SecurityToken": "CAES6wMIARKAAVtHeNgUnhk132OwDfxZTu8gPQCxfakYLeWha/FxoEYNqBKQTtyI4WPC5mpYuu8+n+yamSYTI2VPQ/z44fcYCNT1bQ0km87F3nb6EJxVvCdJIPNGVwQBMdQl/FLwBVhEGJ9BIwog4fMzwhERjqnAP8HbynAIQpG55BHaIXmv53x+GhhTVFMuMHFKMlVFOEFhbGNIZFE2bjJROFEiEjM5NjAyNTc1Mjc0NjYxNDA3OCoKc2Vzc2lvbjAwMjConMz5oyo6BlJzYU1ENULGAQoBMRrAAQoFQWxsb3cSSwoMQWN0aW9uRXF1YWxzEgZBY3Rpb24aMwoNb3RzOkJhdGNoR2V0KgoNb3RzOkRlc2NyaWJlKgoIb3RzOkdldCoKCW90czpMaXN0KhJqCg5SZXNvdXJjZUVxdWFscxIIUmVzb3VyY2UaTgohYWNzOm90czoqOio6aW5zdGFuY2UvcmFtLXRlc3QtYXBwCilhY3M6b3RzOio6KjppbnN0YW5jZS9yYW0tdGVzdC1hcHAvdGFibGUvKkoQMTk4MzQwNzU5Njk0NDIzN1IFMjY4NDJaD0Fzc3VtZWRSb2xlVXNlcmAAahIzOTYwMjU3NTI3NDY2MTQwNzhyEnJhbXRlc3RhcHByZWFkb25seQ=="
    12. },
    13. "RequestId": "EE788165-B760-4014-952C-E58ED229C80D"
    14. }
  2. 使用 CLI 工具读取数据(版本 V1.2 开始支持 token 参数,待发布)。

    1. 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==
    2. OTS-TableStoreTest>: get test_write_read '001'
    3. age:INTEGER='30'

使用临时授权访问控制台

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

  1. 使用主账号登录访问控制 RAM 控制台,进入概览页面。

  2. 单击RAM 用户登录链接后面的链接,进入阿里云 RAM 用户登录页面,输入子账号的 ram_test_app 用户名及密码进行登录。

  3. 登录成功后,单击页面右上角的用户名,然后单击切换身份,进入角色切换页面。

  4. 输入企业姓名和角色名,然后单击切换

使用临时授权调用 JAVA SDK

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

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

总结

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

本文导读目录