扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
创建一个 DB2 UDB 安全性插件需要 6 个步骤。下面的几个小节将详细解释每个步骤:
将安全性插件的头文件包括到插件中:
sqllib/include/db2secPlugin.h
sqllib/include/gssapiDB2.h
注意:只有在实现基于 GSS-API 的安全性插件时才需要 gssapiDB2.h。
编写组成插件的 API。需要编写一个适当的初始化 API 和服务器、客户机或组插件所需的其他一些 API。
在返回 DB2之前填充函数指针结构。
指出插件使用的插件 API 版本。
指出插件类型,例如用户 ID/密码、GSS-API、Kerberos。
编译插件源代码,并创建一个共享库。根据应用程序/服务器实例,编译为 32 位或 64 位。
将这个库放在适当的目录中。
通过更新数据库管理器参数,启用插件。
步骤 1:将安全性插件头文件包括到插件中
db2secPlugin.h 和 gssapiDB2.h 是实现定制安全性插件所需的两个头文件。只有在构建 GSS-API 插件时才需要 gssapiDB2.h 头文件。图 5 展示了在 Windows 系统上实现安全性插件所需的这两个头文件的位置。
图 5. Windows 系统上插件头文件的位置
步骤 2:编写组成插件的 API
根据创建的是服务器插件、客户机插件还是组插件,需要分别编写以下 API 来初始化插件:
db2secServerAuthPluginInit
db2secClientAuthPluginInit
db2secGroupPluginInit
例如,可以这样编写 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调用装载后的 db2secServerAuthPluginInit API 来初始化服务器插件库。前面的代码来自文件 txtserver.c,该文件在本文后面附带的 zip 文件中。
除了初始化函数外,还需为服务器、客户机和组插件实现一些插件 API。此外,还有一些用于用户 ID/密码身份验证和用于 GSS-API 身份验证的特定 API。图 6、图 7 和图 8 描述了这些函数的功能。
注意:DB2UDB 手册有一节详细描述了如何开发安全性插件,并解释了安全性插件 API。那些细节超出了本文的范围。本节只简单地对插件 API 做一个概述。
图 6. 组成员查找插件
图 7. 客户机插件
图 8. 服务器插件
步骤 3:在返回 DB2之前填充函数指针结构
函数指针返回指向您实现的特定插件库所需的所有 API 的指针。例如,对于组插件,它包含指向 db2secDoesGroupExist、db2secFreeErrormsg、db2secFreeGroupListMemory、db2secGetGroupsForUser 和 db2secPluginTerm API 的实现的指针。
本文后面附带的 zip 文件中的 txtgroup.c 文件提供了一个例子,演示如何填充组插件库的函数指针。下面是该代码的一个片段。
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;
步骤 4:编译插件源代码并创建一个共享库
编写好安全性插件后,根据 DB2实例将其编译成 32 位或 64 位的文件。库的名称必须与插件名称相同。并且,库必须是有适当的特定于平台的扩展名的共享库。例如,如果插件的名称为 myPlugin,那么应使用下面的扩展名:
myPlugin.dll(Windows)
myPlugin.a(AIX)
myPlugin.so(Linux、AIX、Sun Solaris、HP-UX)
myPlugin.sl(HP-UX)
库必须是线程安全的(可重入的),并且必须使用 C 链接(至少对初始化函数要使用 C 链接)。
步骤 5:将库放入适当的目录
必须将安全性插件库放入特定的目录:
Windows:
sqllib\security\plugin\<instance name>\client
sqllib\security\plugin\<instance name>\server
sqllib\security\plugin\<instance name>\group
对于 IBM 提供的缺省插件:
sqllib\security\plugin\IBM\client
sqllib\security\plugin\IBM\server
sqllib\security\plugin\IBM\group
32 位 Linux 和 UNIX:
sqllib/security32/plugin/client
sqllib/security32/plugin/server
sqllib/security32/plugin/group
对于 IBM 提供的缺省插件:
sqllib/security32/plugin/IBM/client
sqllib/security32/plugin/IBM/server
sqllib/security32/plugin/IBM/group
在 Linux 和 UNIX 中,对于 64 位库,也使用与前面类似的目录,只是要使用子目录名 security64,而不是 security32。在 Windows 64 位实例中,32 位和 64 位插件都在相同的目录中,但是 64 位插件将加上后缀 ‘64’,例如 myplugin64.dll。
注意:IBM 子目录(在插件目录下)是为 IBM 提供的缺省插件预留的。放在该目录中的任何其他定制的插件都将被忽略。
步骤 6:通过更新数据库管理器参数启用插件
在 8.2 版之前,authentication数据库管理器配置参数指定位置和机制,通过它来执行 CONNECT/ATTACH、组查询和本地授权检查。而在 8.2 版中有更多的配置参数,从而为选择身份验证选项提供了更大的灵活性。
表 2 提供了应用于插件的数据库管理器配置参数列表,并解释了它们如何应用于安全性插件。
表 2. 安全性插件数据库管理器配置参数描述
参数名 | 描述 | |
---|---|---|
1 | 客户机用户 ID/密码插件(CLNT_PW_PLUGIN) | 如果这个值是在客户机上设置的,并且服务器上的 AUTHENTICATION 参数被设置为 CLIENT,那么该参数指定用于在客户机上执行的身份验证的用户 ID/密码插件。如果这个值是在服务器上设置的,那么该参数指定用于实例操作(例如 db2start)授权检查的用户 ID/密码插件。在数据库服务器上本地发出的数据库连接(本地连接)期间,也可以在数据库服务器上使用客户端插件 |
2 | 客户机 Kerberos 插件(CLNT_KRB_PLUGIN) | 该参数的值指定用于客户端身份验证和本地授权的 Kerberos 插件库的名称。当使用 KERBEROS 或 KRB_SERVER_ENCRYPT 身份验证对客户机进行身份验证时,将使用该插件。在 Windows 上缺省值是 IBMkrb5。在其他平台上,缺省值是 NULL |
3 | 组插件(GROUP_PLUGIN) | 该参数的值指定用于组成员查找的组插件库 |
4 | 用于本地授权的 GSS-API 插件(LOCAL_GSSPLUGIN) | 当数据库管理器配置参数 AUTHENTICATION 的值被设置为 GSSPLUGIN 或 GSS_SERVER_ENCRYPT 时,该参数的值指定用于实例级本地授权的 GSS-API 插件库的名称。 GSSPLUGIN 表明服务器将只使用基于它熟悉的 GSS-API 插件进行身份验证。 GSSPLUGIN_SERVER_ENCRYPT 表明服务器将另外接受加密的用户 ID/密码请求。这种类型主要是为向下兼容而提供的 |
5 | 服务器插件模式(SRV_PLUGIN_MODE) | 该参数指定以 fenced 还是 unfenced 模式运行。缺省值(惟一受支持的值)是 UNFENCED |
6 | 服务器 GSS-API 插件列表(SRVCON_GSSPLUGIN_LIST) | 该参数指定数据库服务器支持的 GSS-API 插件库的列表,列表中以逗号作为分隔符。这个列表只能包含一个 Kerberos 插件。如果该参数值没有设置,并且 AUTHENTICATION 被设置为 KERBEROS 或 KRB_SVR_ENCRYPT,那么将使用缺省的 DB2 Kerberos 插件(IBMkrb5) |
7 | 服务器用户 ID/密码插件(SRVCON_PW_PLUGIN) | 该参数的值指定用于服务器端身份验证的用户 ID/密码插件库 |
8 | 服务器连接身份验证(SRVCON_AUTH) | 该参数的值只用于连接。它覆盖 AUTHENTICATION 中指定的身份验证方法。本地实例操作仍使用 AUTHENTICATION 中指定的操作。缺省值是 NOT_SPECIFIED |
9 | 数据库管理器身份验证(AUTHENTICATION) | 该参数的值指定为了检查本地实例授权,用户身份验证如何进行,在哪里进行。缺省值是 SERVER |
表 3 展示了使用前面列出的配置参数启用用户 ID/密码身份验证插件的步骤。
表 3. 启用用户 ID/密码身份验证插件的步骤
客户机上的步骤 | 服务器上的步骤 | |
---|---|---|
1 | 用客户机插件的名称更新 CLNT_PW_PLUGIN。 如果 CLNT_PW_PLUGIN 为空,那么将使用它的缺省值 IBMOSauthclient,这是 IBM 提供的插件 |
用服务器插件的名称更新 SRVCON_PW_PLUGIN |
2 | 将 SRVCON_AUTH 设置为一种系统身份验证类型(CLIENT、SERVER、SERVER_ENCRYPT、DATA_ENCRYPT 或 DATA_ENCRYPT_CMP),或将 SRVCON_AUTH 设置为 NOT_SPECIFIED 并将 AUTHENTICATION 设置为一种系统身份验证类型。 如果 SRVCON_PW_PLUGIN 为空,那么将使用它的缺省值 IBMOSauthserver,这是 IBM 提供的插件 |
表 4 展示了使用前面列出的配置参数启用组成员查找插件的步骤。
表 4. 启用组成员查找插件的步骤
客户机上的步骤 | 服务器上的步骤 | |
---|---|---|
1 | 用组插件的名称更新 GROUP_PLUGIN。 如果 GROUP_PLUGIN 为空,那么将使用它的缺省值 IBMOSgroups,这是 IBM 提供的插件 |
用组插件的名称更新 GROUP_PLUGIN。 如果 GROUP_PLUGIN 为空,那么将使用它的缺省值 IBMOSgroups,这是 IBM 提供的插件 |
表 5 展示了使用前面列出的配置参数启用 GSS-API 身份验证插件的步骤。
表 5. 启用 GSS-API 身份验证插件的步骤
客户机上的步骤 |
服务器上的步骤 | |
---|---|---|
1 | 将插件库放在客户机插件目录中 | 将插件库放在服务器插件目录中 |
2 | 可选:编目(catalog)一个数据库表明客户机将只使用一个 GSS-API 插件进行身份验证。例如:db2 catalog db testdb at node testnode authentication gssplugin 。 一个客户机上可以同时存在多个插件。在这种情况下,服务器将指出使用哪个插件 |
用受支持的插件名称的有序列表更新 SRVCON_GSSPLUGIN_LIST。为了启用 GSS-API 插件,可以:
|
表 6 展示了使用前面列出的配置参数启用 Kerberos 身份验证插件的步骤。
表 6. 启用 Kerberos 插件的步骤
客户机上的步骤 | 服务器上的步骤 | |
---|---|---|
1 | 将插件库放在客户机插件目录 | 将插件库放在服务器插件目录 |
2 | 用 Kerberos 插件的名称更新 CLNT_KRB_PLUGIN。
|
用服务器 Kerberos 插件名称更新 SRVCON_GSSPLUGIN_LIST |
3 | 可选:编目一个数据库表明客户机将使用 Kerberos 插件进行身份验证。例如:db2 catalog db testdb at node testnode authentication kerberos target principal service/host@REALM |
将 SRVCON_AUTH 设置为 KERBEROS 或 KRB_SERVER_ENCRYPT,或将 SRVCON_AUTH 设置为 NOT_SPECIFIED 并将 AUTHENTICATION 设置为 KERBEROS 或 KRB_SERVER_ENCRYPT |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者