Label权限控制

MaxCompute支持在项目级别为用户设置访问许可等级标签,为表或表的列设置敏感等级标签(Label),用户仅可以访问MaxCompute项目中敏感等级小于等于自身访问许可等级的表或列数据。本文为您介绍Label授权操作并提供示例供参考。

背景信息

Label权限控制即LabelSecurity,是项目级别的一种强制访问控制策略。创建MaxCompute项目后,LabelSecurity默认为关闭状态。项目所有者(Project Owner)可以在MaxCompute项目的Project级别,执行Set LabelSecurity=true|false;命令,开启或关闭LabelSecurity。

如果开启了LabelSecurity,项目所有者(Project Owner)需要定义明确的表或表的列敏感等级、用户访问许可等级划分标准,并分别为表或表的列、用户或角色设置敏感等级标签、访问许可等级标签。当用户访问设置了敏感等级的数据时,除必须拥有目标表的SELECT权限外,仅能访问敏感等级小于等于自身访问许可等级的表或列数据。

LabelSecurity对敏感数据的支持能力如下:

  • 最小支持粒度为列级别,即对表的列设置敏感等级。

  • 支持对表的任何列设置敏感等级标签。一张表可以由不同敏感等级的列构成。

  • 支持对视图设置敏感等级标签。视图的敏感等级标签和视图对应的源表的敏感等级标签是独立的。

LabelSecurity支持的操作如下。

操作

说明

操作人

授权操作入口

为表或列数据设置敏感等级标签

为表或表的列设置敏感等级标签。

  • 项目所有者(Project Owner)

  • 具备Admin角色的用户

为用户或角色设置访问许可等级标签

为用户或角色设置可以访问的敏感等级数据标签。

Label显式授权

为低访问许可等级用户或角色授予访问高敏感等级数据的权限。

撤销Label显式授权

撤销为用户或角色授予的访问高敏感等级数据的权限。

清理过期权限

删除过期权限信息。

LabelSecurity默认权限控制策略

在对表或列数据、用户或角色设置标签之后,基于标签的默认权限控制策略如下:

  • No-ReadUp:不允许用户访问敏感等级大于用户访问许可等级的数据。如果实际业务涉及此场景,需要执行显式授权操作。更多显式授权操作信息,请参见Label显式授权

  • Trusted-User:允许用户写不高于用户访问许可等级的数据。新创建的表或视图默认为0级(不保密)。新添加用户默认为0级。

前提条件

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

  • 被授权人的账号或角色名称,且账号或角色已添加至MaxCompute项目。阿里云账号格式为ALIYUN$阿里云账号,RAM用户账号格式为RAM$归属阿里云账号:RAM用户名

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

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

  • 授权对象表或列的名称。

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

使用限制

不支持对分区列设置敏感数据等级标签。

注意事项

使用LabelSecurity的注意事项如下:

  • 在一些传统的强制访问控制系统中,为了防止数据在项目内部被任意分发,通常还支持更多复杂的安全策略。例如,不允许用户写敏感等级不高于用户访问许可等级的数据(No-WriteDown)。但在MaxCompute中,考虑到数据敏感等级的管理成本,默认安全策略并不支持No-WriteDown。如果项目有类似需求,您可以通过Set ObjectCreatorHasGrantPermission=false;命令,修改项目安全配置,以达到控制目的。

  • 为避免数据在不同项目之间流动,您可以通过set ProjectProtection=true;命令,将项目设置为受保护状态(ProjectProtection)。设置之后,只允许用户在项目内访问数据,有效防止数据流出到项目之外。更多项目数据保护信息,参见数据保护机制

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

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

为表或列数据设置敏感等级标签

由Project Owner或具备Admin角色的用户为表或表的列设置敏感等级标签。

  • 命令格式

    set Label <number> to table <table_name>[(<column_list>)];
  • 注意事项

    • 如果只是对表设置了敏感等级标签,未对列设置敏感等级标签,则表的所有列的敏感等级都相同且等于对表设置的标签。例如对表设置的敏感等级为2,未设置列的敏感等级,则表的所有列的敏感等级都为2。

    • 对列设置的标签会覆盖对表设置的标签(与等级高低无关),对表设置的标签不会覆盖对列设置的标签。例如最初为表设置的敏感等级为2,然后对表的某一列col1设置敏感等级为3,此时表的敏感等级为2,表中col1的敏感等级为3,其他列的敏感等级为2。

    • 如果您需要修改对表或列已设置的敏感等级标签,重新执行该命令设置新的等级标签即可。

  • 参数说明

    参数名称

    是否必填

    说明

    number

    指定敏感等级。取值范围为0~9。数值越大,安全级别越高。

    table_name

    指定目标表或视图的名称。

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

    column_list

    指定列名。可以指定多个列名,列名之间用英文逗号(,)分隔。

