GreenPlum角色与权限控制
Greenplum數(shù)據(jù)庫使用角色(role)管理數(shù)據(jù)庫訪問權(quán)限。
角色
角色的概念把用戶(user)和組(group)的概念包括在內(nèi)。一個角色可能是一個數(shù)據(jù)庫用戶、一個組或者兩者兼具。角色可以擁有數(shù)據(jù)庫對象(例如表)并且可以那些對象上的特權(quán)分配給其他角色來控制對對象的訪問。角色可以是其他角色的成員,因此一個成員角色能夠繼承其父角色的對象特權(quán)。
每一個Greenplum數(shù)據(jù)庫系統(tǒng)都包含一組數(shù)據(jù)庫角色(用戶和組)。這些角色與服務(wù)器所屬的操作系統(tǒng)管理的用戶和組相互獨立。不過,為了便于維護(hù)操作系統(tǒng)用戶名和Greenplum數(shù)據(jù)庫角色名之間的關(guān)系,有很多客戶端應(yīng)用使用當(dāng)前的操作系統(tǒng)用戶名作為默認(rèn)。
在Greenplum數(shù)據(jù)庫中,用戶通過Master實例登入并且連接,Master實例接著會驗證它們的角色以及訪問特權(quán)。然后Master在幕后以當(dāng)前登入的角色發(fā)送命令給Segment實例。
角色被定義在系統(tǒng)層面上,這意味著它們對系統(tǒng)中所有的數(shù)據(jù)庫都有效。
為了讓Greenplum數(shù)據(jù)庫系統(tǒng)自舉,一個剛初始化好的系統(tǒng)總是有一個預(yù)定義的超級用戶角色(也被稱為系統(tǒng)用戶)。這個角色的名稱和初始化Greenplum數(shù)據(jù)庫系統(tǒng)的操作系統(tǒng)用戶相同。習(xí)慣上,這個角色被命名為gpadmin。為了創(chuàng)建更多角色,用戶首先必須作為這個初始角色連接。
角色和權(quán)限的安全性最佳實踐
創(chuàng)建新角色(用戶)
一個用戶級的角色被認(rèn)為是能夠登入數(shù)據(jù)庫并且發(fā)起數(shù)據(jù)庫會話的數(shù)據(jù)庫角色。因此,在使用CREATE ROLE命令創(chuàng)建一個新的用戶級角色時,必須指定LOGIN特權(quán)。例如:
=# CREATE ROLE jsmith WITH LOGIN;數(shù)據(jù)庫角色可以有若干屬性,它們定義角色可以在數(shù)據(jù)庫中執(zhí)行哪些任務(wù)??梢栽趧?chuàng)建角色時設(shè)置這些屬性,或者在以后用ALTER ROLE命令來設(shè)置。
修改角色屬性
數(shù)據(jù)庫角色可以有若干屬性定義角色可以在數(shù)據(jù)庫中執(zhí)行哪些任務(wù)。
使用alter role rolename with 命令來修改屬性。角色具有的屬性有(可通過\h create role查看):
| SUPERUSER | NOSUPERUSER 決定角色是否為一個超級用戶。要創(chuàng)建一個新的超級用戶,用戶本身必須是超級用戶。NOSUPERUSER是默認(rèn)值。 |
| CREATEDB | NOCREATEDB 決定該角色是否被允許創(chuàng)建數(shù)據(jù)庫。NOCREATEDB是默認(rèn)值。 |
| CREATEROLE | NOCREATEROLE 決定該角色是否被允許創(chuàng)建和管理其他角色。NOCREATEROLE是默認(rèn)值。 |
| INHERIT | NOINHERIT 決定一個角色是否從它的父角色繼承特權(quán)。一個帶有INHERIT屬性的角色可以自動地使用授予給其所有直接父角色以及間接父角色的任何數(shù)據(jù)庫特權(quán)。INHERIT是默認(rèn)值。 |
| LOGIN | NOLOGIN 決定一個角色是否被允許登入。一個帶有LOGIN屬性的角色可以被認(rèn)為是一個用戶。沒有這個屬性的角色對于管理數(shù)據(jù)庫特權(quán)有用(組)。NOLOGIN是默認(rèn)值。 |
| CONNECTION LIMIT connlimit | 如果角色能夠登入,這指定該角色能建立多少并發(fā)連接。-1(默認(rèn))表示沒有限制。 |
| CREATEEXTTABLE 及NOCREATEEXTTABLE | 決定一個角色是否被允許創(chuàng)建外部表。NOCREATEEXTTABLE是默認(rèn)值。對于一個帶有CREATEEXTTABLE屬性的角色,默認(rèn)的外部表類型是readable,而默認(rèn)的協(xié)議是gpfdist。注意使用file或execute協(xié)議的外部表只能由超級用戶創(chuàng)建。 |
| PASSWORD | ‘password’ 設(shè)置角色的口令。如果沒有計劃使用口令認(rèn)證則可以省略這個選項。如果沒有指定口令,口令將被設(shè)置為空并且該用戶的口令認(rèn)證總是會失敗。也可以有選擇地使用PASSWORD NULL顯式地寫入一個空口令。 |
| ENCRYPTED 及 UNENCRYPTED | 控制新口令是否在pg_authid系統(tǒng)目錄中存儲為一個哈希字符串。如果既沒有指定ENCRYPTED也沒有指定UNENCRYPTED,默認(rèn)行為由password_encryption配置參數(shù)決定,這個參數(shù)默認(rèn)是on。 |
| VALID UNTIL ‘timestamp’ | 設(shè)置一個日期和時間,在此之后該角色的口令不再有效。如果省略,則口令將會永久有效。 |
| RESOURCE QUEUE queue_name | 為負(fù)載管理的目的將角色分配到提及的資源隊列。然后該角色發(fā)出的任何語句都服從于該資源隊列的限制。注意RESOURCE QUEUE屬性不會被繼承,必須在每個用戶級(LOGIN)角色上設(shè)置它。 |
| DENY{deny_interval 或 deny_point} | 在一個間隔期間限制訪問,用日或者日和時間指定。 |
另有最新的角色屬性:resource group,可以查看5.0版本后的官方文檔。
角色的成員關(guān)系
將用戶組織在一起以簡化對象特權(quán)的管理常常會很方便:那樣,特權(quán)可以被授予給一個組整體或者從一個組整體收回。在Greenplum數(shù)據(jù)庫中通過創(chuàng)建一個表示組的角色,然后然后把這個組角色的成員關(guān)系授予給個別用戶角色來實現(xiàn)這一點。
使用SQL命令CREATE ROLE來創(chuàng)建一個新的組角色。例如:
=# CREATE ROLE admin CREATEROLE CREATEDB;一旦組角色存在,用戶就可以使用GRANT和REVOKE命令增加和移除成員(用戶角色)。例如:
=# GRANT admin TO john, sally; =# REVOKE admin FROM bob;為了管理對象特權(quán),用戶接著會把適當(dāng)?shù)臋?quán)限只授予給組級別的角色。然后成員用戶角色會繼承這個組角色的對象特權(quán)。例如:
=# 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絕不會像數(shù)據(jù)庫對象上的普通特權(quán)那樣被繼承。為了使用這些屬性之一,用戶成員必須實際地SET ROLE到一個具有該屬性的特定角色。在上面的例子中,我們把CREATEDB和CREATEROLE給了admin角色。如果sally是admin的成員,她能夠發(fā)出下列命令來奪取其父角色的角色屬性:
=> SET ROLE admin;這樣用戶sally將擁有admin用戶的所有權(quán)限。在執(zhí)行一段時間之后,如果仍然希望將該會話恢復(fù)為原有權(quán)限,可以使用下列恢復(fù)方式之一:
SET ROLE sally; SET ROLE NONE; RESET ROLE;要刪除一個組角色,執(zhí)行DROP ROLE group_role命令即可。然而在刪除該組角色之后,它與其成員角色之間的關(guān)系將被立即撤銷(成員角色本身不會受影響)。不過需要注意的是,在刪除之前,任何屬于該組角色的對象都必須先被刪除或者將對象的所有者賦予其它角色,與此同時,任何賦予該組角色的權(quán)限也都必須被撤消。
管理對象特權(quán)
當(dāng)一個對象(表、視圖、序列、數(shù)據(jù)庫、函數(shù)、語言、方案或者表空間)被創(chuàng)建時,它會被分配一個擁有者。擁有者通常是執(zhí)行創(chuàng)建語句的角色。對于大部分類型的對象,初始狀態(tài)是只有擁有者(或者超級用戶)可以對該對象做任何事情。要允許其他角色使用它,必須授予特權(quán)。Greenplum數(shù)據(jù)庫對每種對象類型支持下列特權(quán)(可通過\h grant或\h revoke查看):
| 表、視圖、序列 | SELECT、INSERT、UPDATE、DELETE、RULE、ALL |
| 外部表 | SELECT、RULE、ALL |
| 數(shù)據(jù)庫 | CONNECT、CREATE、TEMPORARY 或TEMP、ALL |
| 函數(shù) | EXECUTE |
| 過程語言 | USAGE |
| 方案 | CREATE、USAGE、ALL |
| 自定義協(xié)議 | SELECT、INSERT、UPDATE、DELETE、RULE、ALL |
注意: 特權(quán)必須被個別地授予給每個對象。例如,在一個數(shù)據(jù)庫上授予ALL并不會授予對該數(shù)據(jù)庫中對象的完全訪問。它只授予所有數(shù)據(jù)庫級別的特權(quán)(CONNECT、CREATE、TEMPORARY)給數(shù)據(jù)庫本身。
使用SQL命令GRANT在一個對象上給予一個指定的角色特權(quán)。例如:
=# GRANT INSERT ON mytable TO jsmith;要收回特權(quán),使用REVOKE命令。例如:
=# REVOKE ALL PRIVILEGES ON mytable FROM jsmith;還可以使用DROP OWNED和REASSIGN OWNED命令來管理棄用角色擁有的對象(注意:只有對象的擁有者或者超級用戶才能刪除對象或者重新分配所有權(quán))。例如:
=# REASSIGN OWNED BY sally TO bob; =# DROP OWNED BY visitor;模擬行和列級訪問控制
不支持行級或者列級訪問控制,也不支持標(biāo)記安全性??梢允褂靡晥D來限制被選擇的列或行來模擬行級和列級訪問。可以對表增加一個額外的列來存儲敏感度信息以模擬行級標(biāo)簽,然后使用視圖基于這一列來控制行級訪問。然后可以為角色授予這些視圖的訪問而不是基表的訪問。
加密數(shù)據(jù)
Greenplum數(shù)據(jù)庫包括一個可選的加密/解密函數(shù)包,名為pgcrypto。pgcrypto函數(shù)允許數(shù)據(jù)庫管理員以加密的形式存儲特定列的數(shù)據(jù)。這增加了一個額外的層來保護(hù)敏感數(shù)據(jù),因為以加密形式存儲在Greenplum數(shù)據(jù)庫中的數(shù)據(jù)不能被任何沒有加密密鑰的人讀取,也不能被直接從磁盤讀取。
注意: pgcrypto函數(shù)在數(shù)據(jù)庫服務(wù)器內(nèi)部運行,這意味著所有的數(shù)據(jù)和口令會以明文在pgcrypto和客戶端應(yīng)用之前移動。為了最好的安全性,也可考慮在客戶端和Greenplum的Master服務(wù)器之間使用SSL連接。
要使用pgcrypto函數(shù),在想要使用這種能力來查詢其他數(shù)據(jù)庫的每個數(shù)據(jù)庫中安裝腳本$GPHOME/share/postgresql/contrib/pgcrypto.sql:
基于時間的認(rèn)證
Greenplum數(shù)據(jù)庫允許管理員限制角色在特定時間的訪問。使用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
總結(jié)
以上是生活随笔為你收集整理的GreenPlum角色与权限控制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nodeJS生成随机token
- 下一篇: 车身域控制