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