为用户或角色设置访问许可等级标签

由Project Owner或具备Admin角色的用户为其他用户或角色设置访问许可等级标签。

  • 命令格式

    set Label <number> to {USER|ROLE} <name>;
  • 注意事项

    • 为用户设置访问许可等级标签后,用户只能访问敏感级别小于等于访问许可等级标签的数据。例如指定用户的敏感等级为3,则用户只能访问敏感等级为0~3的表数据或列数据。

    • 如果您需要修改对用户或角色已设置的敏感等级标签,重新执行该命令设置新的访问许可等级标签即可。

  • 参数说明

    参数名称

    是否必填

    说明

    number

    指定用户或角色可访问的最高数据敏感等级。取值范围为0~9,与数据敏感等级标签相对应。

    name

    指定用户或角色的名称。

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

Label显式授权

由Project Owner或具备Admin角色的用户为低级别用户授予访问高敏感等级数据的权限。

  • 命令格式

    grant Label <number> on table <table_name> [(<column_list>)] to {USER|ROLE} <name> [with exp <days>];
  • 注意事项

    显式授予用户的表的列Label权限,会覆盖显式授予用户的表的Label权限。

  • 参数说明

    参数名称

    是否必填

    说明

    number

    指定用户或角色可访问的最高数据敏感等级。

    取值范围为0~9,与数据敏感等级标签相对应。

    table_name

    指定目标表或视图的名称。

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

    column_list

    当需要授予目标表或视图中指定列的访问权限时,需要配置该参数。单次授权可以指定多个列名,列名之间用英文逗号(,)分隔。

    name

    指定用户或角色的名称。

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

    days

    指定权限过期时间,单位为天。取值范围为:0~263-1。不指定该参数时,默认过期时间为180天。

撤销Label显式授权

由Project Owner或具备Admin角色的用户撤销Label显式授权。

  • 命令格式

    revoke Label on table <table_name> [(<column_list>)] from {USER|ROLE} <name>;
  • 注意事项

    • 撤销显式授予用户的表的Label权限,会同时撤销显式授予用户的表列的Label权限。

    • 撤销显式Label授权信息,不会影响为用户设置的访问许可等级标签。例如用户的访问许可等级为2,为用户显式授予访问某张表敏感等级不超过3的数据,撤销授权后,用户仍然可以访问表中敏感等级小于等于2的数据。

  • 参数说明

    参数名称

    是否必填

    说明

    table_name

    指定目标表或视图的名称。

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

    column_list

    当需要撤销目标表或视图中指定列的敏感数据访问权限时,需要配置该参数。可以指定多个列名,列名之间用英文逗号(,)分隔。

    name

    指定用户或角色的名称。

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

清理过期权限

当Label显式授权信息过期后,需要由Project Owner或具备Admin角色的用户执行如下命令清理过期权限信息。

clear expired grants;

Label权限控制示例

