安装Package后,如果您需要对Package进行更细微的权限控制,例如控制只能访问Package内的部分资源或控制只能访问Package内表的部分列,您可以通过MaxCompute提供的细粒度授权(ACL)或LABEL授权实现。本文为您介绍如何通过这两种方式为用户或角色授权或撤销Package内资源的相应权限。
背景信息
MaxCompute对Package提供如下两种权限控制策略。
权限控制策略 | 说明 | 授权人 | 授权操作入口 |
在安装Package的项目中,对Package内的部分资源通过ACL方式(基于对象)授权或撤销授权。授权后,安装Package的项目中的用户即可对指定对象执行指定操作。 | 项目所有者(Project Owner)或具备Admin角色的用户。 | ||
在安装Package的项目中,对Package内的表资源通过LABEL方式进行授权或撤销授权。授权后,安装Package的项目中的用户仅能访问不超过指定LABEL等级的敏感数据信息,在细粒度授权基础上,实现更精细化的数据权限管理。更多LABEL信息,请参见Label权限控制。 |
细粒度授权(ACL)
对Package内部分资源进行ACL授权,语法格式如下。
--对指定对象授权。 grant <actions> on <object_type> <object_name> to [user|role] <name> privilegeproperties ("refobject"="true", "refproject"="<project_name>", "package"="<package_name>"); --对表的列授权。 grant <actions> on table <table_name>[(<column_list>)] to [user|role] <name> privilegeproperties ("refobject"="true", "refproject"="<project_name>", "package"="<package_name>");
查看Package内资源的ACL授权信息,语法格式如下。
show grants on <object_type> <object_name> privilegeproperties ("refobject"="true", "refproject"="<project_name>", "package"="<package_name>");
撤销Package内部分资源的ACL授权,语法格式如下。
--撤销对象授权。 revoke <actions> on <object_type> <object_name> from [user|role] <name> privilegeproperties ("refobject"="true", "refproject"="<project_name>", "package"="<package_name>"); --撤销表的列授权。 revoke <actions> on table <table_name>[(<column_list>)] from [user|role] <name> privilegeproperties ("refobject"="true", "refproject"="<project_name>", "package"="<package_name>");
语法中各参数的含义如下:
actions:必填。指定授予的操作权限。您可以执行
describe package project_name.package_name;
命令来查询Package中打包的操作权限。object_type:必填。指定Package中对象的类型。您可以执行
describe package project_name.package_name;
命令来查询Package中打包的对象类型。object_name:必填。指定Package中对象的名称。您可以执行
describe package project_name.package_name;
命令来查询Package中打包的对象名称。table_name:必填。指定表的名称。您可以执行
describe package project_name.package_name;
命令来查询Package中打包的表名称。column_list:可选。指定列名。多个列名需要用英文逗号(,)分隔。
"refobject"="true":必填。表示对Package进行细粒度授权。
"refproject"="<project_name>":必填。指定Package所属MaxCompute项目的名称。
"package"="<package_name>":必填。指定Package的名称。
LABEL授权
在细粒度授权基础上,对Package内的表实现按照LABEL授权,用户只能访问指定LABEL级别的表数据。
对Package内表资源进行LABEL授权,语法格式如下。
grant label <number> on table <table_name[(<column_list>)]> to [user|role] <name>[with exp <days>] privilegeproperties ("refobject"="true", "refproject"="<project_name>", "package"="<package_name>");
查看Package的LABEL授权信息,语法格式如下。
show label grants on table <table_name> privilegeproperties ("refobject"="true", "refproject"="<project_name>", "package"="<package_name>");
撤销Package内表资源的LABEL授权,语法格式如下。
revoke label on table <table_name>[(<column_list>)] from [user|role] <name> privilegeproperties ("refobject"="true", "refproject"="<project_name>", "package"="<package_name>");
语法中各参数的含义如下:
number:指定安全许可标签级别,即数据敏感等级。更多安全许可标签信息,请参见Label权限控制。
table_name:必填。指定表的名称。您可以执行
describe package project_name.package_name;
命令来查询Package中打包的表名称。column_list:可选。指定列名。多个列名需要用英文逗号(,)分隔。
days:可选。指定权限有效时长。以天为单位。不指定时,默认过期时间是180天。
"refobject"="true":必填。表示对Package进行细粒度授权。
"refproject"="<project_name>":必填。指定Package所属MaxCompute项目的名称。
"package"="<package_name>":必填。指定Package的名称。
使用示例
基于基于Package跨项目访问资源中的场景示例,上述两种授权方式的使用示例如下:
示例1:细粒度授权。由John将Package中sampletable表的读取表数据权限(Select)授权给Bob。
use prj2; --将sampletable表的读取表数据权限(Select)授权给Bob。 grant Select on table sampletable to user aliyun$bob@aliyun.com privilegeproperties ("refobject"="true", "refproject"="prj1", "package"="datamining"); --查看Package内sampletable表的ACL授权信息。 show grants on table sampletable privilegeproperties ("refobject"="true", "refproject"="prj1", "package"="datamining"); --撤销对Bob的ACL授权。 revoke Select on table sampletable from user aliyun$bob@aliyun.com privilegeproperties ("refobject"="true", "refproject"="prj1", "package"="datamining");
示例2:LABEL授权。假设sampletable表有3列(t1、t2、t3),且设置各列的LABEL级别为1、2、3。由John将Package中sampletable表的敏感等级为2的数据授权给Bob,有效时长为7天。
use prj2; --开启LabelSecurity安全机制。 set LabelSecurity=true; --设置各列LABEL级别。 set label 1 to table sampletable(t1); set label 2 to table sampletable(t2); set label 3 to table sampletable(t3); --将sampletable表的敏感等级为2的数据授权给Bob,有效时长为7天。上一示例中Bob已经具备读取表数据的权限,则通过LABEL授权后,Bob具备读取t2列数据的权限。 grant label 2 on table sampletable(t2) to user aliyun$bob@aliyun.com with exp 7 privilegeproperties ("refobject"="true", "refproject"="prj1", "package"="datamining"); --查看Package内sampletable表的LABEL授权信息。 show label grants on table sampletable privilegeproperties ("refobject"="true", "refproject"="prj1", "package"="datamining"); --撤销对Bob的LABEL授权。 revoke label 2 on table sampletable(t2) from user aliyun$bob@aliyun.com privilegeproperties ("refobject"="true", "refproject"="prj1", "package"="datamining");
说明如果对Package内表资源进行了LABEL授权,则资源提供方授予其他项目使用Package的权限时,需要增加Label和级别的声明,命令语法规则如下。
allowproject<project_name>toinstallpackage<package_name>usinglabel<number>;