全部產品
Search
文件中心

ApsaraDB for SelectDB:基礎使用者權限

更新時間:Jul 06, 2024

ApsaraDB for SelectDB的許可權管理系統借鑒了MySQL的許可權管理機制,實現了表層級細粒度的許可權控制,並支援基於角色的許可權存取控制和白名單機制。本文介紹ApsaraDB for SelectDB包含的許可權管理系統的背景和具備的許可權管理能力,及一些使用時的注意事項。

名詞解釋

名稱

屬性

說明

使用者標識

user_identity

在許可權系統中,一個使用者被識別為一個User Identity(使用者標識)。使用者標識由兩部分組成:username和userhost。其中username為使用者名稱,由英文大小寫字母組成。userhost表示該使用者連結的IP來源。user_identity有兩種呈現方式:

  • user_identity以username@'userhost':表示來自userhost的username。

  • username@['domain']:其中domain為網域名稱,可以通過DNS反向解析為一組IP地址。最終表現為一組username@'userhost'。

本文統一使用username@'userhost'來表示。

許可權

privilege

許可權作用的對象是節點、資料目錄、資料庫或表。不同的許可權代表不同的操作許可。

角色

role

角色可以被視為一組存取權限的集合。新建立的使用者可以被賦予某一角色,此時該使用者將自動被賦予該角色所擁有的許可權。後續對角色的許可權變更,也會體現在所有屬於該角色的使用者權限上。

使用者可以建立自訂命名的角色。

使用者屬性

user_property

使用者屬性直接附屬於某一使用者,而不是使用者標識。即cmy@'192.%'和cmy@['domain']都擁有同一組使用者屬性,該屬性屬於使用者cmy,而不是cmy@'192.%'或cmy@['domain']。使用者屬性包括但不限於:使用者最大串連數和匯入叢集配置等等。

許可權說明

權限類別型

許可權名稱

說明

GRANT_PRIV

許可權變更許可權。

允許執行包括授權、撤權、添加、刪除和變更使用者或角色等操作。

SELECT_PRIV

對資料庫、表的唯讀許可權。

LOAD_PRIV

對資料庫、表的寫入權限。包括Load、Insert、Delete等。

ALTER_PRIV

對資料庫、表的更改許可權。包括重新命名資料庫和表,添加、刪除或變更列,添加或刪除分區等操作。

CREATE_PRIV

建立資料庫、表、視圖的許可權。

DROP_PRIV

刪除資料庫、表、視圖的許可權。

USAGE_PRIV

資源的使用許可權。

許可權層級

根據許可權適用範圍的不同,庫表的許可權分為以下層級:

權限等級

說明

GLOBAL LEVEL

全域許可權

通過GRANT語句授予的*.*.*上的許可權。被授與權限適用於任意資料庫中的任意表。

CATALOG LEVEL

資料目錄級許可權

通過GRANT語句授予的ctl.*.*上的許可權。被授與權限適用於指定資料目錄中的任意庫表。

DATABASE LEVEL

資料庫級許可權

通過GRANT語句授予的ctl.db.*上的許可權。被授與權限適用於指定資料庫中的任意表。

TABLE LEVEL

表級許可權

通過GRANT語句授予的ctl.db.tbl上的許可權。被授與權限適用於指定資料庫中的指定表。

資源的許可權分為以下兩個層級:

權限等級

說明

GLOBAL LEVEL

全域許可權

通過GRANT語句授予的*上的許可權。被授與權限適用於任意資源。

RESOURCE LEVEL

資源級許可權

通過GRANT語句授予的resource_name上的許可權。被授與權限適用於指定資源。

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資源。詳見會話變數cpu_resource_limit的介紹。-1 表示未設定。

default_load_cluster

預設的匯入Cluster。

exec_mem_limit

限制查詢的記憶體使用量。詳見會話變數exec_mem_limit的介紹。-1 表示未設定。

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

CREATE USER [IF EXISTS] user_identity [IDENTIFIED BY 'password']
[DEFAULT ROLE 'role_name']
[password_policy]

刪除使用者

DROP USER

 DROP USER 'user_identity'
 
 `user_identity`:
     user@'host'
     user@['domain']

授權

GRANT

GRANT privilege_list ON priv_level TO user_identity [ROLE role_name]
 
GRANT privilege_list ON RESOURCE resource_name TO user_identity [ROLE role_name]

撤權

REVOKE

REVOKE privilege_list ON db_name[.tbl_name] FROM user_identity [ROLE role_name]
 
REVOKE privilege_list ON RESOURCE resource_name FROM user_identity [ROLE role_name]

建立角色

CREATE ROLE

 CREATE ROLE rol_name;

刪除角色

DROP ROLE

 DROP ROLE rol_name;

查看當前(所有)使用者權限

SHOW (ALL)GRANTS

SHOW [ALL] GRANTS [FOR user_identity];

查看已建立的角色

SHOW ROLES

SHOW ROLES

查看使用者屬性

SHOW PROPERTY

SHOW PROPERTY [FOR user] [LIKE key]

設定使用者屬性

SET PROPERTY

SET PROPERTY [FOR 'user'] 'key' = 'value' [, 'key' = 'value']

參數說明

參數

說明

[password_policy]

指定密碼認證登入相關策略,具體策略如下。

  • PASSWORD_HISTORY:是否允許目前使用者重設密碼時使用歷史密碼。

    參數規則:[n|DEFAULT]預設為0表示不啟用。如PASSWORD_HISTORY 10表示禁止使用過去10次設定過的密碼為新密碼。

  • PASSWORD_EXPIRE:設定目前使用者密碼的到期時間。

    參數規則:[DEFAULT|NEVER|INTERVAL n DAY/HOUR/SECOND]。預設為NEVER表示永不到期。

  • FAILED_LOGIN_ATTEMPTS:設定目前使用者登入時,如果使用錯誤的密碼登入n次後,賬戶將被鎖定。

    參數規則:[n|DEFAULT]。預設值不限制次數。

  • PASSWORD_LOCK_TIME:設定鎖定時間。

    參數規則:[n DAY/HOUR/SECOND|UNBOUNDED]。

操作樣本

  • 樣本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_useruser。其中current_user表示目前使用者是以哪種身份通過認證系統的,而user則是使用者當前實際的user_identity。所有的許可權都是賦予某一個current_user的,真實使用者擁有對應的current_user的所有許可權。

    舉例說明:假設建立了user1@'192.%'這個使用者,但是來自192.168.XX.XX的使用者user1登入了系統,則此時的current_useruser1@'192.%',而useruser1@'192.168.XX.XX'

常見問題

Q:如何解決在建立使用者並且進行授權時,遇到網域名稱與IP衝突或重複IP衝突的問題?

A:執行DROP USER刪除出現衝突的使用者後重新建立使用者,即可解決問題。

  • 網域名稱與IP衝突:

    1. 刪除該使用者後,建立新使用者並且授權,樣本如下。

      CREATE USER test_user@['domain'];
      GRANT SELECT_PRIV ON.TO test_user@['domain'];

      例如,該domain被DNS解析為兩個IP:IP1和IP2。

    2. 對使用者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時會被拒絕。