假设项目test_project_a中存在一张表sale_detail,shop_name、customer_id和total_price为表的列。Bob@aliyun.com是test_project_a的项目所有者。Allen为隶属于Bob的RAM用户,已被添加至项目test_project_a中。

  • 示例一:为表sale_detail或表的列设置敏感等级标签,命令示例如下。

    --Bob进入项目test_project_a。
    use test_project_a;
    --设置表sale_detail的Label为1级。此时表中所有列的敏感等级为1级。
    set Label 1 to table sale_detail; 
    --设置sale_detail的shop_name和customer_id两列的Label为2级。此时其他列的Label仍为1。
    set Label 2 to table sale_detail(shop_name, customer_id); 
    --修改表sale_detail的Label为3级。需要注意的是:此时shop_name和customer_id两列的Label仍为2级,其他列的Label修改为3。
    set Label 3 to table sale_detail; 
    --修改表sale_detail的shop_name和customer_id两列的Label为4级。此时其他列的Label仍为3。
    set Label 4 to table sale_detail(shop_name, customer_id); 
    --查看表的Label信息。
    describe sale_detail;
    --返回结果如下。
    +------------------------------------------------------------------------------------+
    | Owner: ALIYUN$****@test.aliyun.com | Project: ****                                 |
    | TableComment:                                                                      |
    +------------------------------------------------------------------------------------+
    | CreateTime:               2021-12-13 11:27:04                                      |
    | LastDDLTime:              2021-12-13 11:27:04                                      |
    | LastModifiedTime:         2021-12-13 11:27:26                                      |
    +------------------------------------------------------------------------------------+
    | TableLabel:               3                                                        |  --表的敏感等级为3。
    | MaxLabel:                 L4                                                       |
    +------------------------------------------------------------------------------------+
    | InternalTable: YES      | Size: 784                                                |
    +------------------------------------------------------------------------------------+
    | Native Columns:                                                                    |
    +------------------------------------------------------------------------------------+
    | Field           | Type       | Label | Comment                                     |
    +------------------------------------------------------------------------------------+
    | shop_name       | string     | 4     |                                             |  --列的敏感等级为4。
    | customer_id     | string     | 4     |                                             |  --列的敏感等级为4。
    | total_price     | double     | 3     |                                             |  --列的敏感等级为3。
    +------------------------------------------------------------------------------------+
    | Partition Columns:                                                                 |
    +------------------------------------------------------------------------------------+
    | sale_date       | string     |                                                     |
    | region          | string     |                                                     |
    +------------------------------------------------------------------------------------+
  • 示例二:为项目test_project_a中的用户Kate@aliyun.com及RAM用户RAM$Bob@aliyun.com:Allen,设置访问许可等级标签,命令示例如下。

    --Bob进入项目test_project_a。
    use test_project_a;
    --设置Kate的访问许可等级标签为3级,则Kate能访问敏感等级为0~3级的数据。 
    set Label 3 to USER ALIYUN$Kate@aliyun.com; 
    --设置RAM用户Allen的访问许可等级标签为1级,则Allen能访问敏感等级为0~1级的数据。
    set Label 1 to USER RAM$Bob@aliyun.com:Allen; 
    --查看Allen的访问许可等级信息。
    show label grants for RAM$Bob@aliyun.com:Allen;
    --返回结果如下。
    User Label: 1
    
    (granted label list is empty)
  • 示例三:为Allen显式授予访问高敏感级数据的权限,命令示例如下。

    --Bob进入项目test_project_a。
    use test_project_a;
    --显式授权Allen访问sale_detail表中敏感度不超过3级的数据,授权有效期为4天。
    grant Label 3 on table sale_detail to USER RAM$Bob@aliyun.com:Allen with exp 4; 
    --查看Allen的显式授权结果。
    show label grants on table sale_detail for USER RAM$Bob@aliyun.com:Allen;
    --返回结果如下。
    User Label: 1
    +-------------+--------------+--------------------------+
    | Column      | GrantedLabel | Expires                  |
    +-------------+--------------+--------------------------+
    | total_price | 3            | 2021-12-31T19:56:18+0800 |
    +-------------+--------------+--------------------------+
    --显式授权Allen访问sale_detail表的shop_name、customer_id和total_price列中敏感度不超过3级的数据,授权有效期为10天。
    grant Label 4 on table sale_detail(shop_name, customer_id, total_price) to USER RAM$Bob@aliyun.com:Allen with exp 10;
    --查看Allen的显式授权结果。
    show label grants on table sale_detail for USER RAM$Bob@aliyun.com:Allen;
    --返回结果如下。
    User Label: 1
    +-------------+--------------+--------------------------+
    | Column      | GrantedLabel | Expires                  |
    +-------------+--------------+--------------------------+
    | customer_id | 4            | 2022-01-06T19:58:00+0800 |
    +-------------+--------------+--------------------------+
    | shop_name   | 4            | 2022-01-06T19:58:00+0800 |
    +-------------+--------------+--------------------------+
    | total_price | 4            | 2022-01-06T19:58:00+0800 |
    +-------------+--------------+--------------------------+
  • 示例四:撤销为Allen授予的访问高敏感级数据权限,命令示例如下。

    --撤销Allen访问sale_detail表的shop_name、customer_id和total_price列中敏感度不超过3级的数据权限。
    revoke Label on table sale_detail(shop_name, customer_id, total_price) from USER RAM$Bob@aliyun.com:Allen;
    --查看Allen的撤销授权结果。
    show label grants on table sale_detail for USER RAM$Bob@aliyun.com:Allen;
    --返回结果如下。
    User Label: 1
    +-------------+--------------+--------------------------+
    | Column      | GrantedLabel | Expires                  |
    +-------------+--------------+--------------------------+
    | total_price | 3            | 2021-12-31T19:56:18+0800 |
    +-------------+--------------+--------------------------+
    --撤销Allen访问sale_detail表中敏感数据的权限。
    revoke Label on table sale_detail from USER RAM$Bob@aliyun.com:Allen; 
    --查看Allen的撤销授权结果。
    show label grants on table sale_detail for USER RAM$Bob@aliyun.com:Allen;
    --返回结果如下。
    User Label: 1

后续指引

了解Label授权机制后,您可以根据实际业务需要进行授权: