阿里云权限管理机制包括访问控制和临时安全令牌,可以根据需求使用不同权限的RAM用户来访问表格存储,也支持为用户提供访问的临时授权。使用RAM和STS能极大地提高管理的灵活性和安全性。

背景信息

RAM和STS解决的一个核心问题是如何在不暴露主账号的AccessKey的情况下安全地授权其他人访问。因为主账号的AccessKey泄露会带来极大的安全风险,其他人可以随意操作该账号下所有的资源、盗取重要信息等。
  • 访问控制(RAM)是阿里云提供的管理用户身份与资源访问权限的服务。

    RAM允许在一个阿里云账号下创建并管理多个身份,并允许给单个身份或一组身份分配不同的权限,从而实现不同用户拥有不同资源访问权限的目的。更多信息,请参见什么是访问控制

  • 阿里云临时安全令牌(Security Token Service,STS)是阿里云提供的一种临时访问权限管理服务。

    通过STS服务,您所授权的身份主体(RAM用户或RAM角色)可以获取一个自定义时效和访问权限的临时访问令牌。更多信息,请参见什么是STS

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

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

配置RAM用户权限

  1. 创建RAM用户。具体操作,请参见创建RAM用户
  2. 为RAM用户授权,根据实际配置RAM用户的权限。具体操作,请参见为RAM用户授权
    • 如果需要管理表格存储,例如创建实例等,请授予RAM用户AliyunOTSFullAccess权限。
    • 如果需要只读访问表格存储,例如读取表中数据等,请授予RAM用户AliyunOTSReadOnlyAccess权限。
    • 如果需要只写访问表格存储,例如创建数据表等,请授予RAM用户AliyunOTSWriteOnlyAccess权限。
    说明 如果需要更精细的权限控制,您可以创建自定义策略,进行策略权限的配置。更多信息,请参见自定义权限
  3. 为RAM用户设置多因素认证。具体操作,请参见为RAM用户设置多因素认证

配置临时用户权限

  1. 创建临时角色及授权。
    1. 创建可信实体为阿里云账号的RAM角色。具体操作,请参见创建可信实体为阿里云账号的RAM角色

      创建名称分别为RamTestAppReadOnly和RamTestAppWrite两个角色,RamTestAppReadOnly用于读取等操作,RamTestAppWrite用于上传文件的操作。

    2. 创建自定义策略。具体操作,请参见创建自定义策略
      说明 如果需要更精细的权限控制,您可以自定义策略的权限。更多信息,请参见自定义权限
      创建名称分别为ram-test-app-readonly和ram-test-app-write的两个策略。
      • 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-write策略
            {
         "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"
            }
                                
    3. 为临时角色授权。具体操作,请参见为RAM角色授权

      为ramtestappreadonly角色赋予ram-test-app-readonly(只读访问表格存储)策略,为ramtestappwrite角色赋予ram-test-app-write(只写表格存储)策略。

      授权完成后,记录角色的ARN,即需要扮演角色的ID,如下图所示。fig_arn
  2. 临时授权访问。
    1. 创建自定义策略。具体操作,请参见创建自定义策略
      说明 如果需要更精细的权限控制,您可以自定义策略的权限。更多信息,请参见自定义权限
      创建名称分别为AliyunSTSAssumeRolePolicy2016011401和AliyunSTSAssumeRolePolicy2016011402的两个策略。其中Resource为角色的ARN信息。
      • AliyunSTSAssumeRolePolicy2016011401
        {
        "Version": "1",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "sts:AssumeRole",
                "Resource": "acs:ram:198***237:role/ramtestappreadonly"
            }
        ]
        }
                                        
      • AliyunSTSAssumeRolePolicy2016011402
        {
        "Version": "1",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "sts:AssumeRole",
                "Resource": "acs:ram:198***237:role/ramtestappwrite"
            }
        ]
        }
                                        
    2. 授权RAM用户临时角色。具体操作,请参见为RAM用户授权

      将自定义策略AliyunSTSAssumeRolePolicy2016011401和AliyunSTSAssumeRolePolicy2016011402授权给名称为ram_test_app的RAM用户。

  3. 从STS获取的临时访问凭证。具体操作,请参见AssumeRole
  4. 使用临时授权读写数据。
    您可以使用临时授权调用不同语言的SDK访问表格存储。Java SDK请参考以下方式创建OTSClient对象,传入从STS获取的AccessKeyId、AccessKeySecret和SecurityToken等参数。
    OTSClient client = new OTSClient(otsEndpoint, stsAccessKeyId, stsAccessKeySecret, instanceName, stsToken);