安装Package后,如果您需要对Package进行更细微的权限控制,例如控制只能访问Package内的部分资源或控制只能访问Package内表的部分列,您可以通过MaxCompute提供的细粒度授权或LABEL授权实现。本文为您介绍如何通过这两种方式为用户或角色授权或撤销Package的相应权限。

背景信息

MaxCompute对Package提供如下两种权限控制策略:
  • 细粒度授权:对Package内的部分资源通过ACL方式(基于对象)授权或撤销授权。授权后,用户即可对指定对象执行指定操作。
  • LABEL授权:对Package内的表资源通过LABEL方式进行授权或撤销授权。用户仅能访问不超过指定LABEL等级的敏感数据信息,在细粒度授权基础上,实现更精细化的数据权限管理。更多LABEL信息,请参见LabelSecurity操作

使用限制

授权或撤销授权操作都必须由以下用户来完成:
  • 项目所有者(Project Owner)。
  • 项目中拥有Admin角色的用户。

细粒度授权

  • 对Package内部分资源进行ACL授权,语法格式如下。
    --对指定对象授权。
    grant <actions> on <objectType> <objectName> to [user|role] <Name> privilegeproperties ("refobject"="true", "refproject"="<objectProject>", "package"="<projectname>.<packagname>");
    --对表的列授权。
    grant <actions> on table <tablename>[(column_list)] to [user|role] <Name> privilegeproperties ("refobject"="true", "refproject"="<objectProject>", "package"="<projectname>.<packagname>");
  • 查看Package内资源的ACL授权信息,语法格式如下。
    show grants on <objectType> <objectName> privilegeproperties ("refobject"="true", "refproject"="<objectProject>", "package"="<packagname>");
  • 撤销Package内部分资源的ACL授权,语法格式如下。
    --撤销对象授权。
    revoke <actions> on <objectType> <objectName> from [user|role] <Name> privilegeproperties ("refobject"="true", "refproject"="<objectProject>", "package"="<projectname>.<packagname>");
    --撤销表的列授权。
    revoke <actions> on table <tablename>[(column_list)] from [user|role] <Name> privilegeproperties ("refobject"="true", "refproject"="<objectProject>",  "package"="<projectname>.<packagname>");
语法中各参数的含义如下:
  • actions:必填。指定授予的操作类型。更多Action信息,请参见MaxCompute项目支持的对象类型及操作
  • objectType:必填。指定客体的类型。更多Object信息,请参见MaxCompute项目支持的对象类型及操作
  • objectName:必填。指定客体的名称。
  • Name:必填。指定用户或角色的名称。获取用户或角色信息,请参见查看用户列表查看角色列表
  • tablename:必填。指定表的名称。获取表信息,请参见列出项目空间下的表和视图
  • column_list:可选。指定列名。多个列名需要用英文逗号(,)分隔。
  • "refobject"="true":必填。表示对Package进行细粒度授权。
  • "refproject"="<objectProject>":必填。指定Package所属MaxCompute项目的名称。
  • "package"="<projectname>.<packagname>":必填。指定Package的信息。projectname为Package资源所在的MaxCompute项目的名称,packagname为Package的名称。

LABEL授权

在细粒度授权基础上,对Package内的表实现按照LABEL授权,用户只能访问指定LABEL级别的表数据。

  • 对Package内表资源进行LABEL授权,语法格式如下。
    grant label <number> on table <tablename[(column_list)]> to [user|role] <Name>[with exp <days>] privilegeproperties ("refobject"="true", "refproject"="<objectProject>", "package"="<projectname>.<packagname>");
  • 查看Package的LABEL授权信息,语法格式如下。
    show label grants on table <tablename> privilegeproperties ("refobject"="true", "refproject"="<objectProject>", "package"="<projectname>.<packagname>");
  • 撤销Package内表资源的LABEL授权,语法格式如下。
    revoke label <number> on table <tablename[(column_list)]> from [user|role] <Name> privilegeproperties ("refobject"="true", "refproject"="<objectProject>", "package"="<projectname>.<packagname>");
语法中各参数的含义如下:
  • number:指定安全许可标签级别,即数据敏感等级。更多安全许可标签信息,请参见LabelSecurity操作
  • tablename:必填。指定表的名称。获取表信息,请参见列出项目空间下的表和视图
  • column_list:可选。指定列名。多个列名需要用英文逗号(,)分隔。
  • Name:必填。指定用户或角色的名称。获取用户或角色信息,请参见查看用户列表查看角色列表
  • days:可选。指定权限有效时长。以天为单位。不指定时,默认过期时间是180天。
  • "refobject"="true":必填。表示对Package进行细粒度授权。
  • "refproject"="<objectProject>":必填。指定Package所属MaxCompute项目的名称。
  • "package"="<projectname>.<packagname>":必填。指定Package的信息。projectname为Package资源所在的MaxCompute项目的名称,packagname为Package的名称。

使用示例

基于 Package的使用方法中的场景示例,上述两种授权方式的使用示例如下:
  • 示例1:细粒度授权。由John将Package中sampletable表的读取表数据权限(Select)授权给Bob。
    use prj2;
    --将sampletable表的读取表数据权限(Select)授权给Bob。
    grant Describe on table sampletable to user aliyun$bob@aliyun.com privilegeproperties ("refobject"="true", "refproject"="prj1", "package"="prj1.datamining");
    
    --查看Package内sampletable表的ACL授权信息。
    show grants on table sampletable privilegeproperties ("refobject"="true", "refproject"="prj1", "package"="datamining");
    
    --撤销对Bob的ACL授权。
    revoke Describe on table sampletable from user aliyun$bob@aliyun.com privilegeproperties ("refobject"="true", "refproject"="prj1", "package"="prj1.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"="prj1.datamining");
    
    --查看Package内sampletable表的LABEL授权信息。
    show label grants on table sampletable privilegeproperties ("refobject"="true", "refproject"="prj1", "package"="prj1.datamining");
    
    --撤销对Bob的LABEL授权。
    revoke label 2 on table sampletable(t2) from user aliyun$bob@aliyun.com privilegeproperties ("refobject"="true", "refproject"="prj1", "package"="prj1.datamining");