在資料庫中,對象的創建者將成為該對象的所有者,具有對該對象進行查詢、修改和刪除等操作的許可權。同時,系統管理員也擁有與所有者相同的許可權。 ...
本文分享自華為雲社區《GuassDB資料庫的GRANT & REVOKE》,作者: Gauss松鼠會小助手2 。
一、GaussDB的許可權概述
在資料庫中,對象的創建者將成為該對象的所有者,具有對該對象進行查詢、修改和刪除等操作的許可權。同時,系統管理員也擁有與所有者相同的許可權。因此,如果要讓其他用戶能夠使用某個對象,必須向該用戶或包含該用戶的角色授予必要的許可權。
GaussDB資料庫對象許可權:
對象 |
許可權 |
說明 |
資料庫 DATABASE |
CONNECT |
允許用戶連接到指定的資料庫 |
CREATE |
允許在資料庫里創建新的模式 |
|
模式 SCHEMA |
CREATE |
允許在模式中創建新的對象 |
USAGE |
允許訪問包含在指定模式中的對象,若沒有該許可權,則只能看到這些對象的名字 |
|
函數 FUNCTION |
EXECUTE |
允許使用指定的函數,以及利用這些函數實現的操作符 |
表空間 TABLESPACE |
CREATE |
允許在表空間中創建表,允許在創建資料庫和模式的時候把該表空間指定為預設表空間。 |
表 TABLE |
INSERT DELETE UPDATE SELECT |
允許用戶對指定表進行增刪改查操作 |
TRUNCATE |
允許執行TRUNCATE語句刪除指定表中的所有記錄。 |
|
REFERENCES |
創建一個外鍵約束,必須擁有參考表和被參考表的REFERENCES許可權 |
要撤消已經授予的許可權,可以使用REVOKE。
對象所有者的許可權(例如ALTER、DROP、COMMENT、INDEX、VACUUM、GRANT和REVOKE)是隱式擁有的,即只要擁有對象就可以執行對象所有者的這些隱式許可權。對象所有者可以撤消自己的普通許可權。
系統表和系統視圖要麼只對系統管理員可見,要麼對所有用戶可見。標識了需要系統管理員許可權的系統表和視圖只有系統管理員可以查詢。
資料庫提供對象隔離的特性,對象隔離特性開啟時,用戶只能查看有許可權訪問的對象(表、視圖、欄位、函數),系統管理員不受影響。
不建議用戶修改系統表和系統視圖的許可權。
二、GaussDB許可權設計建議
在進行業務使用前,必須由系統管理員(root用戶)創建資料庫、模式(SCHEMA)和用戶(USER)。然後,需要為相關用戶授予訪問對象所需的許可權。如果該用戶不是該模式的所有者,則要訪問該模式下的對象,還需要同時向該用戶授予模式的usage許可權和對象的相應許可權。
DATABASE、SCHEMA和USER名使用小寫。資料庫會預設把其名轉為小寫,連接串裡面如果出現大寫的對象名無法連接到資料庫。
對角色和用戶賦權時,應使用最小化許可權原則。
優先通過角色來管理許可權。使用角色管理許可權,再將角色賦予用戶。例如:
- 角色和用戶為多對多關係,一個角色可以賦予多個用戶,修改角色中的許可權,被賦予角色的用戶許可權就可以同時更新。
- 刪除用戶時,不會影響到角色。
- 新建用戶後可以通過賦予角色快速獲取所需許可權。
在刪除指定資料庫時,應回收用戶對該資料庫的CONNECT許可權,避免刪除時仍然存在活躍的資料庫連接而失敗。
三、GaussDB的GRANT命令
1.功能說明
1)將系統許可權授權給角色或用戶
系統許可權又稱為用戶屬性,包括SYSADMIN、CREATEDB、CREATEROLE、AUDITADMIN、MONADMIN、OPRADMIN、POLADMIN、INHERIT、REPLICATION、VCADMIN和LOGIN等。
系統許可權一般通過CREATE/ALTER ROLE語法來指定。其中,SYSADMIN許可權可以通過GRANT/REVOKE ALL PRIVILEGE授予或撤銷。但系統許可權無法通過ROLE和USER的許可權被繼承,也無法授予PUBLIC。
2)將資料庫對象授權給角色或用戶
將資料庫對象(表和視圖、指定欄位、資料庫、函數、模式、表空間等)的相關許可權授予特定角色或用戶;
GRANT命令將資料庫對象的特定許可權授予一個或多個角色。這些許可權會追加到已有的許可權上。
關鍵字PUBLIC表示該許可權要賦予所有角色,包括以後創建的用戶。PUBLIC可以看做是一個隱含定義好的組,它總是包括所有角色。任何角色或用戶都將擁有通過GRANT直接賦予的許可權和所屬的許可權,再加上PUBLIC的許可權。
如果聲明瞭WITH GRANT OPTION,則被授權的用戶也可以將此許可權賦予他人。這個選項不能賦予PUBLIC(GaussDB特有的屬性)。
GaussDB會將某些類型的對象上的許可權授予PUBLIC。預設情況下,對錶、表欄位、序列、外部數據源、外部伺服器、模式或表空間對象的許可權不會授予PUBLIC,而以下這些對象的許可權會授予PUBLIC:資料庫的CONNECT許可權和CREATE TEMP TABLE許可權、函數的EXECUTE特權、語言和數據類型(包括域)的USAGE特權。當然,對象擁有者可以撤銷預設授予PUBLIC的許可權並專門授予許可權給其他用戶。為了更安全,建議在同一個事務中創建對象並設置許可權,這樣其他用戶就沒有時間視窗使用該對象。
對象的所有者預設具有該對象上的所有許可權,出於安全考慮所有者可以捨棄部分許可權,但ALTER、DROP、COMMENT、INDEX、VACUUM以及對象的可再授予許可權屬於所有者固有的許可權,隱式擁有。
3)將角色或用戶的許可權授權給其他角色或用戶
將一個角色或用戶的許可權授予一個或多個其他角色或用戶。在這種情況下,每個角色或用戶都可視為擁有一個或多個資料庫許可權的集合。
如果聲明瞭WITH ADMIN OPTION,被授權的用戶可以將該許可權再次授予其他角色或用戶,以及撤銷所有由該角色或用戶繼承到的許可權。當授權的角色或用戶發生變更或被撤銷時,所有繼承該角色或用戶許可權的用戶擁有的許可權都會隨之發生變更。
資料庫系統管理員可以給任何角色或用戶授予/撤銷任何許可權。擁有CREATEROLE許可權的角色可以賦予或者撤銷任何非系統管理員角色的許可權。
4)將ANY許可權授予給角色或用戶
將ANY許可權授予特定的角色和用戶。當聲明瞭WITH ADMIN OPTION,被授權的用戶可以將該ANY許可權再次授予其他角色/用戶,或從其他角色/用戶處回收該ANY許可權。ANY許可權可以通過角色被繼承,但不能賦予PUBLIC。初始用戶和三權分立關閉時的系統管理員用戶可以給任何角色/用戶授予或撤銷ANY許可權。
目前支持以下ANY許可權:
CREATE ANY TABLE |
CREATE ANY SEQUENCE |
ALTER ANY TABLE |
CREATE ANY INDEX |
DROP ANY TABLE |
CREATE ANY FUNCTION |
SELECT ANY TABLE |
EXECUTE ANY FUNCTION |
INSERT ANY TABLE |
CREATE ANY PACKAGE |
UPDATE ANY TABLE |
EXECUTE ANY PACKAGE |
DELETE ANY TABLE |
CREATE ANY TYPE |
2.註意事項
1)不允許將ANY許可權授予PUBLIC,也不允許從PUBLIC回收ANY許可權。
2)ANY許可權屬於資料庫內的許可權,只對授予該許可權的資料庫內的對象有效,例如SELECT ANY TABLE只允許用戶查看當前資料庫內的所有用戶表數據,對其他資料庫內的用戶表無查看許可權。
3)即使用戶被授予ANY許可權,也不能對私有用戶下的對象進行訪問操作(INSERT、DELETE、UPDATE、SELECT)。
4)ANY許可權與原有的許可權相互無影響。
5)如果用戶被授予CREATE ANY TABLE許可權,在同名schema下創建表的屬主是該schema的創建者,用戶對錶進行其他操作時,需要授予相應的操作許可權。
6)需要謹慎授予用戶CREATE ANY FUNMCTION的許可權,以免其他用戶利用SECURITY DEFINER類型的函數進行許可權提升。
3.常用語法
1)將表或視圖的訪問許可權賦予指定的用戶或角色
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER | ALTER | DROP | COMMENT | INDEX | VACUUM } [, ...] | ALL [ PRIVILEGES ] } ON { [ TABLE ] table_name [, ...] | ALL TABLES IN SCHEMA schema_name [, ...] } TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ];
2)將表中欄位的訪問許可權賦予指定的用戶或角色
GRANT { {{ SELECT | INSERT | UPDATE | REFERENCES | COMMENT } ( column_name [, ...] )} [, ...] | ALL [ PRIVILEGES ] ( column_name [, ...] ) } ON [ TABLE ] table_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ];
3)將資料庫的訪問許可權賦予指定的用戶或角色
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON DATABASE database_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ];
4)將函數的訪問許可權賦予給指定的用戶或角色
GRANT { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON { FUNCTION {function_name ( [ {[ argmode ] [ arg_name ] arg_type} [, ...] ] )} [, ...] | ALL FUNCTIONS IN SCHEMA schema_name [, ...] } TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ];
5)將存儲過程的訪問許可權賦予給指定的用戶或角色
GRANT { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON { PROCEDURE {proc_name ( [ {[ argmode ] [ arg_name ] arg_type} [, ...] ] )} [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ];
……
四、GaussDB的REVOKE命令用法
1.功能說明
REVOKE用於撤銷一個或多個用戶或角色的許可權。
2.註意事項
非對象所有者REVOKE許可權時,按照以下規則執行:
1)如果授權用戶沒有該對象上的許可權,則命令立即失敗。
2)如果授權用戶有部分許可權,則只撤銷那些有授權選項的許可權。
3)如果授權用戶沒有授權選項,REVOKE ALL PRIVILEGES形式將發出一個錯誤信息,而對於其他形式的命令而言,如果是命令中指定名稱的許可權沒有相應的授權選項,該命令將發出一個警告。
3.常用語法
1)回收指定表或視圖上的許可權
REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | ALTER | DROP | COMMENT | INDEX | VACUUM }[, ...] | ALL [ PRIVILEGES ] } ON { [ TABLE ] table_name [, ...] | ALL TABLES IN SCHEMA schema_name [, ...] } FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ];
2)回收表上指定欄位的許可權
REVOKE [ GRANT OPTION FOR ] { {{ SELECT | INSERT | UPDATE | REFERENCES | COMMENT } ( column_name [, ...] )}[, ...] | ALL [ PRIVILEGES ] ( column_name [, ...] ) } ON [ TABLE ] table_name [, ...] FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ];
3)回收指定資料庫上的許可權
REVOKE [ GRANT OPTION FOR ] { { CREATE | CONNECT | TEMPORARY | TEMP | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON DATABASE database_name [, ...] FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ];
4)回收指定函數上的許可權
REVOKE [ GRANT OPTION FOR ] { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON { FUNCTION {function_name ( [ {[ argmode ] [ arg_name ] arg_type} [, ...] ] )} [, ...] | ALL FUNCTIONS IN SCHEMA schema_name [, ...] } FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ];
5)回收指定存儲過程上的許可權
REVOKE [ GRANT OPTION FOR ] { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON { PROCEDURE {proc_name ( [ {[ argmode ] [ arg_name ] arg_type} [, ...] ] )} [, ...] | ALL PROCEDURE IN SCHEMA schema_name [, ...] } FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ];
……
五、GaussDB示例
1.GRANT 語句示例
1)授予用戶 user_name 對 database_name.table_name 表的 SELECT、INSERT、UPDATE、DELETE 許可權。
GRANT SELECT,INSERT,UPDATE,DELETE ON database_name.table_name TO user_name;
2)授予用戶 user_name 對 database_name.table_name 的所有許可權。
GRANT ALL PRIVILEGES ON database_name.table_name TO user_name;
3)授予用戶 user_name 對 database_name.table_name 的 SELECT、INSERT、UPDATE、DELETE 許可權,並允許他將該許可權傳遞給其他用戶。
GRANT SELECT,INSERT,UPDATE,DELETE ON database_name.table_name TO user_name WITH GRANT OPTION;
2.REVOKE 語句示例:
1)撤銷用戶 user_name 對 database_name.table_name 表的 SELECT、INSERT、UPDATE、DELETE 許可權。
REVOKE SELECT,INSERT,UPDATE,DELETE on database_name.table_name FROM user_name;
2)撤銷用戶 user_name 對 database_name.table_name 的所有許可權。
REVOKE ALL PRIVILEGES ON database_name.table_name FROM user_name;
3)撤銷用戶 user_name 對 database_name.table_name 表的 SELECT、INSERT、UPDATE、DELETE 許可權。
Tip:一個用戶只能撤銷由它自己直接賦予的許可權,依賴性許可權仍然存在,但如果聲明瞭CASCADE,則所有依賴性許可權都被撤銷.
REVOKE SELECT,INSERT,UPDATE,DELETE ON database_name.table_name FROM user_name WITH GRANT OPTION;
小結:資料庫的GRANT & REVOKE命令是用於管理資料庫用戶許可權的命令。這些命令通常用於在資料庫中為用戶分配許可權,以便用戶可以訪問和操作資料庫中的數據。GRANT & REVOKE是GaussDB雲資料庫中非常重要的一個命令,它可以用於撤銷和管理資料庫中的不同對象的訪問許可權,從而保證資料庫的安全性和可靠性。