GRANT

MaxCompute支持通过ACL(Access Control Lists)方式和Policy权限控制方案授予用户或角色对指定对象执行指定操作的权限。本文为您介绍MaxCompute支持的ACL、Policy授权命令,并提供授权示例供参考。

ACL权限控制

  • 前提条件。

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

    • 被授权人的账号或角色名称,且账号或角色已添加至MaxCompute项目。阿里云账号格式为ALIYUN$阿里云账号,RAM用户账号格式为RAM$归属阿里云账号: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>")];
    • 列级别权限控制。

      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项目名称。

      • 表名称:您可以通过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

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

      您可以通过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。

  • 使用示例。

    假设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
    • 示例三:基于角色为多个用户授予相同权限

      为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

Policy权限控制

  • 前提条件

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

    • 被授权角色的名称,且角色已添加至MaxCompute项目。

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

      如果需要新增角色,请参见角色规划

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

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

  • 使用限制

    Policy权限控制只支持对已存在的角色进行授权。

  • 注意事项

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

    • 当白名单和黑名单授权信息同时存在时,遵循黑名单优先原则。

    • Policy权限控制允许对不存在的对象授权,当删除对象时,与该对象关联的Policy授权信息不会被删除,授权人需要注意删除并重建同名对象所带来的安全风险。

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

  • 命令格式

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

    grant <actions> on <object_type> <object_name> 
    to ROLE <role_name> 
    privilegeproperties("policy" = "true", "allow"="{true|false}"[, "conditions"= "<conditions>" ,"expires"="<days>"]);
  • 参数说明

    参数名称

    是否必填

    说明

    actions

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

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

    object_type

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

    客体取值请参见MaxCompute权限

    object_name

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

    • 项目名称:您可以登录MaxCompute控制台,左上角切换地域后,即可在项目管理页签获取具体的MaxCompute项目名称。

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

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

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

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

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

    说明

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

    role_name

    指定被授权的角色名称。单次授权只能指定一个角色。

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

    privilegeproperties

    policy

    固定取值为true。表示使用Policy权限控制方案。

    allow

    白名单授权必填

    指定白名单授权机制。取值范围如下:

    • true:表示允许对指定对象执行指定操作。

    • false:表示不允许对指定对象执行指定操作,即黑名单。

    conditions

    从请求消息来源及访问方式等维度进行权限控制。详细参数取值请参见Conditions

    days

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

  • 示例

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

    • 示例一:基于角色为用户授权(黑名单)

      禁止Tom删除以tb_开头的表。命令示例如下。

      --Bob进入项目test_project_a。
      use test_project_a; 
      --创建角色Worker。
      create role Worker; 
      --将用户Tom添加为项目成员。
      add user RAM$Bob@aliyun.com:Tom;
      --将角色Worker绑定至用户Tom。
      grant Worker TO RAM$Bob@aliyun.com:Tom; 
      --禁止角色Worker删除项目test_project_a中以tb_开头的表。
      grant Drop on table tb_* to ROLE Worker privilegeproperties("policy" = "true", "allow"="false");
      --查看用户Tom的授权结果。
      show grants for RAM$Bob@aliyun.com:Tom; 
      --授权结果如下。D表示禁止,禁止删除以tb_开头的表。
      Authorization Type: Policy
      [role/worker]
      D      projects/test_project_a/tables/tb_*: Drop
    • 示例二:撤销Policy授权(黑名单)

      基于示例一,撤销对用户Tom的授权。

      --Bob进入项目test_project_a。
      use test_project_a; 
      --收回用户Tom绑定的角色Worker。
      revoke Worker from RAM$Bob@aliyun.com:Tom;
      --查看用户Tom的授权结果。权限列表无Drop权限信息。
      show grants for RAM$Bob@aliyun.com:Tom; 
    • 示例三:基于角色为用户授权(白名单)

      允许Tom修改以tb_开头的表的数据。命令示例如下。

      --Bob进入项目test_project_a。
      use test_project_a; 
      --创建角色Worker。
      create role Worker; 
      --将用户Tom添加为项目成员。
      add user RAM$Bob@aliyun.com:Tom;
      --将角色Worker绑定至用户Tom。
      grant Worker TO RAM$Bob@aliyun.com:Tom; 
      --允许角色Worker修改项目test_project_a中以tb_开头的表的数据。
      grant Update on table tb_* to ROLE Worker privilegeproperties("policy" = "true", "allow"="true");
      --查看用户Tom的授权结果。
      show grants for RAM$Bob@aliyun.com:Tom; 
      --授权结果如下。A表示允许,可以更新以tb_开头的表的数据。
      Authorization Type: Policy
      [role/worker]
      A       projects/test_project_a/tables/tb_*: Update
    • 示例四:撤销Policy授权(白名单)

      基于示例三,撤销对用户Tom的授权。

      --Bob进入项目test_project_a。
      use test_project_a; 
      --收回用户Tom绑定的角色Worker。
      revoke Worker from RAM$Bob@aliyun.com:Tom;
      --查看用户Tom的授权结果。权限列表无Update权限信息。
      show grants for RAM$Bob@aliyun.com:Tom; 
    • 示例五:为具备内置角色的用户进行精细化授权

      禁止Allen删除项目test_project_a中的所有表。命令示例如下。

      --Bob进入项目test_project_a。
      use test_project_a; 
      --创建角色Worker。
      create role Worker; 
      --将角色Worker绑定至用户Allen。
      grant Worker TO RAM$Bob@aliyun.com:Allen; 
      --禁止角色Worker删除项目test_project_a中的所有表。
      grant Drop on table * to ROLE Worker privilegeproperties("policy" = "true", "allow"="false");
      --查看用户Allen的授权结果。
      show grants for RAM$Bob@aliyun.com:Allen; 
      --授权结果如下。禁止删除所有表。
      [roles]
      role_project_admin, worker
      
      Authorization Type: Policy
      [role/role_project_admin]
      A       projects/test_project_a: *
      A       projects/test_project_a/instances/*: *
      A       projects/test_project_a/jobs/*: *
      A       projects/test_project_a/offlinemodels/*: *
      A       projects/test_project_a/packages/*: *
      A       projects/test_project_a/registration/functions/*: *
      A       projects/test_project_a/resources/*: *
      A       projects/test_project_a/tables/*: *
      A       projects/test_project_a/volumes/*: *
      
      [role/worker]
      A       projects/test_project_a/tables/tb_*: Update
      D       projects/test_project_a/tables/*: Drop
      
      Authorization Type: ObjectCreator
      AG      projects/test_project_a/tables/local_test: All
      AG      projects/test_project_a/tables/mr_multiinout_out1: All
      AG      projects/test_project_a/tables/mr_multiinout_out2: All
      AG      projects/test_project_a/tables/ramtest: All
      AG      projects/test_project_a/tables/wc_in: All
      AG      projects/test_project_a/tables/wc_in1: All
      AG      projects/test_project_a/tables/wc_in2: All
      AG      projects/test_project_a/tables/wc_out: All
    • 示例六:为具备内置角色的用户撤销授权

      基于示例五,撤销对用户Allen的授权。命令示例如下。

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

为用户授予角色

为用户授予某个角色,用户即可具备角色被赋予的权限。

  • 使用限制。

    在对用户授予角色前,您需要先为角色授予项目空间对象的相关操作权限。详情请参见为角色或用户授权

  • 命令格式。

    grant <role_name> to <user_name>;
  • 参数说明。

    • role_name:必填。待授予的角色名称。

    • user_name:必填。待授予角色的阿里云用户或RAM用户账号信息。阿里云账号格式为ALIYUN$****@aliyun.com;,RAM用户账号格式为RAM$****

  • 使用示例。

    --对阿里云用户test_user@aliyun.com赋予角色player。
    grant player to ALIYUN$test_user@aliyun.com;

为用户或角色授予访问Package的权限

在安装Package的MaxCompute项目中为用户或角色授予访问Package的权限。

被安装的Package是一种独立的MaxCompute对象类型。如果要访问Package里的资源,您必须拥有该Package的Read权限。如果请求者没有Read权限,可以由项目所有者、具备Super_Administrator或Admin角色的用户通过ACL权限控制方案完成授权。

  • 命令格式

    grant <actions> on package <project_name>.<package_name> to {USER|ROLE} <name>;
  • 注意事项

    授权后,用户或角色仅在安装Package的项目中有权限访问Package中的资源。如果需要精细化管控Package的权限,请参见Package的权限控制

  • 参数说明

    参数名称

    是否必填

    说明

    actions

    指定对资源的操作权限。固定取值为Read。

    project_name

    指定Package所属MaxCompute项目名称。

    您可以登录MaxCompute控制台,左上角切换地域后,即可在项目管理页签获取具体的MaxCompute项目名称。

    package_name

    指定Package的名称。您可以通过

    您可以通过MaxCompute客户端执行show packages;命令获取已创建的Package信息。

    name

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

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

  • 使用示例

    假设Bella为隶属于Amy@aliyun.com的RAM用户,现需要为Bella授予Package的访问权限。命令示例如下。

    --允许Bella访问Package。
    grant Read on package test_project_a.datashare to user RAM$Amy@aliyun.com:Bella;

相关命令

  • CREATE PACKAGE:创建Package。

  • CREATE ROLE:在MaxCompute项目空间中创建角色。

  • REVOKE:撤销对用户或角色授予的访问Package的权限。