扫一扫
关注微信公众号

创建 DB2 UDB 安全性插件的步骤
2006-12-13   

创建一个 DB2 UDB 安全性插件需要 6 个步骤。下面的几个小节将详细解释每个步骤:

db2secPlugin.h 和 gssapiDB2.h 是实现定制安全性插件所需的两个头文件。只有在构建 GSS-API 插件时才需要 gssapiDB2.h 头文件。图 5 展示了在 Windows 系统上实现安全性插件所需的这两个头文件的位置。


图 5. Windows 系统上插件头文件的位置
Windows 系统上插件头文件的位置

根据创建的是服务器插件、客户机插件还是组插件,需要分别编写以下 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 调用装载后的 db2secServerAuthPluginInit API 来初始化服务器插件库。前面的代码来自文件 txtserver.c,该文件在本文后面附带的 zip 文件中。

除了初始化函数外,还需为服务器、客户机和组插件实现一些插件 API。此外,还有一些用于用户 ID/密码身份验证和用于 GSS-API 身份验证的特定 API。图 6、图 7 和图 8 描述了这些函数的功能。

注意:DB2 UDB 手册有一节详细描述了如何开发安全性插件,并解释了安全性插件 API。那些细节超出了本文的范围。本节只简单地对插件 API 做一个概述。


图 6. 组成员查找插件
组成员查找插件
图 7. 客户机插件
客户机插件
图 8. 服务器插件
服务器插件

函数指针返回指向您实现的特定插件库所需的所有 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;

编写好安全性插件后,根据 DB2 实例将其编译成 32 位或 64 位的文件。库的名称必须与插件名称相同。并且,库必须是有适当的特定于平台的扩展名的共享库。例如,如果插件的名称为 myPlugin,那么应使用下面的扩展名:

库必须是线程安全的(可重入的),并且必须使用 C 链接(至少对初始化函数要使用 C 链接)。

必须将安全性插件库放入特定的目录:

在 Linux 和 UNIX 中,对于 64 位库,也使用与前面类似的目录,只是要使用子目录名 ,而不是 。在 Windows 64 位实例中,32 位和 64 位插件都在相同的目录中,但是 64 位插件将加上后缀 ‘64’,例如 myplugin64.dll。

注意:IBM 子目录(在插件目录下)是为 IBM 提供的缺省插件预留的。放在该目录中的任何其他定制的插件都将被忽略。

在 8.2 版之前, 数据库管理器配置参数指定位置和机制,通过它来执行 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 插件进行身份验证。例如:
一个客户机上可以同时存在多个插件。在这种情况下,服务器将指出使用哪个插件
用受支持的插件名称的有序列表更新 SRVCON_GSSPLUGIN_LIST。为了启用 GSS-API 插件,可以: 为了启用本地授权:

表 6 展示了使用前面列出的配置参数启用 Kerberos 身份验证插件的步骤。


表 6. 启用 Kerberos 插件的步骤

客户机上的步骤 服务器上的步骤
1 将插件库放在客户机插件目录 将插件库放在服务器插件目录
2 用 Kerberos 插件的名称更新 CLNT_KRB_PLUGIN。
用服务器 Kerberos 插件名称更新 SRVCON_GSSPLUGIN_LIST
3 可选:编目一个数据库表明客户机将使用 Kerberos 插件进行身份验证。例如: 将 SRVCON_AUTH 设置为 KERBEROS 或 KRB_SERVER_ENCRYPT,或将 SRVCON_AUTH 设置为 NOT_SPECIFIED 并将 AUTHENTICATION 设置为 KERBEROS 或 KRB_SERVER_ENCRYPT


热词搜索:

上一篇:DB2 UDB 安全性插件概述
下一篇:DB2数据库安全性全面介绍

分享到: 收藏