欢迎投稿

今日深度:

创建 DB2 UDB 安全性插件的步骤

创建 DB2 UDB 安全性插件的步骤


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

  1. 将安全性插件的头文件包括到插件中:
    • sqllib/include/db2secPlugin.h
    • sqllib/include/gssapiDB2.h
      注意:只有在实现基于 GSS-API 的安全性插件时才需要 gssapiDB2.h。
  2. 编写组成插件的 API。需要编写一个适当的初始化 API 和服务器、客户机或组插件所需的其他一些 API。
  3. 在返回 DB2 之前填充函数指针结构。
    • 指出插件使用的插件 API 版本。
    • 指出插件类型,例如用户 ID/密码、GSS-API、Kerberos。
  4. 编译插件源代码,并创建一个共享库。根据应用程序/服务器实例,编译为 32 位或 64 位。
  5. 将这个库放在适当的目录中。
  6. 通过更新数据库管理器参数,启用插件。

步骤 1:将安全性插件头文件包括到插件中

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


图 5. Windows 系统上插件头文件的位置
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 描述了这些函数的功能。

注意:DB2 UDB 手册有一节详细描述了如何开发安全性插件,并解释了安全性插件 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.dllWindows)
  • myPlugin.aAIX)
  • myPlugin.soLinux、AIX、Sun Solaris、HP-UX)
  • myPlugin.slHP-UX)

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

步骤 5:将库放入适当的目录

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

  1. 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
  2. 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 插件,可以:
  • 将 SRVCON_AUTH 设置为 GSSPLUGIN,或者
  • 将 SRVCON_AUTH 设置为 NOT_SPECIFIED,并将 AUTHENTICATION 设置为 GSSPLUGIN。
为了启用本地授权:
  1. 将客户机插件库放入客户机插件目录。
  2. 用插件名称更新 LOCAL_GSSPLUGIN。

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


表 6. 启用 Kerberos 插件的步骤

客户机上的步骤 服务器上的步骤
1 将插件库放在客户机插件目录 将插件库放在服务器插件目录
2 用 Kerberos 插件的名称更新 CLNT_KRB_PLUGIN。
  • 如果 CLNT_KRB_PLUGIN 为空,那么 DB2 认为客户机不能使用 Kerberos。
  • DB2 提供的缺省 Kerberos 插件被命名为 IBMkrb5。
  • 对于支持 Kerberos 的平台,IBMkrb5 库已经在客户机插件目录中。
用服务器 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

www.htsjk.Com true http://www.htsjk.com/shujukuaq/16873.html NewsArticle 创建 DB2 UDB 安全性插件的步骤 创建一个 DB2 UDB 安全性插件需要 6 个步骤。下面的几个小节将详细解释每个步骤: 将安全性插件的头文件包括到插件中: sqllib/include/ db2secPlugin.h sqllib/i...
评论暂时关闭