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

进阶使用 STS

更新时间:2017-06-07 13:26:11

进阶使用 STS

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

当用户的数据很多时,要求能够安全的授权给众多iot的子帐户,并且多个子帐户的存储隔离。

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

创建角色

之前已经解释过了角色的一些概念,本节将会给出使用角色的实际示例。请先创建一个名为 ram_test_iot 的子账号,再进行角色创建并授予其权限。这里创建两个角色,一个用于用户读取等操作,一个用于用户读写的操作。操作步骤如下:

  1. 使用主账号登录访问控制 RAM 的管理控制台。(默认已开通访问控制服务)

  2. 单击页面左侧的用户管理,进入用户管理页面。

  3. 单击右上角的新建用户,进入创建用户的页面,创建一个拥有和主账号一样完全访问表格存储权限的子账号。

  4. 填写账号信息并勾选“为该用户自动生成 AccessKey”,然后单击确定。示例中使用的用户名称是 ram_test_iot。

  5. 创建账号的最后一步会生成该账号的 AccessKey,单击保存 AK 信息

    注意:这是该账号的 AccessKey 可供下载的唯一机会,请及时保存。

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

  7. 单击页面左侧的角色管理,进入角色管理页面。

  8. 单击新建角色,进入创建角色页面。

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

  10. 由于角色本身是被阿里云账号使用过的,因此选择默认的即可。然后单击下一步。

  11. 输入角色名称(示例中使用 RamTestIotReadOnly),若有必要可填加备注,然后单击创建关闭,完成角色创建。

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

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

  14. 选中“空白模板”,进入创建自定义授权策略的页面。

  15. 填写授权策略名称(示例中使用 ram-test-iot-readonly),并将如下内容填写至策略内容栏,这里表示对 ram-test-iot 拥有只读权限。

    1. {
    2. "Version": "1",
    3. "Statement": [
    4. {
    5. "Action": [
    6. "rds:DescribeDBInstances",
    7. "rds:DescribeDatabases",
    8. "rds:DescribeAccounts",
    9. "rds:DescribeDBInstanceNetInfo"
    10. ],
    11. "Resource": "*",
    12. "Effect": "Allow"
    13. },
    14. {
    15. "Action": "ram:ListRoles",
    16. "Effect": "Allow",
    17. "Resource": "*"
    18. },
    19. {
    20. "Action":[
    21. "mns:ListTopic"
    22. ],
    23. "Resource": "*",
    24. "Effect": "Allow"
    25. },
    26. {
    27. "Action": [
    28. "dhs:ListProject",
    29. "dhs:ListTopic",
    30. "dhs:GetTopic"
    31. ],
    32. "Resource": "*",
    33. "Effect": "Allow"
    34. },
    35. {
    36. "Action": [
    37. "ots:ListInstance",
    38. "ots:ListTable",
    39. "ots:DescribeTable"
    40. ],
    41. "Resource": "*",
    42. "Effect": "Allow"
    43. },
    44. {
    45. "Action":[
    46. "log:ListShards",
    47. "log:ListLogStores",
    48. "log:ListProject"
    49. ],
    50. "Resource": "*",
    51. "Effect": "Allow"
    52. },
    53. {
    54. "Effect": "Allow",
    55. "Action": [
    56. "iot:Query*",
    57. "iot:List*",
    58. "iot:Get*",
    59. "iot:BatchGet*"
    60. ],
    61. "Resource": "*"
    62. }
    63. ]
    64. }
  16. 单击页面左侧的角色管理,进入角色管理页面。
  17. 单击 RamTestIotReadOnly 右侧操作栏中的授权按钮,进入“编辑角色授权策略”页面。

  18. 搜索“ram-test-iot-readonly”,选中后单击 > 以将该权限添加至“已选择授权策略名称”栏中,最后单击确定,完成给该角色赋予对 ram-test-iot 拥有只读的权限。

