本文为您介绍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:*"
- 所有SQL操作API
"Action": "ots:SQL*"
Resource定义
表格存储的资源由产品、地域、用户ID、实例名和表名多个字段组成。每个字段支持星号通配符(包括前缀匹配和后缀匹配),Resource格式如下:
acs:ots:[region]:[user_id]:instance/[instance_name]/table/[table_name]
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主要为实例相关的操作,仅由控制台调用。对该类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] 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都会调用,对该类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] ConsumeTunnel 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" }
- 限制多个IP地址。例如只允许IP地址为10.101.168.111和10.101.169.111的请求访问。
- 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访问。
操作步骤如下:
- 使用阿里云账号登录访问控制RAM管理控制台(默认已开通访问控制服务)。
- 在左侧导航栏,选择 。
- 在权限策略管理页面,单击新建权限策略。
- 在创建权限策略页面,填写策略名称,选择脚本配置,并将如下内容填写到策略内容栏。
{ "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" }
- 单击确定。
- 在左侧导航栏,选择添加权限按钮,进入编辑个人授权页面。 。找到需要授权的RAM用户,单击其右侧操作栏下面的
- 搜索刚才新建的策略名称,将该策略添加至已选择授权策略名称栏中,然后单击确定,完成对该账号的策略授权。
- 拒绝请求
对于访问IP地址为10.101.169.111的用户,拒绝对华北2(北京)地域,名称以online和product开头的实例下的所有表执行写操作(不包括对实例的操作)。
创建自定义授权策略和为RAM用户授权的步骤同上,只需将如下内容填写到策略内容栏即可。
{ "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" }