ACL权限控制

当您需要允许多个用户操作MaxCompute对象(项目、表等资源)时,MaxCompute支持通过ACL(Access Control Lists)方式授予用户或角色对指定对象执行指定操作的权限,可以先为角色授权,再将角色绑定至用户,简单高效地实现多个用户的权限控制。本文为您介绍MaxCompute支持的ACL授权命令,并提供授权示例供参考。

背景信息

ACL权限控制为白名单授权机制,即允许用户或角色对指定对象执行指定操作。ACL权限控制方式简单明了,可实现精准授权。

创建MaxCompute项目后,ACL权限控制功能开关默认为打开状态。项目所有者(Project Owner)可以在MaxCompute项目中执行set CheckPermissionUsingACL=true|false;命令,开启或关闭ACL权限控制功能。

ACL权限控制适用于如下场景。

场景

说明

授权人

授权操作入口

为用户授权

直接为单个用户授予对指定对象执行单个或多个操作的权限。

请参见权限一览表的支持的授权人列。

基于角色为用户授权

直接为单个角色授予对指定对象执行单个或多个操作的权限,然后再将角色绑定至多个用户,用户即可具备角色的权限。

更多创建角色及将角色绑定至用户的信息,请参见角色规划为用户绑定角色

说明

角色存在的意义是为了更好的管理用户,通常不会存在为多个角色授予相同对象的相同操作权限的情况。

前提条件

使用ACL权限控制方案前,请您确认已记录好如下信息:

  • 被授权人的账号或角色名称,且账号或角色已添加至MaxCompute项目。阿里云账号格式为ALIYUN$<account_name>,RAM用户账号格式为RAM$[<account_name>:]<RAM用户名称> ,RAM角色账号格式为`RAM$<account_name>:role/<RAM角色名称>`

    您可以通过MaxCompute客户端执行list users;list roles;命令获取账号或角色信息。

    如果需要新增用户或角色,请参见用户规划与管理角色规划

  • 授权对象类型、对象名称及操作。

    更多对象类型及操作信息,请参见MaxCompute权限

使用限制

ACL权限控制功能的使用限制如下:

  • ACL权限控制只支持对已存在的对象、被授权人进行授权,可以避免删除并重建同名对象所带来的安全风险。

  • ACL权限控制不支持通过[with grant option]子句授权。例如当用户A授权用户B可以访问某个对象时,用户B无法将权限进一步授权给用户C。

  • ACL授权为白名单(Allow)授权,不支持黑名单(Deny)授权。

注意事项

使用ACL权限控制功能的注意事项如下:

  • 如果删除了对象,MaxCompute会自动撤销与该对象关联的所有ACL授权信息。

  • 当一个用户被移除后,与该用户有关的授权仍然会被保留。一旦该用户以后被再次添加到该项目时,该用户的历史授权访问权限将被重新激活。如果需要彻底清除用户的权限信息,请参见彻底清除被删除用户遗留的权限信息

命令格式

ACL权限控制命令格式如下:

  • ACL授权

    grant <actions> on <object_type> <object_name> 
    [(<column_list>)] to <subject_type> <subject_name> 
    [privilegeproperties("conditions" = "<conditions>", "expires"="<days>")];
  • 撤销ACL授权

    revoke <actions> on <object_type> <object_name> 
    [(<column_list>)] from <subject_type> <subject_name>;
  • 列级别权限控制

    grant <actions> on table <table_name> (<column_list>) to <subject_type> <subject_name>;
    revoke <actions> on table <table_name> (<column_list>) from <subject_type> <subject_name>;

参数说明如下。

参数名称

是否必填

说明

actions

指定被授予的操作权限名称。单次授权可以指定单个或多个操作。

当有多个操作时,多个操作名称之间使用英文逗号(,)分隔。操作取值请参见MaxCompute权限

object_type

指定被授予的对象类型,即客体。单次授权只能指定一个客体。

客体取值请参见MaxCompute权限

object_name

