MaxCompute支持在项目级别为用户设置访问许可等级标签,为表或表的列设置敏感等级标签(Label),用户仅可以访问MaxCompute项目中敏感等级小于等于自身访问许可等级的表或列数据。本文介绍Label授权操作并提供示例。
功能介绍
Label权限控制即LabelSecurity,是项目级别的一种强制访问控制策略,默认为关闭状态。
项目所有者(Project Owner)可以在MaxCompute项目的Project级别,执行SET LabelSecurity=true|false;命令,开启或关闭LabelSecurity。
开启LabelSecurity后,项目所有者(Project Owner)需要执行如下操作:
定义明确的表或表的列敏感等级
定义用户访问许可等级划分标准
分别为表或表的列、用户或角色设置敏感等级标签、访问许可等级标签
当用户访问设置了敏感等级的数据时,除必须拥有目标表的SELECT权限外,仅能访问敏感等级小于等于自身访问许可等级的表或列数据。
支持能力
列级别支持:最小支持粒度为列级别。支持对表的任何列设置敏感等级标签,一张表可以由不同敏感等级的列构成。
视图支持:支持对视图设置敏感等级标签。视图的敏感等级标签和视图对应的源表的敏感等级标签是独立的。
不支持对分区列设置敏感数据等级标签。
支持操作
项目所有者(Project Owner)和具备Admin角色的用户可以执行如下操作。
上述操作可通过MaxCompute客户端、使用SQL分析连接、MaxCompute Studio和DataWorks等工具执行。
默认权限控制策略
No-ReadUp:不允许用户访问敏感等级大于用户访问许可等级的数据。如果实际业务涉及此场景,需要执行显式授权操作。更多显式授权操作信息,请参见Label显式授权。
Trusted-User:允许用户写入不高于用户访问许可等级的数据。新创建的表或视图默认为0级(不保密)。新添加用户默认为0级。
适用范围
在一些传统的强制访问控制系统中,为了防止数据在项目内部被任意分发,通常还支持更多复杂的安全策略。
例如,不允许用户写入敏感等级不高于用户访问许可等级的数据(No-WriteDown)。但在MaxCompute中,考虑到数据敏感等级的管理成本,默认安全策略并不支持No-WriteDown。
如果项目有类似需求,可以通过
Set ObjectCreatorHasGrantPermission=false;命令,修改项目安全配置以达到控制目的。为避免数据在不同项目之间流动,可以通过
set ProjectProtection=true;命令,将项目设置为受保护状态(ProjectProtection)。设置后,只允许用户在项目内访问数据,有效防止数据流出到项目之外。更多项目数据保护信息,参见数据保护机制。如果对象被删除,MaxCompute会自动撤销与该对象关联的所有Label授权信息。
当一个用户被移除后,与该用户有关的授权仍然会被保留。一旦该用户以后被再次添加到该项目时,该用户的历史授权访问权限将被重新激活。如果需要彻底清除用户的权限信息,请参见彻底清除被删除用户遗留的权限信息。
前提条件
使用Label权限控制方案前,请确认已记录好如下信息:
被授权人的账号或角色名称,且账号或角色已添加至MaxCompute项目。
阿里云账号格式为
ALIYUN$<account_name>RAM用户账号格式为
RAM$[<account_name>:]<RAM用户名称>RAM角色账号格式为`RAM$<account_name>:role/<RAM角色名称>`
通过MaxCompute客户端执行
LIST users;或LIST roles;命令获取账号或角色信息。授权对象表或列的名称。
通过MaxCompute客户端执行
SHOW TABLES;命令获取表或视图名称、列名称。
为表或列数据设置敏感等级标签
由Project Owner或具备Admin角色的用户为表或表的列设置敏感等级标签。
命令格式
SET LabelSecurity=true; 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 LabelSecurity=true; 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中存在一张表sale_detail。表列有shop_name、customer_id和total_price。
Bob@aliyun.com是test_project的项目所有者。Allen为隶属于Bob的RAM用户且已被添加至项目test_project中。
建表语句如下:
CREATE TABLE sale_detail (
shop_name STRING COMMENT '店铺名称',
customer_id STRING COMMENT '顾客ID',
total_price DOUBLE COMMENT '订单总价'
);示例一:为表sale_detail或表的列设置敏感等级标签
-- Bob进入项目test_project。
USE test_project;
-- 设置表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);
-- 查看表的Label信息。
DESCRIBE sale_detail;
-- 返回结果
+------------------------------------------------------------------------------------+
| TableLabel: |
| MaxLabel: L2 |
+------------------------------------------------------------------------------------+
| InternalTable: YES | Size: 0 |
+------------------------------------------------------------------------------------+
| Native Columns: |
+------------------------------------------------------------------------------------+
| Field | Type | Label | Comment |
+------------------------------------------------------------------------------------+
| shop_name | string | 2 | 店铺名称 |
| customer_id | string | 2 | 顾客ID |
| total_price | double | | 订单总价 |
+------------------------------------------------------------------------------------+
-- 修改表sale_detail的Label为3级。需要注意的是:此时shop_name和customer_id两列的Label仍为2级,其他列的Label修改为3。
SET Label 3 TO TABLE sale_detail;
-- 查看表的Label信息。
DESCRIBE sale_detail;
-- 返回结果
+------------------------------------------------------------------------------------+
| TableLabel: 3 |
| MaxLabel: L3 |
+------------------------------------------------------------------------------------+
| InternalTable: YES | Size: 0 |
+------------------------------------------------------------------------------------+
| Native Columns: |
+------------------------------------------------------------------------------------+
| Field | Type | Label | Comment |
+------------------------------------------------------------------------------------+
| shop_name | string | 2 | 店铺名称 |
| customer_id | string | 2 | 顾客ID |
| total_price | double | 3 | 订单总价 |
+------------------------------------------------------------------------------------+
-- 修改表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;
-- 返回结果。
+------------------------------------------------------------------------------------+
| TableLabel: |
| MaxLabel: L4 |
+------------------------------------------------------------------------------------+
| InternalTable: YES | Size: 0 |
+------------------------------------------------------------------------------------+
| Native Columns: |
+------------------------------------------------------------------------------------+
| Field | Type | Label | Comment |
+------------------------------------------------------------------------------------+
| shop_name | string | 4 | 店铺名称 |
| customer_id | string | 4 | 顾客ID |
| total_price | double | | 订单总价 |
+------------------------------------------------------------------------------------+示例二:为项目中的一般用户及RAM用户设置访问许可等级标签
项目中的一般用户:Kate@aliyun.com
项目中的RAM用户:RAM$Bob@aliyun.com:Allen
-- Bob进入项目test_project。
USE test_project;
-- 设置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显式授予访问高敏感级数据的权限
-- 进入项目test_project。
USE test_project;
-- 显式授权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 | 2025-12-26T11:13:20+0800 |
+-------------+--------------+--------------------------+
-- 显式授权Allen访问sale_detail表的shop_name、customer_id和total_price列中敏感度不超过4级的数据,授权有效期为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 | 2026-01-01T11:14:40+0800 |
+-------------+--------------+--------------------------+
| shop_name | 4 | 2026-01-01T11:14:40+0800 |
+-------------+--------------+--------------------------+
| total_price | 4 | 2026-01-01T11:14:40+0800 |
+-------------+--------------+--------------------------+示例四:撤销为Allen授予的访问高敏感级数据权限
-- 此时,在之前的数据权限配置中:
-- 先显式授权Allen访问sale_detail表中敏感度不超过3级的数据
-- 后显式授权Allen访问sale_detail表的shop_name、customer_id和total_price列中敏感度不超过4级的数据
-- 撤销Allen访问sale_detail表的shop_name、customer_id和total_price列级别的数据访问权限。
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;
--返回结果如下:
-- 撤销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
+-------------+--------------+---------+
| Column | GrantedLabel | Expires |
+-------------+--------------+---------+
| total_price | 1 | |
+-------------+--------------+---------+后续指引
了解Label授权机制后,可以根据实际业务需要授权: