安全性插件是動(dòng)態(tài)可裝載庫(kù),當(dāng) DB2 UDB 進(jìn)行身份驗(yàn)證或者從組成員中查找某個(gè)用戶的時(shí)候,便調(diào)用這些庫(kù)。在 8.2 版之前,這些操作是由 DB2 UDB 之外的設(shè)施管理的,例如操作系統(tǒng)、域管理器或 Kerberos 安全性系統(tǒng)。圖 1 提供的場(chǎng)景說(shuō)明了在 8.2 版之前 DB2 UDB 安全性的工作原理。下一節(jié)將描述 8.2 版中發(fā)生的變化。
圖 1. 安全性場(chǎng)景
圖 1 說(shuō)明了 4 個(gè)安全性場(chǎng)景:
- 客戶機(jī)系統(tǒng)通過(guò)服務(wù)器系統(tǒng)連接到數(shù)據(jù)庫(kù)時(shí)的安全性考慮。
在圖 1 左側(cè),一個(gè)用戶在 DB2 客戶機(jī)系統(tǒng)的命令行處理程序(CLP)窗口中發(fā)出了語(yǔ)句connect to mydb user raul using raulpsw
,以連接到位于 DB2 數(shù)據(jù)庫(kù)服務(wù)器Aries
上的數(shù)據(jù)庫(kù)mydb
。DB2 客戶機(jī)與服務(wù)器通信,協(xié)商采用何種身份驗(yàn)證方法。為簡(jiǎn)單起見(jiàn),我們假設(shè)客戶機(jī)使用服務(wù)器返回的身份驗(yàn)證方法。在圖中,AUTHENTICATION 被設(shè)置為 SERVER。這意味著,服務(wù)器(I)上的操作系統(tǒng)將通過(guò)檢查提供的用戶 ID 和密碼是否與存儲(chǔ)在操作系統(tǒng)安全性數(shù)據(jù)庫(kù)中的值匹配,來(lái)進(jìn)行身份驗(yàn)證。一旦用戶通過(guò)身份驗(yàn)證,DB2 將從操作系統(tǒng)獲得組成員信息。從此以后,DB2 不再在以后的檢查中使用用戶 ID 或密碼;相反,DB2 將使用授權(quán) ID(authID)。通常,authID 是用戶 ID 的大寫(xiě)版本。 - 連接到數(shù)據(jù)庫(kù)之后執(zhí)行 SQL 語(yǔ)句時(shí)的安全性考慮。
圖 1 的左下部分展示了一條 SELECT 語(yǔ)句,該語(yǔ)句是在以 authIDRAUL
連接到數(shù)據(jù)庫(kù)mydb
的情況下發(fā)出的。在這個(gè)例子中,內(nèi)部的 DB2 安全性設(shè)施審核 DB2 編目表,以確認(rèn) authIDRAUL
被授予對(duì)表KEVIN.TABLE1
執(zhí)行 SELECT 操作的權(quán)限,以此來(lái)執(zhí)行授權(quán)(authorization) 檢查。如果 authIDRAUL
和 PUBLIC 沒(méi)有被授予這種權(quán)限,DB2 將檢查該用戶是否為幾個(gè)特殊的組(例如 SYSADM、SYSCTRL、SYSMAINT 或 SYSMON)的成員。對(duì)于這些組中的每一個(gè)組,都有數(shù)據(jù)庫(kù)管理器配置(dbm cfg)參數(shù),可以將這些參數(shù)設(shè)置為一個(gè)操作系統(tǒng)組的值。在連接時(shí),DB2 從操作系統(tǒng)中獲取用戶的組信息,并緩存在內(nèi)存中。然后,DB2 審核這個(gè)緩存的數(shù)據(jù)(II),以檢查 authIDRAUL
是否為這些組中某個(gè)組的成員。例如,如果 authID 是 SYSADM 組的成員,那么 SELECT 可以繼續(xù),否則將返回一條錯(cuò)誤消息(SQLCODE -551)。 - 在客戶機(jī)實(shí)施安全性時(shí)的安全性考慮。
在圖 1 中,如果 AUTHENTICATION 被設(shè)置為 CLIENT,那么客戶機(jī)上的操作系統(tǒng)將實(shí)施身份驗(yàn)證(III)。對(duì)于 SELECT 語(yǔ)句的授權(quán)檢查將如前面所說(shuō)的一樣進(jìn)行:DB2 從數(shù)據(jù)庫(kù)的 DB2 編目表中檢驗(yàn) authIDRAUL
是否有對(duì)KEVIN.TABLE1
表的 SELECT 權(quán)限。如果 authIDRAUL
和 PUBLIC 沒(méi)有該權(quán)限,將進(jìn)行組成員檢查。在連接時(shí),DB2 從客戶機(jī)獲得組成員信息,并緩存在服務(wù)器上。 - 發(fā)出實(shí)例級(jí)命令時(shí)的安全性考慮。
在圖 1 中的服務(wù)器上,DB2 實(shí)例所有者db2inst1
發(fā)出命令 db2stop。DB2 檢查當(dāng)前登錄進(jìn)來(lái)的用戶是否屬于 SYSADM_GROUP、SYSCTRL_GROUP 或 SYSMAINT_GROUP 中定義的組。(IV)如果用戶 ID 屬于以上任何一個(gè)組,那么 db2stop 命令將得以執(zhí)行。否則,將返回一條錯(cuò)誤消息。取決于實(shí)例級(jí)操作,用戶可能必須屬于 SYSADM、SYSCTRL、SYSMAINT 或 SYSMON 中的一個(gè)組。
在以上每個(gè)場(chǎng)景中,都調(diào)用了操作系統(tǒng)來(lái)進(jìn)行安全性檢查。而從 8.2 版開(kāi)始,以上每種情況都可以使用安全性插件。因而,不必總是調(diào)用操作系統(tǒng),在場(chǎng)景 1 中可以調(diào)用服務(wù)器和組插件,在場(chǎng)景 2 中可以調(diào)用組插件,在場(chǎng)景 3 和場(chǎng)景 4 中可以調(diào)用客戶機(jī)和組插件。
這個(gè)例子介紹了三種類(lèi)型的安全性插件:
- 服務(wù)器端身份驗(yàn)證安全性插件(即服務(wù)器身份驗(yàn)證插件)
- 客戶端身份驗(yàn)證安全性插件(即客戶機(jī)身份驗(yàn)證插件)
- 組成員查找安全性插件(即組插件)
服務(wù)器身份驗(yàn)證插件在數(shù)據(jù)庫(kù)服務(wù)器上執(zhí)行身份驗(yàn)證。它還用于檢查一個(gè) authID 是否為插件所知。例如,考慮 SQL 語(yǔ)句 grant select on table user1.t1 to FOO
,DB2 不知道 FOO 是用戶還是組。在這種情況下,DB2 詢問(wèn)所有服務(wù)器端插件和組成員插件,以檢查 FOO 是用戶還是組,或者兩者都是,或者無(wú)法確定,從而可以對(duì)該 SQL 語(yǔ)句作出響應(yīng)。
客戶機(jī)身份驗(yàn)證插件在客戶機(jī)上執(zhí)行身份驗(yàn)證。在執(zhí)行實(shí)例級(jí)命令(例如 db2start
、db2stop
、db2trc
、update dbm cfg
等)時(shí),它還用于執(zhí)行實(shí)例級(jí)本地授權(quán)。因此,常常可以看到在一個(gè)數(shù)據(jù)庫(kù)服務(wù)器上同時(shí)指定了客戶機(jī)身份驗(yàn)證插件和服務(wù)器身份驗(yàn)證插件。
組插件在客戶機(jī)和數(shù)據(jù)庫(kù)服務(wù)器上執(zhí)行組成員查找。它還用于檢查一個(gè) authID 是否為插件所知。
每個(gè)安全性插件由一組 API 組成,需要實(shí)現(xiàn)這些 API。DB2 提供安全性插件基礎(chǔ)設(shè)施和一些缺省的安全性插件。定制的安全性插件的實(shí)現(xiàn)則有待您來(lái)決定。