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