非项目空间所有者(Project Owner)的用户必须被加入MaxCompute项目空间中,且被授予相应的权限,才能操作MaxCompute中的数据、作业、资源及函数。本文将为您介绍项目空间所有者如何添加、删除以及授权其他用户(云账号以及RAM用户)。

如果您是项目空间所有者,建议您仔细阅读本文。如果您是普通用户,建议您向项目空间所有者提出申请,加入对应的项目空间后再阅读后续章节。

本文的操作均在MaxCompute客户端(odpscmd)运行。

添加云账号用户

当项目空间的所有者Alice决定对另一个用户授权时,Alice需要先将该用户添加到自己的项目空间中,只有添加到项目空间中的用户才能够被授权。

添加用户的命令如下:
add user username;
username既可以是云账号,也可以是执行此命令的云账号的某个RAM用户,示例如下:
add user ALIYUN$odps_test_user@aliyun.com;
add user RAM$ram_test_user;
假设Alice的云账号为alice@aliyun.com,那么当Alice执行上述两条语句后,验证用户是否添加成功。
list users;
--返回结果如下,说明云账号odps_test_user@aliyun.com以及Alice名下的RAM用户ram_test_user已经被加入到了该项目空间中。
RAM$alice@aliyun.com:ram_test_user
ALIYUN$odps_test_user@aliyun.com

添加RAM用户

添加RAM用户有以下两种方式:
  • 通过DataWorks进行操作,详情请参见准备RAM用户
  • 通过MaxCompute客户端添加RAM用户,命令如下:
    add accountprovider ram;
    OK
    添加成功之后,项目空间所有者可以执行如下命令查看该项目所支持的账号系统,确认RAM账号是否添加成功:
    list accountproviders;
    说明
    • MaxCompute只允许主账号将自身的RAM用户加入到项目空间中,不允许加入其它云账号的RAM用户,因此在add user时,无需在RAM用户前指定主账号名称,MaxCompute默认命令的执行者即是RAM用户对应的主账号。
    • MaxCompute只能够识别RAM的账号体系,不能识别RAM的权限体系。即用户可以将自身的任意RAM用户加入MaxCompute的某一个项目中,但MaxCompute在对该RAM用户做权限验证时,并不会考虑RAM中的权限定义。

添加RAM角色

在MaxCompute中使用RAM角色的步骤如下:
  1. 创建RAM角色,操作详情请参见创建可信实体为阿里云账号的RAM角色创建可信实体为身份提供商的RAM角色创建可信实体为阿里云服务的RAM角色

    假设新建RAM角色名称为vuser1。

  2. 定义RAM角色的权限策略,操作详情请参见修改RAM角色的信任策略
    需要注意的是,由于后续涉及到需要在DataWorks上操作,您需要把RAM角色同时授权给DataWorks服务,以便在DataWorks上能够提交周期性调度作业至MaxCompute。信任策略示例如下:
    {
        "Statement": [
            {
                "Action": "sts:AssumeRole",
                "Effect": "Allow",
                "Principal": {
                    "Service": [
                        "dataworks.aliyuncs.com"
                    ]
                }
            }
        ],
        "Version": "1"
    }
  3. 将RAM角色添加至MaxCompute项目空间。您可以自行选择如下两种方式之一进行操作:
    • 方式一:使用MaxCompute客户端(odpscmd)或登录MaxCompute控制台(查询编辑器),在MaxCompute项目空间下执行如下命令:
      add user `RAM$<云账号>:role/RAM角色名称`;
      例如,将RAM角色vuser1授权给RAM用户abc@example.com,完整格式为RAM$abc@example.com:role/vuser1

      添加完成后,您可以通过list users;命令查看RAM角色是否已添加至MaxCompute项目空间。

    • 方式二:登录MaxCompute控制台,在项目管理页签,单击MaxCompute项目空间右侧的成员管理进入成员管理页面,添加RAM角色为成员。在成员管理页面添加成员的操作详情请参见添加工作空间成员和角色

云账号用户授权

添加用户后,项目空间所有者或项目空间管理员需要给该用户进行授权,只有用户获得相应的权限后,才能在项目空间内执行操作。

MaxCompute提供了授权、跨项目空间数据分享及项目空间数据保护等多种策略。下面列举两个常见场景,更多详情请参见授权
  • 场景一:假设Jack是项目空间prj1的管理员,一个新加入的项目组成员Alice(已拥有云账号:alice@aliyun.com)申请加入项目空间prj1,并申请查看Table列表、提交作业和创建表的权限。
    项目空间中拥有Admin角色的用户或者该项目空间的所有者在客户端执行如下命令:
    --进入项目空间prj1。
    use prj1; 
    --添加用户。 
    add user aliyun$alice@aliyun.com; 
    --使用grant语句对用户授权。
    grant List, CreateTable, CreateInstance on project prj1 to user aliyun$alice@aliyun.com; 
  • 场景二:假设用户云账号为bob@aliyun.com,已经被添加到某个项目空间($user_project_name),需要给它授予建表、获取表信息和执行的权限。
    项目空间中拥有Admin角色的用户或者该项目空间的所有者在客户端执行如下命令:
    --向bob@aliyun.com授予名为“$user_project_name”项目空间的CreateTable(创建表)权限。
    grant CreateTable on PROJECT $user_project_name to USER ALIYUN$bob@aliyun.com;
    --向bob@aliyun.com授予名为“$user_table_name”的Table的Describe(获取表信息)权限。  
    grant Describe on Table $user_table_name to USER ALIYUN$bob@aliyun.com;
    --向bob@aliyun.com授予名为"$user_function_name"的Function的Execute(执行)权限。 
    grant Execute on Function $user_function_name to USER ALIYUN$bob@aliyun.com;  

