本文为您介绍如何为用户授予MaxCompute中表、任务或资源等客体的某种操作权限(包括读、写和查看等)。

概述

项目添加用户后,项目所有者(Project Owner)或者项目管理员给用户进行授权后,用户才能执行操作。

MaxCompute提供了ACL(基于对象)、跨项目数据分享和项目数据保护等多种授权方式。授权一般涉及到三个要素,即主体(Subject,可以是用户也可以是角色)、客体(Object)和操作(Action)。我们推荐您优先使用ACL授权,而非Policy(基于策略)授权。

ACL授权中,MaxCompute的主体是用户或角色。客体是项目中的各种类型对象,包括项目函数资源任务实例。操作与对象类型有关,不同对象类型所支持的操作不相同。当对象已经存在时,才能进行授权操作。当对象被删除时,通过授权的权限数据会被自动删除。

MaxCompute项目支持的对象类型及操作

客体(Object) 操作(Action) 说明
Project Read 查看项目自身(不包括项目的任何对象)的信息,例如CreateTime。
Project Write 更新项目自身(不包括项目的任何对象)的信息,例如Comments。
Project List 查看项目所有类型的对象列表。
Project CreateTable 在项目中创建表(Table)。
Project CreateInstance 在项目中创建实例(Instance)。
Project CreateFunction 在项目中创建函数(Function)。
Project CreateResource 在项目中创建资源(Resource)。
Project All 具备上述Project的所有权限。
Table Describe 读取表的元信息。
Table Select 读取表的数据。
Table Alter 修改表的元信息或添加删除分区。
Table Update 覆盖或添加表的数据。
Table Drop 删除表。
Table ShowHistory 查看表的备份数据信息。
Table All 具备上述Table的所有权限。
Function Read 读取函数权限。
Function Write 更新函数权限。
Function Delete 删除函数权限。
Function Execute 执行函数权限。
Function All 具备上述Function的所有权限。
Resource Read 读取资源权限。
Resource Write 更新资源权限。
Resource Delete 删除资源权限。
Resource All 具备上述Resource的所有权限。
Instance Read 读取实例权限。
Instance Write 更新实例权限。
Instance All 具备上述Instance的所有权限。
说明
  • 在MaxCompute中视图(View)需要单独授权,授权方式与表相同。
  • Project的CreateTable操作,Table的SELECT、ALTER、UPDATE和DROP操作需要与Project的CreateInstance操作权限配合使用。

    如果您单独使用上述几种权限,且没有CreateInstance权限,则无法完成对应操作。例如,当您通过项目A SELECT项目B的表时,需要具备项目A的CreateInstance权限和项目B的表SELECT权限。

MaxCompute的授权方法

MaxCompute支持的授权方法与SQL92定义的GRANT或REVOKE语法类似,它通过简单的授权语句对已存在的项目对象授权或撤销授权。授权语法如下所示。
grant actions on object to subject
revoke actions on object from subject
actions ::= action_item1, action_item2, ...
object ::= project project_name | table schema_name |
           instance inst_name | function func_name |
           resource res_name
subject ::= user full_username | role role_name
语法说明如下:
  • ACL授权不支持[WITH GRANT OPTION]参数授权。当用户A授权用户B访问某个对象时,用户B无法将权限进一步授权给用户C。
  • 所有授权操作都必须由以下角色的用户来完成:
    • 项目所有者(Project Owner)。
    • 项目中拥有Admin角色的用户。
    • 项目中对象创建者。
  • 主账号仅能对自身的RAM子账号授权,不能给其他主账号的子账号授权。

示例

  • ACL授权
    假设alice@aliyun.com是新加入到项目test_project_a的成员,Allen是从属于bob@aliyun.com的RAM子账号。主账号可以执行如下命令进行授权,包括提交作业、创建数据表和查看项目已存在对象权限。
    --打开项目。
    use test_project_a; 
    --添加用户。
    add user aliyun$alice@aliyun.com;
    --添加RAM子账号。 
    add user ram$bob@aliyun.com:Allen; 
    --创建角色worker。
    create role worker; 
    --将角色worker指派给用户。
    grant worker TO aliyun$alice@aliyun.com; 
    grant worker TO ram$bob@aliyun.com:Allen;  
    --为角色worker授予项目test_project_a中创建实例、创建资源、创建函数、创建表以及查看项目所有对象类型的权限。
    grant CreateInstance, CreateResource, CreateFunction, CreateTable, List ON PROJECT test_project_a TO ROLE worker;
    --为角色worker授予实例的所有权限。
    grant all on instance instance_name to Role worker;
  • 跨项目访问对象
    用户aliyun$alice@aliyun.com和ram$bob@aliyun.com:Allen在test_project_a拥有上一个示例中的权限后,如果需要查询test_project_b中的表prj_b_test_table,且用到test_project_b中名为prj_b_test_udf的UDF。test_project_b的管理员执行如下命令进行授权。
    --打开项目test_project_b。
    use test_project_b; 
    --添加用户。
    add user aliyun$alice@aliyun.com; 
    add user ram$bob@aliyun.com:Allen; 
    --创建角色prj_a_worker。
    create role prj_a_worker; 
    --将角色指派给用户。
    grant prj_a_worker TO aliyun$alice@aliyun.com; 
    grant prj_a_worker TO ram$bob@aliyun.com:Alice;  
    --对角色授予权限。
    grant Describe , Select  ON TABLE prj_b_test_table TO ROLE prj_a_worker; 
    grant Read  ON Function prj_b_test_udf TO ROLE prj_a_worker; 
    grant Read  ON Resource prj_b_test_udf_resource TO ROLE prj_a_worker; 
    --授权后,这两个用户在test_project_a中查询表和使用UDF的方式如下。
    use test_project_a;
    select test_project_b:prj_b_test_udf(arg0, arg1) as res from test_project_b.prj_b_test_table;
    如果在test_project_a中创建UDF,只需进行Resource授权,执行命令如下。
    create function function_name as 'com.aliyun.odps.compiler.udf.PlaybackJsonShrinkUdf' using 'test_project_b/resources/odps-compiler-playback.jar' -f;