按照上述同样的方法,建立一个 RamTestIotWrite 的角色,并赋予该角色写 ram-test-iot 的自定义授权,授权策略如下。

  1. {
  2. "Version": "1",
  3. "Statement": [
  4. {
  5. "Action": [
  6. "rds:DescribeDBInstances",
  7. "rds:DescribeDatabases",
  8. "rds:DescribeAccounts",
  9. "rds:DescribeDBInstanceNetInfo"
  10. ],
  11. "Resource": "*",
  12. "Effect": "Allow"
  13. },
  14. {
  15. "Action": "ram:ListRoles",
  16. "Effect": "Allow",
  17. "Resource": "*"
  18. },
  19. {
  20. "Action":[
  21. "mns:ListTopic"
  22. ],
  23. "Resource": "*",
  24. "Effect": "Allow"
  25. },
  26. {
  27. "Action": [
  28. "dhs:ListProject",
  29. "dhs:ListTopic",
  30. "dhs:GetTopic"
  31. ],
  32. "Resource": "*",
  33. "Effect": "Allow"
  34. },
  35. {
  36. "Action": [
  37. "ots:ListInstance",
  38. "ots:ListTable",
  39. "ots:DescribeTable"
  40. ],
  41. "Resource": "*",
  42. "Effect": "Allow"
  43. },
  44. {
  45. "Action":[
  46. "log:ListShards",
  47. "log:ListLogStores",
  48. "log:ListProject"
  49. ],
  50. "Resource": "*",
  51. "Effect": "Allow"
  52. },
  53. {
  54. "Effect": "Allow",
  55. "Action": "iot:*",
  56. "Resource": "*"
  57. }
  58. ]
  59. }

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

临时授权访问

创建角色后,就可以使用临时授权来访问物联网套件接口了。

准备工作

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

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

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

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

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

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

  • AliyunIOTReadOnly
  1. {
  2. "Version": "1",
  3. "Statement": [
  4. {
  5. "Effect": "Allow",
  6. "Action": "iot:QueryProduct",
  7. "Resource": "*"
  8. }
  9. ]
  10. }
  1. 上述的两个授权策略都建成后,单击页面左侧的用户管理,进入用户管理页面。

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

  3. 搜索“AliyunIOTReadOnly”,选中后单击 > 以将该权限添加至“已选择授权策略名称”栏中,最后单击确定,完成将这两个授权赋给 ram_test_app 这个账号的操作。

使用 STS

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

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

  1. $python ./sts.py AssumeRole RoleArn=acs:ram::1872177966808743:role/iotstsrole RoleSessionName=iotreadonlyrole Policy='{"Version":"1","Statement":[{"Effect":"Allow","Action":"iot:*","Resource":"*"}]}' DurationSeconds=1000 --id=id --secret=secret

参数说明:

  • RoleArn:指需要扮演的角色 ID。角色的 ID 可以在角色管理页面,单击管理按钮进入角色详情的页面中找到。

  • RoleSessionName:指临时凭证的名称,一般来说建议使用不同的应用程序用户来区分。

  • Policy:指在扮演角色时额外加上的一个权限限制。

    (注意:这里传入的 Policy 是用来限制扮演角色之后的临时凭证的权限。最后临时凭证获得的权限是角色的权限和这里传入的 Policy 的交集。在扮演角色时传入 Policy 是为了灵活性,比如上传文件时可以根据不同的用户添加对于上传文件路径的限制,这点会在下面的例子展示。)

  • DurationSeconds:指临时凭证的有效期。单位是秒,最小为 900,最大为 3600。

  • id 和 secret:指需要扮演角色的子账号的 AccessKey 的 Access Key ID 和 Access Key Secret。

使用临时授权调用 JAVA SDK

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

  1. IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", AccessKeyId,AccessSecret);
  2. RpcAcsRequest request.putQueryParameter("SecurityToken", Token);
  3. IAcsClient client = new DefaultAcsClient(profile);
  4. AcsResponse response = client.getAcsResponse(request);

总结

本章主要介绍了如何使用 STS ,在典型的移动开发场景中,通过使用 STS,不同的用户拥有不同的权限,主账户拥有绝对的用户控制管理权限,子账号 AccessKey 泄露时不会其他账户影响,可以通过主账号管理该账户及时的对该用户进行权限控制,因此大大降低了泄露子账号信息的危害。在获取临时授权的时候,可以根据 用户的不同,传入不同的授权策略来限制用户的访问权限,从而达到隔离出不同用户拥有不同访问接口的目的。

本文导读目录