RAM用户授权

为云账号bob@aliyun.com的RAM用户Alice授权,使其可以对表src执行desc操作。
  1. 查看项目空间的账号体系支持情况。
    list accountproviders;
    --返回结果。
    ALIYUN, RAM

    由上可见,这个项目空间已经能够支持RAM账号体系,即可以向这个项目空间添加RAM用户。如果不支持RAM用户,请执行add accountprovider ram;命令添加RAM账号体系。

  2. 向项目空间中添加RAM用户并向其授予表src的Describe权限。
    add user ram$bob@aliyun.com:Alice;
    --返回结果。
    OK: DisplayName=RAM$bob@aliyun.com:Alice
    --给RAM用户授权。
    grant Describe on table src to user ram$bob@aliyun.com:Alice;
    --返回结果。
    OK
说明
  • 获取RAM用户AccessKey ID及AccessKey Secret的相关操作请参见RAM介绍
  • 更多有关授权的操作请参见授权

删除云账号用户

当一个用户离开此项目团队时,需要将该用户从项目空间中移除。用户一旦从项目空间中被移除,该用户将不再拥有访问该项目空间任何资源的权限。

项目空间所有者执行如下命令移除用户:
remove user;
说明
  • 移除一个用户之前,如果该用户已被赋予某些角色,则需要先撤销该用户的所有角色之后再执行移除操作。关于角色的介绍请参见角色管理
  • 当一个用户被移除后,与该用户有关的授权仍然会被保留。一旦该用户以后被再次添加到该项目空间时,该用户的历史授权访问权限将被重新激活。
  • MaxCompute不支持在项目空间中彻底移除一个用户及其所有权限数据。
示例如下。
--移除用户。
remove user ALIYUN$odps_test_user@aliyun.com;
remove user RAM$ram_test_user;
--执行如下命令查看用户是否移除成功。返回结果中没有这两个账号,表明这两个账号已经被移出项目空间。 
list users;

删除RAM用户

  • 通过remove user命令删除云账号自身的RAM用户。
    --回收RAM用户Alice权限。
    odps@ ****>revoke describe on table src from user ram$bob@aliyun.com:Alice;
    OK
    --删除RAM用户。
    odps@ ****>remove user ram$bob@aliyun.com:Alice;
    Confirm to "remove user ram$bob@aliyun.com:Alice;" (yes/no)? yes
    OK
    对于已经被赋予角色的RAM用户,在删除RAM用户前,请先解除赋予的角色后再删除RAM用户。否则,项目中会残留RAM用户信息,查询用户时会显示为p4_xxxxxxxxxxxxxxxxxxxx且无法从项目中删除,但不影响项目正常使用。示例如下。
    --RAM用户残留在项目中时,查询用户显示如下。
    odps@MaxCompute>list users;
    p4_2652900xxxxxxxxxx
    --残留RAM用户无法删除时,显示如下。
    odps@MaxCompute>remove user p4_2652900xxxxxxxxxx;
    Confirm to "remove user p4_2652900xxxxxxxxxx
    ;" (yes/no)? yes
    FAILED: lack of account provider
    --此时在DataWorks的项目成员管理页面依然能看到RAM用户。
    --正确做法为:在删除RAM用户前先解除RAM用户被赋予的角色。
    odps@MaxCompute>revoke role_project_security, role_project_admin, role_project_dev, role_project_pe, role_project_deploy, role_project_guest from RAM$MainCount:hanmeimei;
    OK
    --执行如下命令即可正常删除RAM用户。
    odps@ MaxCompute>remove user RAM$MainCount:hanmeimei;            
  • 通过remove accountprovider命令将RAM账号系统从当前项目中删除,此命令需要项目空间所有者执行。
    --删除RAM账号系统。
    odps@ ****>remove accountprovider ram;
    Confirm to "remove accountprovider ram;" (yes/no)? yes
    OK
    --验证删除是否成功。
    odps@ ****>list accountproviders;
    ALIYUN

彻底清除被删除用户遗留的权限信息

用户被移出项目后,ACL、LabelSecurity、Policy等权限数据还留存在项目中。当移出的用户又再次进入该项目时,将会拥有原来的ACL、LabelSecurity、Policy等权限,即用户如果被误删,被重新加回项目时可以直接使用原先保留的权限。但是,如果用户以不同的身份被加回原项目时,会有潜在的数据安全风险。

基于如上背景,MaxCompute提供清空用户权限的功能,如果检测到用户已经不在项目中,但有ACL、LabelSecurity、Policy等权限的,系统会回收权限。

仅项目空间所有者或拥有Admin、Super_Administrator角色的账号可以清除用户遗留的权限信息。将用户从项目中移除之后,可以通过如下命令清除用户遗留的权限信息:

purge privs from user <username>;
说明 如果未将用户移出项目,执行该命令会返回"Principal <username> still exist in the project"报错。