GreenPlum角色与权限控制
Greenplum數據庫使用角色(role)管理數據庫訪問權限。
角色
角色的概念把用戶(user)和組(group)的概念包括在內。一個角色可能是一個數據庫用戶、一個組或者兩者兼具。角色可以擁有數據庫對象(例如表)并且可以那些對象上的特權分配給其他角色來控制對對象的訪問。角色可以是其他角色的成員,因此一個成員角色能夠繼承其父角色的對象特權。
每一個Greenplum數據庫系統都包含一組數據庫角色(用戶和組)。這些角色與服務器所屬的操作系統管理的用戶和組相互獨立。不過,為了便于維護操作系統用戶名和Greenplum數據庫角色名之間的關系,有很多客戶端應用使用當前的操作系統用戶名作為默認。
在Greenplum數據庫中,用戶通過Master實例登入并且連接,Master實例接著會驗證它們的角色以及訪問特權。然后Master在幕后以當前登入的角色發送命令給Segment實例。
角色被定義在系統層面上,這意味著它們對系統中所有的數據庫都有效。
為了讓Greenplum數據庫系統自舉,一個剛初始化好的系統總是有一個預定義的超級用戶角色(也被稱為系統用戶)。這個角色的名稱和初始化Greenplum數據庫系統的操作系統用戶相同。習慣上,這個角色被命名為gpadmin。為了創建更多角色,用戶首先必須作為這個初始角色連接。
角色和權限的安全性最佳實踐
創建新角色(用戶)
一個用戶級的角色被認為是能夠登入數據庫并且發起數據庫會話的數據庫角色。因此,在使用CREATE ROLE命令創建一個新的用戶級角色時,必須指定LOGIN特權。例如:
=# CREATE ROLE jsmith WITH LOGIN;數據庫角色可以有若干屬性,它們定義角色可以在數據庫中執行哪些任務??梢栽趧摻ń巧珪r設置這些屬性,或者在以后用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;模擬行和列級訪問控制
不支持行級或者列級訪問控制,也不支持標記安全性??梢允褂靡晥D來限制被選擇的列或行來模擬行級和列級訪問??梢詫Ρ碓黾右粋€額外的列來存儲敏感度信息以模擬行級標簽,然后使用視圖基于這一列來控制行級訪問。然后可以為角色授予這些視圖的訪問而不是基表的訪問。
加密數據
Greenplum數據庫包括一個可選的加密/解密函數包,名為pgcrypto。pgcrypto函數允許數據庫管理員以加密的形式存儲特定列的數據。這增加了一個額外的層來保護敏感數據,因為以加密形式存儲在Greenplum數據庫中的數據不能被任何沒有加密密鑰的人讀取,也不能被直接從磁盤讀取。
注意: pgcrypto函數在數據庫服務器內部運行,這意味著所有的數據和口令會以明文在pgcrypto和客戶端應用之前移動。為了最好的安全性,也可考慮在客戶端和Greenplum的Master服務器之間使用SSL連接。
要使用pgcrypto函數,在想要使用這種能力來查詢其他數據庫的每個數據庫中安裝腳本$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
總結
以上是生活随笔為你收集整理的GreenPlum角色与权限控制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nodeJS生成随机token
- 下一篇: 车身域控制