1. 程式人生 > >GreenPlum角色與許可權控制

GreenPlum角色與許可權控制

Greenplum資料庫使用角色(role)管理資料庫訪問許可權。

角色

角色的概念把使用者(user)和組(group)的概念包括在內。一個角色可能是一個數據庫使用者、一個組或者兩者兼具。角色可以擁有資料庫物件(例如表)並且可以那些物件上的特權分配給其他角色來控制對物件的訪問。角色可以是其他角色的成員,因此一個成員角色能夠繼承其父角色的物件特權。

每一個Greenplum資料庫系統都包含一組資料庫角色(使用者和組)。這些角色與伺服器所屬的作業系統管理的使用者和組相互獨立。不過,為了便於維護作業系統使用者名稱和Greenplum資料庫角色名之間的關係,有很多客戶端應用使用當前的作業系統使用者名稱作為預設。

在Greenplum資料庫中,使用者通過Master例項登入並且連線,Master例項接著會驗證它們的角色以及訪問特權。然後Master在幕後以當前登入的角色傳送命令給Segment例項。

角色被定義在系統層面上,這意味著它們對系統中所有的資料庫都有效。

為了讓Greenplum資料庫系統自舉,一個剛初始化好的系統總是有一個預定義的超級使用者角色(也被稱為系統使用者)。這個角色的名稱和初始化Greenplum資料庫系統的作業系統使用者相同。習慣上,這個角色被命名為gpadmin。為了建立更多角色,使用者首先必須作為這個初始角色連線。

角色和許可權的安全性最佳實踐
  1. 保護gpadmin系統使用者。出於安全考慮,要保護gpadmin系統使用者。
  2. 對每個登入的使用者分配一個獨特的角色。
  3. 使用組來管理訪問特。
  4. 限制擁有SUPERUSER角色屬性的使用者。 是超級使用者的角色可以繞過Greenplum資料庫中的所有訪問特權檢查以及資源佇列。只有系統管理員才應該被給予超級使用者權利。
建立新角色(使用者)

一個使用者級的角色被認為是能夠登入資料庫並且發起資料庫會話的資料庫角色。因此,在使用CREATE ROLE命令建立一個新的使用者級角色時,必須指定LOGIN特權。例如:

=# CREATE ROLE jsmith WITH LOGIN;

資料庫角色可以有若干屬性,它們定義角色可以在資料庫中執行哪些任務。可以在建立角色時設定這些屬性,或者在以後用ALTER ROLE命令來設定。

修改角色屬性

資料庫角色可以有若干屬性定義角色可以在資料庫中執行哪些任務。
使用alter role rolename with 命令來修改屬性。角色具有的屬性有(可通過\h create role檢視):

屬性 描述
SUPERUSER NOSUPERUSER 決定角色是否為一個超級使用者。要建立一個新的超級使用者,使用者本身必須是超級使用者。NOSUPERUSER是預設值。
CREATEDB NOCREATEDB 決定該角色是否被允許建立資料庫。NOCREATEDB是預設值。
CREATEROLE NOCREATEROLE 決定該角色是否被允許建立和管理其他角色。NOCREATEROLE是預設值。
INHERIT NOINHERIT 決定一個角色是否從它的父角色繼承特權。一個帶有INHERIT屬性的角色可以自動地使用授予給其所有直接父角色以及間接父角色的任何資料庫特權。INHERIT是預設值。
LOGIN NOLOGIN 決定一個角色是否被允許登入。一個帶有LOGIN屬性的角色可以被認為是一個使用者。沒有這個屬性的角色對於管理資料庫特權有用(組)。NOLOGIN是預設值。
CONNECTION LIMIT connlimit 如果角色能夠登入,這指定該角色能建立多少併發連線。-1(預設)表示沒有限制。
CREATEEXTTABLE 及NOCREATEEXTTABLE 決定一個角色是否被允許建立外部表。NOCREATEEXTTABLE是預設值。對於一個帶有CREATEEXTTABLE屬性的角色,預設的外部表型別是readable,而預設的協議是gpfdist。注意使用file或execute協議的外部表只能由超級使用者建立
PASSWORD ‘password’ 設定角色的口令。如果沒有計劃使用口令認證則可以省略這個選項。如果沒有指定口令,口令將被設定為空並且該使用者的口令認證總是會失敗。也可以有選擇地使用PASSWORD NULL顯式地寫入一個空口令。
ENCRYPTED 及 UNENCRYPTED 控制新口令是否在pg_authid系統目錄中儲存為一個雜湊字串。如果既沒有指定ENCRYPTED也沒有指定UNENCRYPTED,預設行為由password_encryption配置引數決定,這個引數預設是on。
VALID UNTIL ‘timestamp’ 設定一個日期和時間,在此之後該角色的口令不再有效。如果省略,則口令將會永久有效。
RESOURCE QUEUE queue_name 為負載管理的目的將角色分配到提及的資源佇列。然後該角色發出的任何語句都服從於該資源佇列的限制。注意RESOURCE QUEUE屬性不會被繼承,必須在每個使用者級(LOGIN)角色上設定它。
DENY{deny_interval 或 deny_point} 在一個間隔期間限制訪問,用日或者日和時間指定。

另有最新的角色屬性:resource group,可以檢視5.0版本後的官方文件。

角色的成員關係