指定被授予的对象的名称。获取方式如下:

  • 项目名称:您可以登录MaxCompute控制台,左上角切换地域后,即可在项目管理页签获取具体的MaxCompute项目名称。查询类型为Project时,只能查询当前Project的信息。

  • 表名称:您可以通过MaxCompute客户端执行show tables;命令获取表或视图名称。

  • 资源名称:您可以通过MaxCompute客户端执行list resources;命令获取资源名称。

  • 函数名称:您可以通过MaxCompute客户端执行list functions;命令获取函数名称。

  • 实例名称:您可以通过MaxCompute客户端执行show instances;命令获取实例ID。

授权对象支持以通配符星号(*)来表达。例如,table taobao*表示所有以taobao开头的表。

说明

授权给ROLE支持使用通配符星号(*);授权给USER不支持使用通配符。

column_list

仅当object_type为Table,且需要对表进行列级别权限控制时,需要配置该参数。单次授权可以指定单个或多个列名,列名之间使用英文逗号(,)分隔。

说明

该参数实现的是对指定表的指定列的Describe、Select、Alter、Update、Drop、ShowHistory、ALL权限进行控制。如果表的列设置了敏感等级,可通过Label权限控制功能,通过敏感等级标签对访问敏感数据的权限进行控制。

privilegeproperties

conditions

从请求消息来源及访问方式等维度进行权限控制。格式为"<var_name> <Operation> 常量" and "<var_name> <Operation> 常量" and ...,支持的var_nameOperation列表,请参见Conditions

days

指定权限过期时间,单位为天。未指定该参数时,权限默认长期有效。指定该参数时,权限到期后,MaxCompute会自动清除权限信息。

subject_type

指定被授权人的类型。取值范围如下:

  • USER:阿里云账号或RAM用户

  • ROLE:角色

subject_name

指定被授权的用户账号或角色名称。单次授权只能指定一个用户或角色。格式如下:

  • 阿里云账号:ALIYUN$<account_name>

  • RAM用户:RAM$[<account_name>:]<RAM用户名称>

  • RAM角色:`RAM$<account_name>:role/<RAM角色名称>`

您可以通过MaxCompute客户端执行list users;list roles;命令获取用户账号或角色名称。

Conditions

conditions支持的var_nameOperation列表如下。

var_name

类型

Operation

说明

acs:UserAgent

STRING

  • StringEquals:=

  • StringNotEquals:<>

  • StringLike:like

  • StringNotLike:not like

发送请求时的客户端UserAgent。

acs:Referer

STRING

发送请求时的HTTP referer。

acs:SourceIp

IP Address

  • IpAddress:in (...)

  • NotIpAddress:not in (...)

发送请求时的客户端IP地址。

acs:SecureTransport

BOOLEAN

  • True

  • False

发送请求是否使用了安全通道,如HTTPS。

acs:CurrentTime

DATEANDTIME

  • DateEquals:=

  • DateNotEquals:<>

  • DateLessThan:<

  • DateLessThanEquals:<=

  • DateGreaterThan:>

  • DateGreaterThanEquals:>=

Web Server接收到请求的时间,以ISO 8601格式表示,如2012-11-11T23:59:59Z。

ACL权限控制示例

