MaxCompute支援在專案層級為使用者佈建訪問許可等級標籤,為表或表的列設定敏感等級標籤(Label),使用者僅可以訪問MaxCompute專案中敏感等級小於等於自身訪問許可等級的表或列資料。本文為您介紹Label授權操作並提供樣本供參考。
背景資訊
Label許可權控制即LabelSecurity,是專案層級的一種強制存取控制策略。建立MaxCompute專案後,LabelSecurity預設為關閉狀態。專案所有者(Project Owner)可以在MaxCompute專案的Project層級,執行Set LabelSecurity=true|false;
命令,開啟或關閉LabelSecurity。
如果開啟了LabelSecurity,專案所有者(Project Owner)需要定義明確的表或表的列敏感等級、使用者訪問許可等級劃分標準,並分別為表或表的列、使用者或角色設定敏感等級標籤、訪問許可等級標籤。當使用者訪問設定了敏感等級的資料時,除必須擁有目標表的SELECT許可權外,僅能訪問敏感等級小於等於自身訪問許可等級的表或列資料。
LabelSecurity對敏感性資料的支援能力如下:
最小支援粒度為列層級,即對錶的列設定敏感等級。
支援對錶的任何列設定敏感等級標籤。一張表可以由不同敏感等級的列構成。
支援對視圖設定敏感等級標籤。視圖的敏感等級標籤和視圖對應的源表的敏感等級標籤是獨立的。
LabelSecurity支援的操作如下。
操作 | 說明 | 操作人 | 授權操作入口 |
為表或表的列設定敏感等級標籤。 |
| ||
為使用者或角色設定可以訪問的敏感等級資料標籤。 | |||
為低訪問許可等級使用者或角色授予訪問高敏感等級資料的許可權。 | |||
撤銷為使用者或角色授予的訪問高敏感等級資料的許可權。 | |||
刪除到期許可權資訊。 |
LabelSecurity預設許可權控制策略
在對錶或列資料、使用者或角色設定標籤之後,基於標籤的預設許可權控制策略如下:
No-ReadUp:不允許使用者訪問敏感等級大於使用者訪問許可等級的資料。如果實際業務涉及此情境,需要執行顯式授權操作。更多顯式授權操作資訊,請參見Label顯式授權。
Trusted-User:允許使用者寫不高於使用者訪問許可等級的資料。新建立的表或視圖預設為0級(不保密)。新添加使用者預設為0級。
前提條件
使用Label許可權控制方案前,請您確認已記錄好如下資訊:
被授權人的帳號或角色名稱,且帳號或角色已添加至MaxCompute專案。阿里雲帳號格式為ALIYUN$<account_id>,RAM使用者帳號格式為 RAM$<account_id>:<RAM使用者UID>,RAM角色帳號格式為`RAM$<account_id>:role/<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授權機制後,您可以根據實際業務需要進行授權: