本文为您介绍RAM Policy中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配置用户能访问的表格存储资源。每个字段均支持星号(*)通配符(包括前缀匹配和后缀匹配)。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 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),后端服务会对被访问的每张表分别鉴权,只有所有表都通过鉴权才能执行操作,否则会返回权限错误。
表格存储的API类型
目前表格存储包含实例管理类API、表和数据读写类API以及实时通道管理和读写类API。不同类型API访问的资源的配置信息如下:
管理类API访问的资源
管理类API主要为实例相关的操作,由控制台和OpenAPI调用。以下访问的资源省略了acs:ots:[region]:[user_id]:前缀,只描述实例部分。
|
API名称 |
Action |
访问的资源 |
|
CreateInstance |
ots:InsertInstance |
instance/[instance_name] |
|
UpdateInstance |
ots:UpdateInstance |
instance/[instance_name] |
|
GetInstance |
ots:GetInstance |
instance/[instance_name] |
|
DeleteInstance |
ots:DeleteInstance |
instance/[instance_name] |
|
ListInstances |
ots:ListInstance |
instance/* |
|
ChangeResourceGroup |
ots:UpdateInstance |
instance/[instance_name] |
|
ListTagResources |
ots:ListTagResourcesCustomTags |
instance/* |
|
TagResources |
ots:TagResourcesCustomTags |
instance/[instance_name] |
|
UntagResources |
ots:UntagResourcesCustomTags |
instance/[instance_name] |
|
UpdateInstancePolicy |
ots:UpdateInstancePolicy |
instance/[instance_name] |
|
DeleteInstancePolicy |
ots:DeleteInstancePolicy |
instance/[instance_name] |
|
CheckInstancePolicy |
ots:CheckInstancePolicy |
instance/[instance_name] |
|
UpdateInstanceElasticVCUUpperLimit |
ots:UpdateInstanceElasticVCUUpperLimit |
instance/[instance_name] |
数据类API访问的资源
数据类API主要为表和行相关的操作,控制台和SDK都会调用,对该类API的Action和Resource定义,将影响用户使用控制台。以下访问的资源省略了acs:ots:[region]:[user_id]:前缀,只描述实例和表部分。
|
API名称 |
Action |
访问的资源 |
|
ListTable |
ots:ListTable |
instance/[instance_name]/table* |
|
CreateTable |
ots:CreateTable |
instance/[instance_name]/table/[table_name] |
|
UpdateTable |
ots:UpdateTable |
instance/[instance_name]/table/[table_name] |
|
DescribeTable |
ots:DescribeTable |
instance/[instance_name]/table/[table_name] |
|
DeleteTable |
ots:DeleteTable |
instance/[instance_name]/table/[table_name] |
|
CreateGlobalTable |
|
instance/[instance_name]/table/[table_name] |
|
DescribeGlobalTable |
ots:DescribeGlobalTable |
instance/[instance_name]/table/[table_name] |
|
UpdateGlobalTable |
|
instance/[instance_name]/table/[table_name] |
|
BindGlobalTable |
|
instance/[instance_name]/table/[table_name] |
|
UnbindGlobalTable |
|
instance/[instance_name]/table/[table_name] |
|
AddDefinedColumn |
ots:AddDefinedColumn |
instance/[instance_name]/table/[table_name] |
|
DeleteDefinedColumn |
ots:DeleteDefinedColumn |
instance/[instance_name]/table/[table_name] |
|
GetRow |
ots:GetRow |
instance/[instance_name]/table/[table_name] |
|
PutRow |
ots:PutRow |
instance/[instance_name]/table/[table_name] |
|
UpdateRow |
ots:UpdateRow |
instance/[instance_name]/table/[table_name] |
|
DeleteRow |
ots:DeleteRow |
instance/[instance_name]/table/[table_name] |
|
GetRange |
ots:GetRange |
instance/[instance_name]/table/[table_name] |
|
BatchGetRow |
ots:BatchGetRow |
instance/[instance_name]/table/[table_name] |
|
BatchWriteRow |
ots:BatchWriteRow |
instance/[instance_name]/table/[table_name] |
|
ComputeSplitPointsBySize |
ots:ComputeSplitPointsBySize |
instance/[instance_name]/table/[table_name] |
|
StartLocalTransaction |
ots:StartLocalTransaction |
instance/[instance_name]/table/[table_name] |
|
CommitTransaction |
ots:CommitTransaction |
instance/[instance_name]/table/[table_name] |
|
AbortTransaction |
ots:AbortTransaction |
instance/[instance_name]/table/[table_name] |
|
CreateIndex |
ots:CreateIndex |
instance/[instance_name]/table/[table_name] |
|
DropIndex |
ots:DropIndex |
instance/[instance_name]/table/[table_name] |
|
CreateSearchIndex |
ots:CreateSearchIndex |
instance/[instance_name]/table/[table_name] |
|
UpdateSearchIndex |
ots:UpdateSearchIndex |
instance/[instance_name]/table/[table_name] |
|
DeleteSearchIndex |
ots:DeleteSearchIndex |
instance/[instance_name]/table/[table_name] |
|
ListSearchIndex |
ots:ListSearchIndex |
instance/[instance_name]/table/[table_name] |
|
DescribeSearchIndex |
ots:DescribeSearchIndex |
instance/[instance_name]/table/[table_name] |
|
Search |
ots:Search |
instance/[instance_name]/table/[table_name] |
|
ComputeSplits |
ots:ComputeSplits |
instance/[instance_name]/table/[table_name] |
|
ParallelScan |
ots:ParallelScan |
instance/[instance_name]/table/[table_name] |
|
CreateTunnel |
ots:CreateTunnel |
instance/[instance_name]/table/[table_name] |
|
DeleteTunnel |
ots:DeleteTunnel |
instance/[instance_name]/table/[table_name] |
|
ListTunnel |
ots:ListTunnel |
instance/[instance_name]/table/[table_name] |
|
ConsumeTunnel |
ots:ConsumeTunnel |
instance/[instance_name]/table/[table_name] |
|
DescribeTunnel |
ots:DescribeTunnel |
instance/[instance_name]/table/[table_name] |
|
BulkImport |
ots:BulkImport |
instance/[instance_name]/table/[table_name] |
|
BulkExport |
ots:BulkExport |
instance/[instance_name]/table/[table_name] |
|
SQL_Select |
ots:SQL_Select |
instance/[instance_name]/table/[table_name] |
|
SQL_Create |
ots:SQL_Create |
instance/[instance_name]/table/[table_name] |
|
SQL_DropMapping |
ots: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] |
|
AddDefinedColumn |
instance/[instance_name] |
|
DeleteDefinedColumn |
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定义
您可以根据Condition配置用户能访问的场景策略,目前表格存储支持的Policy包括访问IP限制、是否通过HTTPS访问、是否通过MFA(多因素认证)访问、是否通过TLSv1.2和TLSv1.3版本访问、访问时间限制等多种鉴权条件。
访问IP限制
通过配置IP白名单限制访问表格存储的源IP地址,并且支持根据网段进行过滤。典型配置如下:
-
限制多个IP地址。
以下示例用于只允许IP地址为10.10.XX.XX和10.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.XX或10.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.2和TLSv1.3版本访问表格存储。
以下示例用于限制请求必须通过TLSv1.2和TLSv1.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"
}
访问时间限制
通过自定义权限策略限制请求的访问时间,即只允许或拒绝在某个时间点范围之前的请求。
以下示例用于限制用户在北京时间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访问白名单、地域和资源访问权限、访问时间段和访问方式等。
场景一:多种授权条件
对于访问IP地址为10.10.XX.XX/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.10.XX.XX/24" ] }, "DateLessThan": { "acs:CurrentTime": "2016-01-01T00:00:00+08:00" }, "Bool": { "acs:SecureTransport": "true" } } } ], "Version": "1" } -
在创建权限策略对话框中,输入策略名称和备注,然后单击确定。
-
-
为RAM用户授予权限策略。
-
在左侧导航栏,选择。
-
在用户页面,找到需要授权的RAM用户,单击用户操作列的添加权限。
-
在新增授权面板,选择权限为自定义策略后,搜索已新建的策略名称,并选中该策略前的复选框将策略添加到已选择权限策略栏。
-
单击确认新增授权。
-
单击关闭。
-
场景二:拒绝请求
对于访问IP地址为10.10.XX.XX的用户,拒绝对华北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.10.XX.XX" ] } } } ], "Version": "1" } -
在创建权限策略对话框中,输入策略名称和备注,然后单击确定。
-
-
为RAM用户授予权限策略。
-
在左侧导航栏,选择。
-
在用户页面,找到需要授权的RAM用户,单击用户操作列的添加权限。
-
在新增授权面板,选择权限为自定义策略后,搜索已新建的策略名称,并选中该策略前的复选框将策略添加到已选择权限策略栏。
-
单击确认新增授权。
-
单击关闭。
-
场景三:限制RAM用户管理指定的实例
仅允许RAM用户管理指定的实例,且无权查看和管理其他实例。
-
使用阿里云账号登录RAM控制台(默认已开通访问控制服务)。
-
创建权限策略。
-
在左侧导航栏,选择。
-
在权限策略页面,单击创建权限策略。
-
在创建权限策略页面,单击脚本编辑页签。
-
输入以下权限策略内容,然后单击确定。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "ots:ListInstance", "ots:ListTagResources" ], "Resource": "acs:ots:*:*:instance/*" }, { "Effect": "Allow", "Action": "ots:*", "Resource": [ "acs:ots:*:*:instance/yourInstance", "acs:ots:*:*:instance/yourInstance/table*" ] }, { "Effect": "Allow", "Action": "cms:Query*", "Resource": "*" } ] }权限策略的详细说明请参见下表。
权限策略
描述
{ "Effect": "Allow", "Action": [ "ots:ListInstance", "ots:ListTagResources" ], "Resource": "acs:ots:*:*:instance/*" }重要限制RAM用户在控制台管理指定实例时必须配置此项。
表格存储控制台的概览页面需要请求实例列表和标签列表,因此授予RAM用户获取实例列表和标签列表的权限。
{ "Effect": "Allow", "Action": "ots:*", "Resource": [ "acs:ots:*:*:instance/yourInstance", "acs:ots:*:*:instance/yourInstance/table*" ] }授予RAM用户拥有
yourInstance实例及实例下数据表的所有权限。{ "Effect": "Allow", "Action": "cms:Query*", "Resource": "*" }授予RAM用户云监控的权限,允许查看实例和表的监控数据。
-
-
在创建权限策略对话框中,输入策略名称和备注,然后单击确定。
-
为RAM用户授予权限策略。
-
在左侧导航栏,选择。
-
在用户页面,找到需要授权的RAM用户,单击用户操作列的添加权限。
-
在新增授权面板,选择权限为自定义策略后,搜索已新建的策略名称,并选中该策略前的复选框将策略添加到已选择权限策略栏。
-
单击确认新增授权。
-
单击关闭。
-