假设Bob@aliyun.com是test_project_a的项目所有者,Allen、Alice、Tom是隶属于Bob@aliyun.com的RAM用户。以MaxCompute客户端操作为例,授权示例如下:

  • 示例一:为用户授权

    在项目test_project_a中创建表sale_detail,并为用户Allen授予表的读取元数据(Describe)和读取表数据(Select)权限。命令示例如下。

    --Bob进入项目test_project_a。
    use test_project_a; 
    --创建一张分区表sale_detail。
    create table if not exists sale_detail
    (
    shop_name     string,
    customer_id   string,
    total_price   double
    )
    partitioned by (sale_date string, region string);
    --将用户Allen添加为项目成员。
    add user RAM$Bob@aliyun.com:Allen;
    --为Allen授予权限。
    grant Describe, Select on table sale_detail to USER RAM$Bob@aliyun.com:Allen;
    --查看用户Allen的授权结果。
    show grants for RAM$Bob@aliyun.com:Allen; 
    --授权结果如下。
    Authorization Type: ACL
    [user/RAM$Bob@aliyun.com:Allen]
    A       projects/test_project_a/tables/sale_detail: Describe | Select
  • 示例二:为用户授权

    在示例一中创建的表sale_detail基础上,为用户Alice授予表sale_detail中shop_name和customer_id两列的所有操作权限。命令示例如下。

    --Bob进入项目test_project_a。
    use test_project_a; 
    --将用户Alice添加为项目成员。
    add user RAM$Bob@aliyun.com:Alice;
    --为Alice授予列级别控制权限。
    grant All on table sale_detail (shop_name, customer_id) to USER RAM$Bob@aliyun.com:Alice;
    --查看用户Alice的授权结果。
    show grants for RAM$Bob@aliyun.com:Alice; 
    --授权结果如下。
    Authorization Type: ACL
    [user/RAM$Bob@aliyun.com:Alice]
    A       projects/test_project_a/tables/sale_detail/customer_id: All
    A       projects/test_project_a/tables/sale_detail/shop_name: All
  • 示例三:为用户撤销授权

    基于示例一、二,撤销对用户Allen、Alice的授权。命令示例如下。

    --Bob进入项目test_project_a。
    use test_project_a; 
    --撤销Allen授权。
    revoke Describe, Select on table sale_detail (shop_name, customer_id) from USER RAM$Bob@aliyun.com:Allen;
    --撤销Alice授权。
    revoke All on table sale_detail (shop_name, customer_id) from USER RAM$Bob@aliyun.com:Alice;
    --查看用户Allen的撤销授权结果。权限列表无Describe, Select权限信息。
    show grants for RAM$Bob@aliyun.com:Allen; 
    --查看用户Alice的撤销授权结果。权限列表无All权限信息。
    show grants for RAM$Bob@aliyun.com:Alice; 

  • 示例四:基于角色为多个用户授予相同权限

    为Alice、Tom及另一阿里云账号Lily@aliyun.com授予在项目test_project_a中创建实例、创建资源、创建函数、创建表以及查看项目所有对象类型的权限。命令示例如下。

    --Bob进入项目test_project_a。
    use test_project_a; 
    --将用户Alice、Tom、Lily@aliyun.com添加为项目成员。
    add user RAM$Bob@aliyun.com:Alice;
    add user RAM$Bob@aliyun.com:Tom;
    add user ALIYUN$Lily@aliyun.com;
    --创建角色Worker。
    create role Worker; 
    --为用户绑定角色Worker。
    grant Worker TO RAM$Bob@aliyun.com:Alice; 
    grant Worker TO RAM$Bob@aliyun.com:Tom; 
    grant Worker TO ALIYUN$Lily@aliyun.com; 
    --为角色Worker授予在项目test_project_a中创建实例、创建资源、创建函数、创建表以及查看项目所有对象类型的权限。
    grant CreateInstance, CreateResource, CreateFunction, CreateTable, List on project test_project_a TO ROLE Worker;
    --查看用户Lily的授权结果。
    show grants for ALIYUN$Lily@aliyun.com; 
    --授权结果如下。表明用户Lily已经具备上述权限。
    [roles]
    worker
    
    Authorization Type: ACL
    [role/worker]
    A       projects/test_project_a: CreateTable | CreateResource | CreateInstance | CreateFunction | List
  • 示例五:为多个用户撤销基于角色授予的相同权限

    基于示例三,撤销对用户Alice、Tom、Lily@aliyun.com的授权。命令示例如下。

    --Bob进入项目test_project_a。
    use test_project_a; 
    --收回用户Alice、Tom、Lily@aliyun.com绑定的角色Worker。
    revoke Worker from RAM$Bob@aliyun.com:Alice;
    revoke Worker from RAM$Bob@aliyun.com:Tom;
    revoke Worker from ALIYUN$Lily@aliyun.com;
    --查看用户Lily的撤销授权结果。权限列表无Worker信息。
    show grants for ALIYUN$Lily@aliyun.com; 

后续指引

了解ACL授权机制后,您可以根据实际业务需要执行授权相关操作: