本文为您介绍如何为用户授予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_a中创建UDF,只需进行Resource授权,创建UDF命令如下。--打开项目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;
create function function_name as 'com.aliyun.odps.compiler.udf.PlaybackJsonShrinkUdf' using 'test_project_b/resources/odps-compiler-playback.jar' -f;
在文档使用中是否遇到以下问题
更多建议
匿名提交