本文为您介绍Action、Resource 和 Condition 的定义以及应用场景。

Action 定义

Action 是 API 的名称,可以根据 Action 设置开放或限制用户可以访问的 API。在创建表格存储的授权策略时,每个 Action 都需要添加ots:前缀,多个 Action 以逗号分隔,并且支持星号通配符(包括前缀匹配和后缀匹配)。

下面是一些典型的 Action 定义:

  • 单个 API

    "Action": "ots:GetRow"
    					
  • 多个 API

    "Action": [
    "ots:PutRow",
    "ots:GetRow"
    ]
    					
  • 所有只读 API

    {
      "Version": "1",
      "Statement": [
        {
          "Action": [
            "ots:BatchGet*",
            "ots:Describe*",
            "ots:Get*",
            "ots:List*",
            "ots:Consume*",
            "ots:Search",
            "ots:ComputeSplitPointsBySize"
          ],
          "Resource": "*",
          "Effect": "Allow"
        }
      ]
    }                
  • 所有读写 API

    "Action": "ots:*"               

Resource 定义

表格存储的资源由产品、地域、用户 ID、实例名和表名多个字段组成。每个字段支持星号通配符(包括前缀匹配和后缀匹配),格式如下。

acs:ots:[region]:[user_id]:instance/[instance_name]/table/[table_name]
			
其中,[xxx] 表示变量,产品固定为 ots,地域为英文缩写(如 cn-hangzhou, 详情请参考地域),用户 ID 为阿里云账号 ID。
说明
  • 表格存储中实例名称不区分大小写,上述 Resource 资源定义中的 [instance_name] 请用小写表示。
  • Tunnel涉及的Resource定义只能到实例级别,而不是表级别,即Tunnel的资源由产品、地域、用户 ID、实例名组成,格式如下:
    acs:ots:[region]:[user_id]:instance/[instance_name]
    							

下面是一些典型的 Resource 定义:

  • 所有地域的所有用户的所有资源

    "Resource": "acs:ots:*:*:*"
    					
  • 华东 1 区域,用户 123456 的所有实例及其下面所有的表

    "Resource": "acs:ots:cn-hangzhou:123456:instance/*"
    					
  • 华东 1 区域,用户 123456 的名称为 abc 的实例及其下面所有的表

    "Resource": [
    "acs:ots:cn-hangzhou:123456:instance/abc",
    "acs:ots:cn-hangzhou:123456:instance/abc/table/*"
    ]
    					
  • 所有以 abc 开头的实例及下面的所有表

    "Resource": "acs:ots:*:*:instance/abc*"
    					
  • 所有以 abc 开头的实例下面的所有以 xyz 开头的表(不包括实例资源,不匹配 acs:ots:*:*:instance/abc*)

    "Resource": "acs:ots:*:*:instance/abc*/table/xyz*"
    					
  • 所有以 abc 结尾的 Instance 及下面的所有以 xyz 结尾的表

    "Resource": [
    "acs:ots:*:*:instance/*abc",
    "acs:ots:*:*:instance/*abc/table/*xyz"
    ]
    					

表格存储的 API 类型

目前表格存储包含以下两类 API:

  • 实例读写相关的管理类 API

  • 表和行读写相关的数据类 API

各 API 的类别详情如下表所示:

  • 管理类 API 访问的资源

    管理类 API 主要为实例相关的操作,仅由控制台调用。对这类 API 的 Action和 Resource定义,将影响用户使用控制台。下面访问的资源省略了 acs:ots:[region]:[user_id]: 前缀,只描述实例和表部分。

    API 名称/Action 访问的资源
    ListInstance instance/*
    InsertInstance instance/[instance_name]
    GetInstance instance/[instance_name]
    DeleteInstance instance/[instance_name]
  • 数据类 API 访问的资源

    数据类 API 主要为表和行相关的操作,控制台和 SDK 都会调用,对这类 API 的 Action 和 Resource 定义,将影响用户使用控制台。下面访问的资源省略了 acs:ots:[region]:[user_id]: 前缀,只描述实例和表部分。

    API 名称/Action 访问的资源
    ListTable instance/[instance_name]/table/*
    CreateTable instance/[instance_name]/table/[table_name]
    UpdateTable instance/[instance_name]/table/[table_name]
    DescribeTable instance/[instance_name]/table/[table_name]
    DeleteTable instance/[instance_name]/table/[table_name]
    GetRow instance/[instance_name]/table/[table_name]
    PutRow instance/[instance_name]/table/[table_name]
    UpdateRow instance/[instance_name]/table/[table_name]
    DeleteRow instance/[instance_name]/table/[table_name]
    GetRange instance/[instance_name]/table/[table_name]
    BatchGetRow instance/[instance_name]/table/[table_name]
    BatchWriteRow instance/[instance_name]/table/[table_name]
    ComputeSplitPointsBySize instance/[instance_name]/table/[table_name]
    StartLocalTransaction instance/[instance_name]/table/[table_name]
    CommitTransaction instance/[instance_name]/table/[table_name]
    AbortTransaction instance/[instance_name]/table/[table_name]
    CreateIndex instance/[instance_name]/table/[table_name]
    DropIndex instance/[instance_name]/table/[table_name]
    CreateSearchIndex instance/[instance_name]/table/[table_name]
    DeleteSearchIndex instance/[instance_name]/table/[table_name]
    ListSearchIndex instance/[instance_name]/table/[table_name]
    DescribeSearchIndex instance/[instance_name]/table/[table_name]
    Search instance/[instance_name]/table/[table_name]
    CreateTunnel instance/[instance_name]/table/[table_name]
    DeleteTunnel instance/[instance_name]/table/[table_name]
    ListTunnel instance/[instance_name]/table/[table_name]
    DescribeTunnel instance/[instance_name]/table/[table_name]
    CosumeTunnel instance/[instance_name]/table/[table_name]
  • Tunnel API 访问的资源

    Tunnel API 主要为实例相关的操作,控制台和 SDK 都会调用,对这类 API 的 Action 和 Resource 定义,将影响用户使用控制台。下面访问的资源省略了 acs:ots:[region]:[user_id]: 前缀,只描述实例和表部分。

    API 名称/Action 访问的资源
    ListTable instance/[instance_name]
    CreateTable instance/[instance_name]
    UpdateTable instance/[instance_name]
    DescribeTable instance/[instance_name]
    DeleteTable instance/[instance_name]
    GetRow instance/[instance_name]
    PutRow instance/[instance_name]
    UpdateRow instance/[instance_name]
    DeleteRow instance/[instance_name]
    GetRange instance/[instance_name]
    BatchGetRow instance/[instance_name]
    BatchWriteRow instance/[instance_name]
    ComputeSplitPointsBySize instance/[instance_name]
    StartLocalTransaction instance/[instance_name]
    CommitTransaction instance/[instance_name]
    AbortTransaction instance/[instance_name]
    CreateIndex instance/[instance_name]
    DropIndex instance/[instance_name]
    CreateSearchIndex instance/[instance_name]
    DeleteSearchIndex instance/[instance_name]
    ListSearchIndex instance/[instance_name]
    DescribeSearchIndex instance/[instance_name]
    Search instance/[instance_name]
    CreateTunnel instance/[instance_name]
    DeleteTunnel instance/[instance_name]
    ListTunnel instance/[instance_name]
    DescribeTunnel instance/[instance_name]
    CosumeTunnel instance/[instance_name]
  • 常见问题说明
    • Policy 里 Action 和 Resource 通过字符串匹配进行验证的,并且星号通配符区分前缀和后缀匹配。如果 Resource 定义为 acs:ots:*:*:instance/*/,则无法匹配 acs:ots:*:*:instance/abc。如果 Resource 定义为 acs:ots:*:*:instance/abc,则无法匹配 acs:ots:*:*:instance/abc/table/xyz。

    • 登录表格存储控制台管理实例资源,需要授予用户 acs:ots:[region]:[user_id]:instance/* 资源的读取权限,因为控制台需要获取实例的列表。

    • 对于批量操作 API(如 BatchGetRow 和 BatchWriteRow),后端服务会对被访问的每张表分别鉴权,只有所有表都通过鉴权才能执行操作,否则会返回权限错误。

Condition 定义

目前 Policy 支持访问 IP 限制、是否通过 HTTPS 访问、是否通过 MFA(多因素认证)访问和访问时间限制等多种鉴权条件,表格存储所有 API 都已经支持这些条件。

  • 访问 IP 限制

    访问控制 RAM 可以限制访问表格存储的源 IP 地址,并且支持根据网段进行过滤。下面是一些典型的使用场景:

    • 限制多个 IP 地址。例如,只允许 IP 地址为 10.101.168.111 和 10.101.169.111 的请求访问。

      {
      "Statement": [
          {
              "Effect": "Allow",
              "Action": "ots:*",
              "Resource": "acs:ots:*:*:*",
              "Condition": {
                  "IpAddress": {
                      "acs:SourceIp": [
                          "10.101.168.111",
                          "10.101.169.111"
                      ]
                  }
              }
          }
      ],
      "Version": "1"
      }
      							
    • 限制单个 IP 地址和 IP 网段。例如,只允许 IP 地址为 10.101.168.111 或 10.101.169.111/24 网段的请求访问。

      {
      "Statement": [
          {
              "Effect": "Allow",
              "Action": "ots:*",
              "Resource": "acs:ots:*:*:*",
              "Condition": {
                  "IpAddress": {
                      "acs:SourceIp": [
                          "10.101.168.111",
                          "10.101.169.111/24"
                      ]
                  }
              }
          }
      ],
      "Version": "1"
      }
      							
  • HTTPS 访问限制

    访问控制可以限制是否通过 HTTPS 访问。

    下面是典型的使用场景,限制请求必须通过 HTTPS 访问。

    {
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "ots:*",
                "Resource": "acs:ots:*:*:*",
                "Condition": {
                    "Bool": {
                        "acs:SecureTransport": "true"
                    }
                }
            }
        ],
        "Version": "1"
    }
    					
  • MFA 访问限制

    访问控制可以限制是否通过 MFA(多因素认证)访问。

    下面是典型的使用场景,限制请求必须通过 MFA 访问。

    {
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "ots:*",
                "Resource": "acs:ots:*:*:*",
                "Condition": {
                    "Bool": {
                        "acs:MFAPresent ": "true"
                    }
                }
            }
        ],
        "Version": "1"
    }
    					
  • 访问时间限制

    访问控制可以限制请求的访问时间,即只允许或拒绝在某个时间点范围之前的请求。下面是典型的使用场景。

    例如,北京时间 2016 年 1 月 1 号凌晨之前用户可以访问,之后就不能再访问。

    {
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "ots:*",
                "Resource": "acs:ots:*:*:*",
                "Condition": {
                    "DateLessThan": {
                        "acs:CurrentTime": "2016-01-01T00:00:00+08:00"
                    }
                }
            }
        ],
        "Version": "1"
    }
    					

典型使用场景

结合上面对 Action、Resource 和 Condition 的定义,下面列出一些典型使用场景的 Policy 定义和授权方法。

  • 多种授权条件

    对于访问 IP 地址为 10.101.168.111/24 网段的用户,可以对所有名称为 online-01 和 online-02 的实例执行读/写操作(包括实例下面的所有表),且要求只能在 2016-01-01 00:00:00 之前访问和通过 HTTPS 访问。

    操作步骤如下:

    1. 使用主账号登录访问控制 RAM 管理控制台。(默认已开通访问控制服务)
    2. 在左侧导航栏,选择权限管理 > 权限策略管理,进入权限策略管理页面。
    3. 单击新建权限策略,进入创建权限策略的页面。
    4. 填写策略名称,选择脚本配置,并将如下内容填写至策略内容栏。
      {
      "Statement": [
          {
              "Effect": "Allow",
              "Action": "ots:*",
              "Resource": [
                  "acs:ots:*:*:instance/online-01",
                  "acs:ots:*:*:instance/online-01/table/*",
                  "acs:ots:*:*:instance/online-02",
                  "acs:ots:*:*:instance/online-02/table/*"
              ],
              "Condition": {
                  "IpAddress": {
                      "acs:SourceIp": [
                          "10.101.168.111/24"
                      ]
                  },
                  "DateLessThan": {
                      "acs:CurrentTime": "2016-01-01T00:00:00+08:00"
                  },
                  "Bool": {
                      "acs:SecureTransport": "true"
                  }
              }
          }
      ],
      "Version": "1"
      }
      							
    5. 单击确认
    6. 在左侧导航栏,选择人员管理 > 用户。找到需要授权的子账号,单击其右侧操作栏下面的添加权限按钮,进入编辑个人授权页面。
    7. 搜索刚才新建的策略名称,单击改策略将该权限添加至已选择授权策略名称栏中,然后单击确定,完成对该账号的策略授权。
  • 拒绝请求

    对于访问 IP 地址为 10.101.169.111 的用户,拒绝对北京区域,名称以 online 和 product 开头的实例下面的所有表执行写操作(不包括对实例的操作)。

    创建自定义授权策略和给子账号授权的步骤同上,只需将如下内容填写至策略内容栏即可。

    {
        "Statement": [
            {
                "Effect": "Deny",
                "Action": [
                    "ots:Create*",
                    "ots:Insert*",
                    "ots:Put*",
                    "ots:Update*",
                    "ots:Delete*",
                    "ots:BatchWrite*"
                ],
                "Resource": [
                    "acs:ots:cn-beijing:*:instance/online*/table/*",
                    "acs:ots:cn-beijing:*:instance/product*/table/*"
                ],
                "Condition": {
                    "IpAddress": {
                        "acs:SourceIp": [
                            "10.101.169.111"
                        ]
                    }
                }
            }
        ],
        "Version": "1"
    }