將使用者組織在一起以簡化物件特權的管理常常會很方便:那樣,特權可以被授予給一個組整體或者從一個組整體收回。在Greenplum資料庫中通過建立一個表示組的角色,然後然後把這個組角色的成員關係授予給個別使用者角色來實現這一點。

使用SQL命令CREATE ROLE來建立一個新的組角色。例如:

=# CREATE ROLE admin CREATEROLE CREATEDB;

一旦組角色存在,使用者就可以使用GRANT和REVOKE命令增加和移除成員(使用者角色)。例如:

=# GRANT admin TO john, sally;
=# REVOKE admin FROM bob;

為了管理物件特權,使用者接著會把適當的許可權只授予給組級別的角色。然後成員使用者角色會繼承這個組角色的物件特權。例如:

=# GRANT ALL ON TABLE mytable TO admin;
=# GRANT ALL ON SCHEMA myschema TO admin;
=# GRANT ALL ON DATABASE mydb TO admin;

角色屬性LOGIN、SUPERUSER、CREATEDB、CREATEROLE、CREATEEXTTABLE以及RESOURCE QUEUE絕不會像資料庫物件上的普通特權那樣被繼承。為了使用這些屬性之一,使用者成員必須實際地SET ROLE到一個具有該屬性的特定角色。在上面的例子中,我們把CREATEDB和CREATEROLE給了admin角色。如果sally是admin的成員,她能夠發出下列命令來奪取其父角色的角色屬性:

=> SET ROLE admin;

這樣使用者sally將擁有admin使用者的所有許可權。在執行一段時間之後,如果仍然希望將該會話恢復為原有許可權,可以使用下列恢復方式之一:

SET ROLE sally;
SET ROLE NONE;
RESET ROLE;

要刪除一個組角色,執行DROP ROLE group_role命令即可。然而在刪除該組角色之後,它與其成員角色之間的關係將被立即撤銷(成員角色本身不會受影響)。不過需要注意的是,在刪除之前,任何屬於該組角色的物件都必須先被刪除或者將物件的所有者賦予其它角色,與此同時,任何賦予該組角色的許可權也都必須被撤消。

管理物件特權

當一個物件(表、檢視、序列、資料庫、函式、語言、方案或者表空間)被建立時,它會被分配一個擁有者。擁有者通常是執行建立語句的角色。對於大部分型別的物件,初始狀態是隻有擁有者(或者超級使用者)可以對該物件做任何事情。要允許其他角色使用它,必須授予特權。Greenplum資料庫對每種物件型別支援下列特權(可通過\h grant或\h revoke檢視):

物件型別 特權
表、檢視、序列 SELECT、INSERT、UPDATE、DELETE、RULE、ALL
外部表 SELECT、RULE、ALL
資料庫 CONNECT、CREATE、TEMPORARY 或TEMP、ALL
函式 EXECUTE
過程語言 USAGE
方案 CREATE、USAGE、ALL
自定義協議 SELECT、INSERT、UPDATE、DELETE、RULE、ALL

注意特權必須被個別地授予給每個物件。例如,在一個數據庫上授予ALL並不會授予對該資料庫中物件的完全訪問。它只授予所有資料庫級別的特權(CONNECT、CREATE、TEMPORARY)給資料庫本身。

使用SQL命令GRANT在一個物件上給予一個指定的角色特權。例如:

=# GRANT INSERT ON mytable TO jsmith;

要收回特權,使用REVOKE命令。例如:

=# REVOKE ALL PRIVILEGES ON mytable FROM jsmith;

還可以使用DROP OWNED和REASSIGN OWNED命令來管理棄用角色擁有的物件(注意:只有物件的擁有者或者超級使用者才能刪除物件或者重新分配所有權)。例如:

=# REASSIGN OWNED BY sally TO bob;
=# DROP OWNED BY visitor;
模擬行和列級訪問控制

不支援行級或者列級訪問控制,也不支援標記安全性。可以使用檢視來限制被選擇的列或行來模擬行級和列級訪問。可以對錶增加一個額外的列來儲存敏感度資訊以模擬行級標籤,然後使用檢視基於這一列來控制行級訪問。然後可以為角色授予這些檢視的訪問而不是基表的訪問。

加密資料

Greenplum資料庫包括一個可選的加密/解密函式包,名為pgcrypto。pgcrypto函式允許資料庫管理員以加密的形式儲存特定列的資料。這增加了一個額外的層來保護敏感資料,因為以加密形式儲存在Greenplum資料庫中的資料不能被任何沒有加密金鑰的人讀取,也不能被直接從磁碟讀取。

注意: pgcrypto函式在資料庫伺服器內部執行,這意味著所有的資料和口令會以明文在pgcrypto和客戶端應用之前移動。為了最好的安全性,也可考慮在客戶端和Greenplum的Master伺服器之間使用SSL連線。
要使用pgcrypto函式,在想要使用這種能力來查詢其他資料庫的每個資料庫中安裝指令碼$GPHOME/share/postgresql/contrib/pgcrypto.sql

$ psql -d testdb -f $GPHOME/share/postgresql/contrib/pgcrypto.sql
基於時間的認證

Greenplum資料庫允許管理員限制角色在特定時間的訪問。使用CREATE ROLE或者ALTER ROLE命令來指定基於時間的約束。

參考:
1.https://gp-docs-cn.github.io/docs/admin_guide/roles_privs.html
2.http://www.cnblogs.com/stephen-liu74/archive/2011/12/26/2302639.html