創(chuàng)建一個(gè) DB2 UDB 安全性插件需要 6 個(gè)步驟。下面的幾個(gè)小節(jié)將詳細(xì)解釋每個(gè)步驟:
db2secPlugin.h 和 gssapiDB2.h 是實(shí)現(xiàn)定制安全性插件所需的兩個(gè)頭文件。只有在構(gòu)建 GSS-API 插件時(shí)才需要 gssapiDB2.h 頭文件。圖 5 展示了在 Windows 系統(tǒng)上實(shí)現(xiàn)安全性插件所需的這兩個(gè)頭文件的位置。
圖 5. Windows 系統(tǒng)上插件頭文件的位置
根據(jù)創(chuàng)建的是服務(wù)器插件、客戶機(jī)插件還是組插件,需要分別編寫以下 API 來初始化插件:
例如,可以這樣編寫 db2secServerAuthPluginInit API:
清單 1. db2secServerAuthPluginInit
SQL_API_RC SQL_API_FN db2secServerAuthPluginInit(
db2int32 version,
void* server_fns,
db2secGetConDetails* getConDetails_fn,
db2secLogMessage* logMessage_fn,
char** errormsg,
db2int32* errormsglen)
{
struct userid_password_server_auth_functions_1
*fns = (struct userid_password_server_auth_functions_1*) server_fns;
condetails_fn = getConDetails_fn;
logMessage_Fn = logMessage_fn;
fns->version = DB2SEC_API_VERSION;
fns->plugintype = DB2SEC_PLUGIN_TYPE_USERID_PASSWORD;
fns->db2secDoesAuthIDExist = &is_user;
fns->db2secFreeErrormsg = &free_error_message;
fns->db2secFreeToken = &free_token;
fns->db2secGetAuthIDs = &getauthids;
fns->db2secServerAuthPluginTerm = &terminate_plugin;
fns->db2secValidatePassword = &validatePassword;
/* Example on how to use logMessage_fn */
/* Will log the init successful information into db2diag.log at DIAGLEVEL 3 */
(logMessage_Fn)(DB2SEC_LOG_WARNING,
"db2secServerAuthPluginInit successful",
strlen("db2secServerAuthPluginInit successful"));
return DB2SEC_PLUGIN_OK;
} |
DB2 調(diào)用裝載后的 db2secServerAuthPluginInit API 來初始化服務(wù)器插件庫。前面的代碼來自文件 txtserver.c,該文件在本文后面附帶的 zip 文件中。
除了初始化函數(shù)外,還需為服務(wù)器、客戶機(jī)和組插件實(shí)現(xiàn)一些插件 API。此外,還有一些用于用戶 ID/密碼身份驗(yàn)證和用于 GSS-API 身份驗(yàn)證的特定 API。圖 6、圖 7 和圖 8 描述了這些函數(shù)的功能。
注意:DB2 UDB 手冊(cè)有一節(jié)詳細(xì)描述了如何開發(fā)安全性插件,并解釋了安全性插件 API。那些細(xì)節(jié)超出了本文的范圍。本節(jié)只簡(jiǎn)單地對(duì)插件 API 做一個(gè)概述。
圖 6. 組成員查找插件
圖 7. 客戶機(jī)插件
圖 8. 服務(wù)器插件
函數(shù)指針返回指向您實(shí)現(xiàn)的特定插件庫所需的所有 API 的指針。例如,對(duì)于組插件,它包含指向 db2secDoesGroupExist、db2secFreeErrormsg、db2secFreeGroupListMemory、db2secGetGroupsForUser 和 db2secPluginTerm API 的實(shí)現(xiàn)的指針。
本文后面附帶的 zip 文件中的 txtgroup.c 文件提供了一個(gè)例子,演示如何填充組插件庫的函數(shù)指針。下面是該代碼的一個(gè)片段。
fns->version = DB2SEC_API_VERSION; fns->db2secDoesGroupExist = &is_group; fns->db2secFreeErrormsg = &free_error_message; fns->db2secFreeGroupListMemory = &free_group_list; fns->db2secGetGroupsForUser = &get_groups; fns->db2secPluginTerm = &terminate_plugin; |
編寫好安全性插件后,根據(jù) DB2 實(shí)例將其編譯成 32 位或 64 位的文件。庫的名稱必須與插件名稱相同。并且,庫必須是有適當(dāng)?shù)奶囟ㄓ谄脚_(tái)的擴(kuò)展名的共享庫。例如,如果插件的名稱為 myPlugin,那么應(yīng)使用下面的擴(kuò)展名:
庫必須是線程安全的(可重入的),并且必須使用 C 鏈接(至少對(duì)初始化函數(shù)要使用 C 鏈接)。
必須將安全性插件庫放入特定的目錄:
在 Linux 和 UNIX 中,對(duì)于 64 位庫,也使用與前面類似的目錄,只是要使用子目錄名 ,而不是 。在 Windows 64 位實(shí)例中,32 位和 64 位插件都在相同的目錄中,但是 64 位插件將加上后綴 ‘64’,例如 myplugin64.dll。
注意:IBM 子目錄(在插件目錄下)是為 IBM 提供的缺省插件預(yù)留的。放在該目錄中的任何其他定制的插件都將被忽略。
在 8.2 版之前, 數(shù)據(jù)庫管理器配置參數(shù)指定位置和機(jī)制,通過它來執(zhí)行 CONNECT/ATTACH、組查詢和本地授權(quán)檢查。而在 8.2 版中有更多的配置參數(shù),從而為選擇身份驗(yàn)證選項(xiàng)提供了更大的靈活性。
表 2 提供了應(yīng)用于插件的數(shù)據(jù)庫管理器配置參數(shù)列表,并解釋了它們?nèi)绾螒?yīng)用于安全性插件。
表 2. 安全性插件數(shù)據(jù)庫管理器配置參數(shù)描述
| 參數(shù)名 | 描述 | |
|---|---|---|
| 1 | 客戶機(jī)用戶 ID/密碼插件(CLNT_PW_PLUGIN) | 如果這個(gè)值是在客戶機(jī)上設(shè)置的,并且服務(wù)器上的 AUTHENTICATION 參數(shù)被設(shè)置為 CLIENT,那么該參數(shù)指定用于在客戶機(jī)上執(zhí)行的身份驗(yàn)證的用戶 ID/密碼插件。如果這個(gè)值是在服務(wù)器上設(shè)置的,那么該參數(shù)指定用于實(shí)例操作(例如 db2start)授權(quán)檢查的用戶 ID/密碼插件。在數(shù)據(jù)庫服務(wù)器上本地發(fā)出的數(shù)據(jù)庫連接(本地連接)期間,也可以在數(shù)據(jù)庫服務(wù)器上使用客戶端插件 |
| 2 | 客戶機(jī) Kerberos 插件(CLNT_KRB_PLUGIN) | 該參數(shù)的值指定用于客戶端身份驗(yàn)證和本地授權(quán)的 Kerberos 插件庫的名稱。當(dāng)使用 KERBEROS 或 KRB_SERVER_ENCRYPT 身份驗(yàn)證對(duì)客戶機(jī)進(jìn)行身份驗(yàn)證時(shí),將使用該插件。在 Windows 上缺省值是 IBMkrb5。在其他平臺(tái)上,缺省值是 NULL |
| 3 | 組插件(GROUP_PLUGIN) | 該參數(shù)的值指定用于組成員查找的組插件庫 |
| 4 | 用于本地授權(quán)的 GSS-API 插件(LOCAL_GSSPLUGIN) | 當(dāng)數(shù)據(jù)庫管理器配置參數(shù) AUTHENTICATION 的值被設(shè)置為 GSSPLUGIN 或 GSS_SERVER_ENCRYPT 時(shí),該參數(shù)的值指定用于實(shí)例級(jí)本地授權(quán)的 GSS-API 插件庫的名稱。 GSSPLUGIN 表明服務(wù)器將只使用基于它熟悉的 GSS-API 插件進(jìn)行身份驗(yàn)證。 GSSPLUGIN_SERVER_ENCRYPT 表明服務(wù)器將另外接受加密的用戶 ID/密碼請(qǐng)求。這種類型主要是為向下兼容而提供的 |
| 5 | 服務(wù)器插件模式(SRV_PLUGIN_MODE) | 該參數(shù)指定以 fenced 還是 unfenced 模式運(yùn)行。缺省值(惟一受支持的值)是 UNFENCED |
| 6 | 服務(wù)器 GSS-API 插件列表(SRVCON_GSSPLUGIN_LIST) | 該參數(shù)指定數(shù)據(jù)庫服務(wù)器支持的 GSS-API 插件庫的列表,列表中以逗號(hào)作為分隔符。這個(gè)列表只能包含一個(gè) Kerberos 插件。如果該參數(shù)值沒有設(shè)置,并且 AUTHENTICATION 被設(shè)置為 KERBEROS 或 KRB_SVR_ENCRYPT,那么將使用缺省的 DB2 Kerberos 插件(IBMkrb5) |
| 7 | 服務(wù)器用戶 ID/密碼插件(SRVCON_PW_PLUGIN) | 該參數(shù)的值指定用于服務(wù)器端身份驗(yàn)證的用戶 ID/密碼插件庫 |
| 8 | 服務(wù)器連接身份驗(yàn)證(SRVCON_AUTH) | 該參數(shù)的值只用于連接。它覆蓋 AUTHENTICATION 中指定的身份驗(yàn)證方法。本地實(shí)例操作仍使用 AUTHENTICATION 中指定的操作。缺省值是 NOT_SPECIFIED |
| 9 | 數(shù)據(jù)庫管理器身份驗(yàn)證(AUTHENTICATION) | 該參數(shù)的值指定為了檢查本地實(shí)例授權(quán),用戶身份驗(yàn)證如何進(jìn)行,在哪里進(jìn)行。缺省值是 SERVER |
表 3 展示了使用前面列出的配置參數(shù)啟用用戶 ID/密碼身份驗(yàn)證插件的步驟。
表 3. 啟用用戶 ID/密碼身份驗(yàn)證插件的步驟
| 客戶機(jī)上的步驟 | 服務(wù)器上的步驟 | |
|---|---|---|
| 1 | 用客戶機(jī)插件的名稱更新 CLNT_PW_PLUGIN。 如果 CLNT_PW_PLUGIN 為空,那么將使用它的缺省值 IBMOSauthclient,這是 IBM 提供的插件 |
用服務(wù)器插件的名稱更新 SRVCON_PW_PLUGIN |
| 2 | 將 SRVCON_AUTH 設(shè)置為一種系統(tǒng)身份驗(yàn)證類型(CLIENT、SERVER、SERVER_ENCRYPT、DATA_ENCRYPT 或 DATA_ENCRYPT_CMP),或?qū)?SRVCON_AUTH 設(shè)置為 NOT_SPECIFIED 并將 AUTHENTICATION 設(shè)置為一種系統(tǒng)身份驗(yàn)證類型。 如果 SRVCON_PW_PLUGIN 為空,那么將使用它的缺省值 IBMOSauthserver,這是 IBM 提供的插件 |
表 4 展示了使用前面列出的配置參數(shù)啟用組成員查找插件的步驟。
表 4. 啟用組成員查找插件的步驟
| 客戶機(jī)上的步驟 | 服務(wù)器上的步驟 | |
|---|---|---|
| 1 | 用組插件的名稱更新 GROUP_PLUGIN。 如果 GROUP_PLUGIN 為空,那么將使用它的缺省值 IBMOSgroups,這是 IBM 提供的插件 |
用組插件的名稱更新 GROUP_PLUGIN。 如果 GROUP_PLUGIN 為空,那么將使用它的缺省值 IBMOSgroups,這是 IBM 提供的插件 |
表 5 展示了使用前面列出的配置參數(shù)啟用 GSS-API 身份驗(yàn)證插件的步驟。
表 5. 啟用 GSS-API 身份驗(yàn)證插件的步驟
| 客戶機(jī)上的步驟 |
服務(wù)器上的步驟 | |
|---|---|---|
| 1 | 將插件庫放在客戶機(jī)插件目錄中 | 將插件庫放在服務(wù)器插件目錄中 |
| 2 | 可選:編目(catalog)一個(gè)數(shù)據(jù)庫表明客戶機(jī)將只使用一個(gè) GSS-API 插件進(jìn)行身份驗(yàn)證。例如:。 一個(gè)客戶機(jī)上可以同時(shí)存在多個(gè)插件。在這種情況下,服務(wù)器將指出使用哪個(gè)插件 |
用受支持的插件名稱的有序列表更新 SRVCON_GSSPLUGIN_LIST。為了啟用 GSS-API 插件,可以: 為了啟用本地授權(quán): |
表 6 展示了使用前面列出的配置參數(shù)啟用 Kerberos 身份驗(yàn)證插件的步驟。
表 6. 啟用 Kerberos 插件的步驟
| 客戶機(jī)上的步驟 | 服務(wù)器上的步驟 | |
|---|---|---|
| 1 | 將插件庫放在客戶機(jī)插件目錄 | 將插件庫放在服務(wù)器插件目錄 |
| 2 | 用 Kerberos 插件的名稱更新 CLNT_KRB_PLUGIN。 |
用服務(wù)器 Kerberos 插件名稱更新 SRVCON_GSSPLUGIN_LIST |
| 3 | 可選:編目一個(gè)數(shù)據(jù)庫表明客戶機(jī)將使用 Kerberos 插件進(jìn)行身份驗(yàn)證。例如: |
將 SRVCON_AUTH 設(shè)置為 KERBEROS 或 KRB_SERVER_ENCRYPT,或?qū)?SRVCON_AUTH 設(shè)置為 NOT_SPECIFIED 并將 AUTHENTICATION 設(shè)置為 KERBEROS 或 KRB_SERVER_ENCRYPT |


