ApsaraDB for SelectDB的許可權管理系統借鑒了MySQL的許可權管理機制,實現了表層級細粒度的許可權控制,並支援基於角色的許可權存取控制和白名單機制。本文介紹ApsaraDB for SelectDB包含的許可權管理系統的背景和具備的許可權管理能力,及一些使用時的注意事項。
許可權說明
權限類別型
許可權名稱 | 說明 |
GRANT_PRIV | 許可權變更許可權。 允許執行包括授權、撤權、添加、刪除和變更使用者或角色等操作。 |
SELECT_PRIV | 對資料庫、表的唯讀許可權。 |
LOAD_PRIV | 對資料庫、表的寫入權限。包括Load、Insert、Delete等。 |
ALTER_PRIV | 對資料庫、表的更改許可權。包括重新命名資料庫和表,添加、刪除或變更列,添加或刪除分區等操作。 |
CREATE_PRIV | 建立資料庫、表、視圖的許可權。 |
DROP_PRIV | 刪除資料庫、表、視圖的許可權。 |
USAGE_PRIV | 資源的使用許可權。 |
許可權層級
根據許可權適用範圍的不同,庫表的許可權分為以下層級:
權限等級 | 說明 |
GLOBAL LEVEL 全域許可權 | 通過GRANT語句授予的 |
CATALOG LEVEL 資料目錄級許可權 | 通過GRANT語句授予的 |
DATABASE LEVEL 資料庫級許可權 | 通過GRANT語句授予的 |
TABLE LEVEL 表級許可權 | 通過GRANT語句授予的 |
資源的許可權分為以下兩個層級:
權限等級 | 說明 |
GLOBAL LEVEL 全域許可權 | 通過GRANT語句授予的 |
RESOURCE LEVEL 資源級許可權 | 通過GRANT語句授予的 |
ADMIN/GRANT許可權說明
ADMIN_PRIV和GRANT_PRIV許可權同時擁有授予許可權的許可權,較為特殊。ADMIN_PRIV和GRANT_PRIV許可權相關的操作說明如下:
CREATE USER
擁有ADMIN許可權,或GLOBAL和DATABASE層級的GRANT許可權的使用者可以建立新使用者。
DROP USER
擁有ADMIN許可權或全域層級的GRANT許可權的使用者可以刪除使用者。
CREATE/DROP ROLE
擁有ADMIN許可權或全域層級的GRANT許可權的使用者可以建立角色。
GRANT/REVOKE
擁有ADMIN許可權,或者GLOBAL層級GRANT許可權的使用者,可以授予或撤銷任意使用者的許可權。
擁有CATALOG層級GRANT許可權的使用者,可以授予或撤銷任意使用者對指定CATALOG的許可權。
擁有DATABASE層級GRANT許可權的使用者,可以授予或撤銷任意使用者對指定資料庫的許可權。
擁有TABLE層級GRANT許可權的使用者,可以授予或撤銷任意使用者對指定資料庫中指定表的許可權。
SET PASSWORD
擁有ADMIN許可權,或者GLOBAL層級GRANT許可權的使用者,可以設定任意使用者的密碼。
普通使用者可以設定自己對應的UserIdentity的密碼。自己對應的UserIdentity可以通過
SELECT CURRENT_USER();
命令查看。擁有非GLOBAL層級GRANT許可權的使用者,不可以設定已存在使用者的密碼,僅能在建立使用者時指定密碼。
使用者屬性列表
部分與使用者相關的屬性如下表所示:
屬性名稱 | 說明 |
cpu_resource_limit | 限制查詢的CPU資源。詳見會話變數 |
default_load_cluster | 預設的匯入Cluster。 |
exec_mem_limit | 限制查詢的記憶體使用量。詳見會話變數 |
insert_timeout | 指定使用者INSERT操作的逾時限制。 |
max_query_instances | 使用者同一時間點執行查詢可以使用的執行單元個數。 |
max_user_connections | 最大串連數。 |
query_timeout | 指定使用者的查詢逾時限制。 |
resource_tags | 指定使用者的資源標籤限制。 |
sql_block_rules | 設定SQL Block Rules。設定後,使用者發送的查詢如果匹配規則,則會被拒絕執行。 |
如果某個使用者屬性(user property)在變數(variable)中也存在,例如query_timeout
,生效的優先順序次序是:session variable
>user property
>global variable
>default value
。較高優先順序的變數未設定時,會自動採用下一個優先順序的數值。
許可權操作
操作名稱 | 操作關鍵字 | 文法 |
建立使用者 | CREATE USER |
|
刪除使用者 | DROP USER |
|
授權 | GRANT |
|
撤權 | REVOKE |
|
建立角色 | CREATE ROLE |
|
刪除角色 | DROP ROLE |
|
查看當前(所有)使用者權限 | SHOW (ALL)GRANTS |
|
查看已建立的角色 | SHOW ROLES |
|
查看使用者屬性 | SHOW PROPERTY |
|
設定使用者屬性 | SET PROPERTY |
|
參數說明
參數 | 說明 |
[password_policy] | 指定密碼認證登入相關策略,具體策略如下。
|
操作樣本
樣本1:建立使用者
test_user
且密碼為123456,允許從'172.10.XX.XX'地址登入。CREATE USER test_user@'172.10.XX.XX' IDENTIFIED BY '123456';
樣本2:刪除使用者
test_user@'172.10.XX.XX'
。DROP USER 'test_user'@'172.10.XX.XX'
樣本3:授予使用者
test_user@'172.10.XX.XX'
表test_ctl.test_db.test_table
的讀取、修改和匯入許可權。GRANT SELECT_PRIV,ALTER_PRIV,LOAD_PRIV ON test_ctl.test_db.test_table TO 'test_user'@'172.10.XX.XX';
樣本4:撤銷使用者
test_user
資料庫test_db的讀取許可權。REVOKE SELECT_PRIV ON test_db.* FROM 'test_user'@'172.10.XX.XX';
樣本5:建立角色
test_role
。CREATE ROLE test_role;
樣本6:刪除角色
test_role
。DROP ROLE test_role;
樣本7:將資料庫
test_ctl.test_db
的所有表的匯入許可權授予於角色test_role
。GRANT LOAD_PRIV ON test_ctl.test_db.* TO ROLE 'test_role';
樣本8:將使用者
test_user@'172.10.XX.XX'
的角色修改為test_role
。GRANT "test_role" TO test_user@'172.10.XX.XX';
樣本9:查看使用者
test_user@'%'
的許可權。SHOW GRANTS FOR test_user@'%';
樣本10:查看使用者
test_user
的屬性。# 查看使用者的全部屬性 SHOW PROPERTY FOR 'test_user'; # 使用LIKE運算式查看使用者的具體屬性 SHOW PROPERTY FOR 'test_user' LIKE '%max_user_connections%';
樣本11:設定使用者
test_user
的屬性。SET PROPERTY FOR 'test_user' 'max_user_connections' = '1000';
最佳實務
常見許可權系統的使用情境如下:
情境一
叢集的使用者分為管理員(Admin)、開發工程師(RD)和使用者(Client)。其中管理員擁有整個叢集的所有許可權,主要負責叢集的搭建、節點管理等。開發工程師負責業務建模,包括建庫建表、資料的匯入和修改等。使用者訪問不同的資料庫和表來擷取資料。
在這種情境下,可以為管理員賦予ADMIN許可權或GRANT許可權。對RD賦予對任意或指定資料庫表的 CREATE、DROP、ALTER、LOAD、SELECT許可權。對Client賦予對任意或指定資料庫表SELECT許可權。同時,也可以通過建立不同的角色,來簡化對多個使用者的授權操作。
情境二
一個叢集內有多個業務,每個業務可能使用一個或多個資料。每個業務需要管理自己的使用者。在這種情境下,管理使用者可以為每個資料庫建立一個擁有DATABASE層級GRANT許可權的使用者。該使用者僅可以對使用者進行指定的資料庫的授權。
情境三
ApsaraDB for SelectDB本身不支援黑名單,只有白名單功能,但可以通過某些方式來類比黑名單。假設先建立了名為
test_user1@'192.%'
的使用者,表示允許來自192.*
的使用者登入。此時如果想禁止來自192.168.XX.XX
的使用者登入。則可以再建立一個使用者test_user2@'192.168.XX.XX'
的使用者,並設定一個新的密碼。因為192.168.XX.XX
的優先順序高於192.%
,所以來自192.168.XX.XX
將不能再使用舊密碼進行登入。
許可權注意事項
執行個體初始化時,會自動建立如下角色和使用者:
operator角色:該角色為營運操作角色,擁有Node_priv和Admin_priv許可權,即對雲資料庫 SelectDB 版的所有許可權,允許從任意節點登入。僅執行個體內建的root使用者(root@'%')擁有該角色。
admin角色:該角色為管理角色,擁有Admin_priv許可權,即除節點變更以外的所有許可權,允許從任意節點登入。執行個體初始化會自動建立一個該角色的使用者admin(admin@'%'),支援建立多個該角色的使用者。
不支援刪除或更改預設建立的角色或使用者的許可權。
忘記admin密碼。如果忘記了admin密碼無法登入,可以在管控平台上重設admin密碼,詳情請參見重設執行個體admin密碼。
ADMIN_PRIV許可權只能在GLOBAL層級授予或撤銷。
擁有GLOBAL層級GRANT_PRIV等同於擁有ADMIN_PRIV,因為該層級的GRANT_PRIV有授予任意許可權的許可權,請謹慎使用。
通過
SELECT current_user();
和SELECT user();
可以分別查看current_user
和user
。其中current_user
表示目前使用者是以哪種身份通過認證系統的,而user
則是使用者當前實際的user_identity
。所有的許可權都是賦予某一個current_user
的,真實使用者擁有對應的current_user
的所有許可權。舉例說明:假設建立了
user1@'192.%'
這個使用者,但是來自192.168.XX.XX
的使用者user1
登入了系統,則此時的current_user
為user1@'192.%'
,而user
為user1@'192.168.XX.XX'
。
常見問題
Q:如何解決在建立使用者並且進行授權時,遇到網域名稱與IP衝突或重複IP衝突的問題?
A:執行DROP USER
刪除出現衝突的使用者後重新建立使用者,即可解決問題。
網域名稱與IP衝突:
刪除該使用者後,建立新使用者並且授權,樣本如下。
CREATE USER test_user@['domain']; GRANT SELECT_PRIV ON.TO test_user@['domain'];
例如,該domain被DNS解析為兩個IP:IP1和IP2。
對使用者
test_user@['domain']
進行一次單獨授權的訪問IP1授權,樣本如下。GRANT ALTER_PRIV ON.TO test_user@'IP1';
則
test_user@'IP1'
的許可權會被從SELECT_PRIV修改為ALTER_PRIV,且允許訪問的IP變更為IP1,再次變更test_user@['domain']
的許可權時,test_user@'IP1'
也不會跟隨改變。
重複IP衝突:
刪除該使用者後,建立新使用者,樣本如下。
CREATE USER test_user@'%' IDENTIFIED BY "12345"; CREATE USER test_user@'192.%' IDENTIFIED BY "abcde";
在優先順序上,'192.%'優先於'%'。因此,當使用者
test_user
從192.168.XX.XX這台機器嘗試使用密碼'12345'登入ApsaraDB for SelectDB時會被拒絕。