自定义RAM Policy

本文为您介绍RAM PolicyAction、ResourceCondition的定义以及应用场景。

Action定义

ActionAPI的名称,您可以根据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:*"               

所有SQL操作API

"Action": "ots:SQL*"

Resource定义

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

acs:ots:[region]:[user_id]:instance/[instance_name]/table/[table_name]            

其中产品固定取值为ots,[region]取值为资源所在地域的RegionID(例如cn-hangzhou),[user_id]取值为阿里云账号ID,[instance_name]取值为表格存储实例名称,[table_name]取值为表格存储表名称,请根据实际配置。

说明

表格存储中实例名称不区分大小写,在Resource资源定义中的[instance_name]请用小写表示。

Tunnel涉及的Resource定义只能到实例级别,即Tunnel的资源由产品、地域、用户ID和实例名组成。Resource格式如下:

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"
    ]                   

注意事项

  • RAM PolicyActionResource通过字符串匹配进行验证,并且通配符星号(*)区分前缀和后缀匹配。如果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),后端服务会对被访问的每张表分别鉴权,只有所有表都通过鉴权才能执行操作,否则会返回权限错误。

表格存储API类型

目前表格存储包含实例管理类API、表和数据读写类API以及实时通道管理和读写类API。不同类型API访问的资源的配置信息如下:

管理类API访问的资源

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

API名称/Action

访问的资源

ListInstance

instance/*

InsertInstance

instance/[instance_name]

GetInstance

instance/[instance_name]

DeleteInstance

instance/[instance_name]

数据类API访问的资源

数据类API主要为表和行相关的操作,控制台和SDK都会调用,对该类APIActionResource定义,将影响用户使用控制台。以下访问的资源省略了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]

ConsumeTunnel

instance/[instance_name]/table/[table_name]

BulkImport

instance/[instance_name]/table/[table_name]

BulkExport

instance/[instance_name]/table/[table_name]

SQL_Select

instance/[instance_name]/table/[table_name]

SQL_Create

instance/[instance_name]/table/[table_name]

SQL_DropMapping

instance/[instance_name]/table/[table_name]

Tunnel API访问的资源

Tunnel API主要为通道相关的操作,控制台和SDK都会调用,对该类APIActionResource定义,将影响用户使用控制台。以下访问的资源省略了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]

ConsumeTunnel

instance/[instance_name]

Condition定义

目前表格存储支持的Policy包括访问IP限制、是否通过HTTPS访问、是否通过MFA(多因素认证)访问、是否通过TLSv1.2TLSv1.3版本访问、访问时间限制等多种鉴权条件。

访问IP限制

通过自定义权限策略限制访问表格存储的源IP地址,并且支持根据网段进行过滤。典型配置如下:

  • 限制多个IP地址。

    以下示例用于只允许IP地址为10.10.XX.XX10.11.XX.XX的请求访问。

    {
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ots:*",
            "Resource": "acs:ots:*:*:*",
            "Condition": {
                "IpAddress": {
                    "acs:SourceIp": [
                        "10.10.XX.XX",
                        "10.11.XX.XX"
                    ]
                }
            }
        }
    ],
    "Version": "1"
    }                           
  • 限制单个IP地址和IP网段。

    以下示例用于只允许IP地址为10.10.XX.XX10.10.XX.XX/24网段的请求访问。

    {
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ots:*",
            "Resource": "acs:ots:*:*:*",
            "Condition": {
                "IpAddress": {
                    "acs:SourceIp": [
                        "10.10.XX.XX",
                        "10.10.XX.XX/24"
                    ]
                }
            }
        }
    ],
    "Version": "1"
    }                            

HTTPS访问限制

通过自定义权限策略限制是否通过HTTPS访问表格存储

以下示例用于限制请求必须通过HTTPS访问表格存储

{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ots:*",
            "Resource": "acs:ots:*:*:*",
            "Condition": {
                "Bool": {
                    "acs:SecureTransport": "true"
                }
            }
        }
    ],
    "Version": "1"
}                    

TLS版本访问限制

通过自定义权限策略限制是否通过TLSv1.2TLSv1.3版本访问表格存储

以下示例用于限制请求必须通过TLSv1.2TLSv1.3版本访问表格存储

{
    "Version": "1",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": [
                "ots:*",
            ],
            "Resource": [
                "*"
            ],
            "Condition": {
                "StringNotEquals": {
                  "ots:TLSVersion": [
                    "TLSv1.2",
                    "TLSv1.3"
                  ]
                }
            }
        }
    ]
}

MFA访问限制

通过自定义权限策略限制是否通过MFA(多因素认证)访问表格存储

以下示例用于限制请求必须通过MFA访问表格存储

{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ots:*",
            "Resource": "acs:ots:*:*:*",
            "Condition": {
                "Bool": {
                    "acs:MFAPresent ": "true"
                }
            }
        }
    ],
    "Version": "1"
}                    

访问时间限制

通过自定义权限策略限制请求的访问时间,即只允许或拒绝在某个时间点范围之前的请求。

以下示例用于限制用户在北京时间201611日零点之前可以访问表格存储,之后将不能再访问。

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

典型使用场景

结合对Action、ResourceCondition的定义介绍典型场景的Policy定义和授权方法。

场景一:多种授权条件

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

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

  2. 创建权限策略。

    1. 在左侧导航栏,选择权限管理 > 权限策略

    2. 权限策略页面,单击创建权限策略

    3. 创建权限策略页面,单击脚本编辑页签,并将如下内容填写到策略内容中。

      {
      "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.10.XX.XX/24"
                      ]
                  },
                  "DateLessThan": {
                      "acs:CurrentTime": "2016-01-01T00:00:00+08:00"
                  },
                  "Bool": {
                      "acs:SecureTransport": "true"
                  }
              }
          }
      ],
      "Version": "1"
      }                            
    4. 单击继续编辑基本信息,输入策略名称和备注。

    5. 单击确定

  3. RAM用户授予权限策略。

    1. 在左侧导航栏,选择身份管理 > 用户

    2. 用户页面,找到需要授权的RAM用户,单击用户操作列的添加权限

    3. 新增授权面板,选择权限为自定义策略后,搜索已新建的策略名称,并选中该策略前的复选框将策略添加到已选择授权策略栏。

    4. 单击确认新增授权

    5. 单击关闭

场景二:拒绝请求

对于访问IP地址为10.10.XX.XX的用户,拒绝对华北2(北京)地域名称以onlineproduct开头的实例下的所有表执行写操作(不包括对实例的操作)。

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

  2. 创建权限策略。

    1. 在左侧导航栏,选择权限管理 > 权限策略

    2. 权限策略页面,单击创建权限策略

    3. 创建权限策略页面,单击脚本编辑页签,并将如下内容填写到策略内容中。

      {
          "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.10.XX.XX"
                          ]
                      }
                  }
              }
          ],
          "Version": "1"
      }                 
    4. 单击继续编辑基本信息,输入策略名称和备注。

    5. 单击确定

  3. RAM用户授予权限策略。

    1. 在左侧导航栏,选择身份管理 > 用户

    2. 用户页面,找到需要授权的RAM用户,单击用户操作列的添加权限

    3. 新增授权面板,选择权限为自定义策略后,搜索已新建的策略名称,并选中该策略前的复选框将策略添加到已选择授权策略栏。

    4. 单击确认新增授权

    5. 单击关闭