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