Db2 简明教程

DB2 - LDAP

Introduction

LDAP 是轻量级目录访问协议。LDAP 是一个基于客户端-服务器模型且在 TCP/IP 栈上层运行的全局目录服务行业标准协议。LDAP 提供了一个连接、访问、修改和搜索 Internet 目录的工具。

LDAP 服务器包含信息,这些信息以目录树的形式组织。客户端要求服务器提供信息或针对特定信息执行某些操作。服务器通过提供所需的(如果有的话)信息来应答客户端,或将客户端转给其他服务器处理所需的请求。然后,客户端从其他服务器获取所需信息。

目录的树形结构在所有参与服务器上始终保持相同。这是 LDAP 目录服务的一个显著特性。因此,无论客户端参考的是哪台服务器,客户端始终会以无差错的方式获取所需信息。这里,我们使用 LDAP 对 IBM DB2 进行认证,以替代操作系统认证。

LDAP 有两种类型:

我们来看看如何配置透明 LDAP。

Configuring transparent LDAP

要开始配置透明 LDAP,您需要配置 LDAP 服务器。

LDAP server configuration

创建一个 SLAPD.conf 文件,其中包含 LDAP 中所有有关用户和组对象的信息。在安装 LDAP 服务器时,默认情况下,它在机器上配置了基本的 LDAP 目录树。

下表指示修改后的文件配置。

以黄色突出显示代码框中的文本表示以下内容:

DBA 用户 ID = “db2my1”,组 = “db1my1adm”,密码 = “db2my1” 管理员用户 ID = “my1adm”,组 = “dbmy1ctl”。

# base dn: example.com
dn: dc=example,dc=com
dc: example
o: example
objectClass: organization
objectClass: dcObject
# pc box db
dn: dc=db697,dc=example,dc=com
dc: db697
o: db697
objectClass: organization
objectClass: dcObject
#
# Group: dbadm
#
dn: cn=dbmy1adm,dc=db697,dc=example,dc=com
cn: dbmy1adm
objectClass: top
objectClass: posixGroup
gidNumber: 400
objectClass: groupOfNames
member: uid=db2my1,cn=dbmy1adm,dc=db697,dc=example,dc=com
memberUid: db2my1
#
# User: db2
#
dn: uid=db2my1,cn=dbmy1adm,dc=db697,dc=example,dc=com
cn: db2my1
sn: db2my1
uid: db2my1
objectClass: top
objectClass: inetOrgPerson
objectClass: posixAccount
uidNumber: 400
gidNumber: 400
loginShell: /bin/csh
homeDirectory: /db2/db2my1
#
# Group: dbctl
#
dn: cn=dbmy1ctl,dc=db697,dc=example,dc=com
cn: dbmy1ctl
objectClass: top
objectClass: posixGroup
gidNumber: 404
objectClass: groupOfNames
member: uid=my1adm,cn=dbmy1adm,dc=db697,dc=example,dc=com
memberUid: my1adm
#
# User: adm
#
dn: uid=my1adm,cn=dbmy1ctl,dc=db697,dc=example,dc=com
cn: my1adm
sn: my1adm
uid: my1adm
objectClass: top
objectClass: inetOrgPerson
objectClass: posixAccount
uidNumber: 404
gidNumber: 404
loginShell: /bin/csh
homeDirectory: /home/my1adm

使用名称“/var/lib/slapd.conf”保存上述文件,然后执行此文件,通过以下命令将这些值添加到 LDAP 服务器中。这是一条 Linux 命令,而不是 db2 命令。

ldapadd r- -D ‘cn=Manager,dc=example,dc=com” –W –f
/var/lib/slapd.conf

在 LDAP 服务器上注册 DB2 用户和 DB2 组后,登录到已安装实例和数据库的特定用户。您需要配置 LDAP 客户端,以向客户端确认您的服务器位于何处(远程或本地)。

LDAP client configuration

LDAP 客户端配置保存在文件“ldap.conf”中。有两个文件可用于配置参数,一个通用,另一个特定。您应该在“/etc/ldap.conf”中找到第一个文件,而另一个位于“/etc/openldap/ldap.conf”中。

通用 LDAP 客户端配置文件中提供了以下数据

# File: /etc/ldap.conf
# The file contains lots of more entries and many of them
# are comments. You show only the interesting values for now
host localhost
base dc=example,dc=com
ldap_version 3
pam_password crypt
pam_filter objectclass=posixAccount
nss_map_attribute uniqueMember member
nss_base_passwd dc=example,dc=com
nss_base_shadow dc=example,dc=com
nss_base_group dc=example,dc=com

您需要根据 DB2 配置更改服务器和域信息的位置。如果我们在同一个系统中使用服务器,那么在“host”处将其指定为“localhost”,在“base”处,您可以配置 LDAP 服务器的“SLAPD.conf”文件中提到的内容。

可插拔认证模型 (PAM) 是用于认证服务的 API。这是一个用于使用加密密码和特定类型为 posixAccount 的 LDAP 对象的 LDAP 认证的公用接口。此类型的所有 LDAP 对象都表示包含可移植操作系统接口 (POSIX) 属性的抽象帐户。

网络安全服务 (NSS) 是一组支持跨平台开发支持安全性的客户端和服务器应用程序的库。其中包括 SSL、TLS、PKCS S/MIME 等库以及其他安全标准。

您需要为此接口和两个其他映射属性指定基准 DN。OpenLDAP 客户端配置文件包含下面给出的条目:

host localhost
base dc=example,dc=com

到此为止,您只需定义 LDAP 服务的主机和基准 DN。

Validating OpenLDAP environment

在配置 LDAP 服务器和 LDAP 客户端后,请验证两者是否能通信。

Step1 :使用以下命令检查您的本地 LDAP 服务器是否正在运行:

ps -ef | grep -i ldap

此命令应列出表示您 LDAP 服务器的 LDAP 程序:

/usr/lib/openldap/slapd -h ldap:/// -u ldap -g ldap -o slp=on

这表明您的 LDAP 服务器正在运行并正在等待来自客户端的请求。如果没有上述命令的进程,您可以使用“rcldap”命令启动 LDAP 服务器。

rcldap start

当服务器启动后,您可以通过发出以下命令在“/var/log/messages/”文件中对其进行监视。

tail –f /var/log/messages

Testing connection to LDAP server with ldapsearch

ldapsearch 命令打开与 LDAP 服务器的连接,绑定到它,并执行一个搜索查询,可以使用特殊参数“x”指定此搜索查询,通过使用 -x 参数而不是更加复杂的安全认证层(SASL)之类的机制来连接到您的 LDAP 服务器,以进行简单身份验证。

ldapsearch –x

LDAP 服务器应发送下面显示的响应,包含所有以 LDAP 数据交换格式(LDIF)存储的 LDAP 条目。

# extended LDIF
#
# LDAPv3
# base <> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
# example.com
dn: dc=example,
dc=com  dc: example
o: example
objectClass: organization
objectClass: dcObject
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1

Configuring DB2

在处理 LDAP 服务器和客户端后,您需要配置 DB2 数据库以用于 LDAP。让我们讨论如何安装和配置数据库,以便在 DB2 用户身份验证过程中使用 LDAP 环境。

Configuring DB2 and LDAP interaction plug-ins

IBM 提供了一个带有 DB2 LDAP 插件的免费软件包。DB2 软件包包括三个 DB2 安全插件,各针对以下一项:

  1. server side authentication

  2. client side authentication

  3. group lookup

根据您的需求,您可以使用上述三个插件中的任何一个或全部。该插件不支持某些用户在 LDAP 中定义,而其他用户在操作系统中定义的环境。如果您决定使用 LDAP 插件,则需要在 LDAP 服务器中定义与数据库关联的所有用户。该原则也适用于该组插件。

您必须决定哪些插件对我们的系统是强制性的。在客户端系统上发生 CONNECT 或 ATTACH 语句时提供用户 ID 和密码验证的情形中,使用客户端身份验证插件。因此,必须将数据库管理器配置参数 SRVCON_AUTH 或 AUTHENTICATION 设置为值 CLIENT。很难保护客户端身份验证,通常不建议使用。通常建议使用服务器插件,因为如果客户端执行 CONNECT 或 ATTACH 语句,它会执行用户 ID 和密码的服务器端验证,这是安全的方式。服务器插件还提供了一种将 LDAP 用户 ID 映射到 DB2 授权 ID 的方法。

现在您可以开始安装和配置 DB2 安全插件,您需要考虑 DB2 所需的目录信息树。DB2 使用间接授权,这意味着用户属于一个组,而该组被授予较少的权限。您需要在 LDAP 目录中定义所有 DB2 用户和 DB2 组。

Image

LDIF 文件 openldap.ldif 应包含以下代码:

#
# LDAP root object
# example.com
#
dn: dc=example,
dc=com
dc: example
o: example
objectClass: organization
objectClass: dcObject
 #
 # db2 groups
 #
 dn: cn=dasadm1,dc=example,dc=com
 cn: dasadm1
 objectClass: top
 objectClass: posixGroup
 gidNumber: 300
 objectClass: groupOfNames
 member: uid=dasusr1,cn=dasadm1,dc=example,dc=com
 memberUid: dasusr1
 dn: cn=db2grp1,dc=example,dc=com
 cn: db2grp1
 objectClass: top
 objectClass: posixGroup
 gidNumber: 301
 objectClass: groupOfNames
 member: uid=db2inst2,cn=db2grp1,dc=example,dc=com  memberUid: db2inst2
 dn: cn=db2fgrp1,dc=example,dc=com
 cn: db2fgrp1
 objectClass: top
 objectClass: posixGroup
 gidNumber: 302
 objectClass: groupOfNames
 member: uid=db2fenc1,cn=db2fgrp1,dc=example,dc=com
 memberUid: db2fenc1
 #
 # db2 users
 #
 dn: uid=dasusr1,
 cn=dasadm1,
 dc=example,dc=com
 cn: dasusr1
 sn: dasusr1
 uid: dasusr1
 objectClass: top
 objectClass: inetOrgPerson
 objectClass: posixAccount
 uidNumber: 300
 gidNumber: 300
 loginShell: /bin/bash
 homeDirectory: /home/dasusr1
 dn: uid=db2inst2,cn=db2grp1,dc=example,dc=com
 cn: db2inst2
 sn: db2inst2
 uid: db2inst2
 objectClass: top
 objectClass: inetOrgPerson
 objectClass: posixAccount
 uidNumber: 301
 gidNumber: 301
 loginShell: /bin/bash
 homeDirectory: /home/db2inst2
 dn: uid=db2fenc1,cn=db2fgrp1,dc=example,dc=com
 cn: db2fenc1
 sn: db2fenc1
 uid: db2fenc1
 objectClass: top
 objectClass: inetOrgPerson
 objectClass: posixAccount
 uidNumber: 303
 gidNumber: 303
 loginShell: /bin/bash
 homeDirectory: /home/db2fenc1

创建一个名为“db2.ldif”的文件,并将上述示例粘贴到其中。使用此文件,将已定义的结构添加到 LDAP 目录。

要将 DB2 用户和 DB2 组添加到 LDAP 目录,您需要将用户绑定为“rootdn”到 LDAP 服务器以获得确切的权限。

执行以下语法,使用 LDIF 文件“db2.ldif”中定义的所有对象填充 LDAP 信息目录

ldapadd –x –D “cn=Manager, dc=example,dc=com” –W –f <path>/db2.ldif

执行具有更多参数的搜索结果

ldapsearch –x |more

Preparing file system for DB2 usage

为我们的 LDAP 用户 db2inst2 创建实例。此用户需要包含空文件的目录。在创建新实例之前,您需要创建一个成为该实例所有者的用户。

在创建实例用户后,您必须在用户主目录(DB2 将对其进行修改)中创建文件“.profile”和“.login”。要在该目录中创建此文件,请执行以下命令:

mkdir /home/db2inst2
mkdir /home/db2inst2/.login
mkdir /home/db2inst2/.profile

您已经在 LDAP 目录中注册了所有与 DB2 相关联的用户和组,现在您可以使用实例所有者 ID“db2inst2”和 fenced 用户 ID“db2fenc1”创建一个名为“db2inst2”的实例,这是运行用户定义函数 (UDF) 或存储过程所必需的。

/opt/ibm/db2/V10.1/instance/db2icrt –u db2fenc1 db2inst2
DBI1070I Program db2icrt completed successfully.

现在检查实例主目录。您会看到一个名为“sqllib”的新子目录,以及为 DB2 使用而定制的 .profile 和 .login 文件。

Configuring authentication public-ins for LDAP support in DB2

将所需的 LDAP 插件复制到相应的 DB2 目录:

cp            ///v10/IBMLDAPauthserver.so
/home/db2inst2/sqllib/security/plugin/server/.

cp            ///v10/IBMLDAPgroups.so
/home/db2inst2/sqllib/security
/plugin/group/.

插件复制到指定目录后,您调整为 DB2 实例所有者登录并更改数据库管理器配置以使用这些插件。

Su – db2inst2
db2inst2> db2 update dbm cfg using svrcon_pw_plugin
IBMLDAPauthserver
db2inst2> db2 update dbm cfg using group_plugin
IBMLDAPgroups
db2inst2> db2 update dbm cfg using authentication
SERVER_ENCRYPT
db2inst2> db2stop
db2inst2> db2start

该修改在您启动 DB2 实例后生效。在重新启动该实例后,您需要安装和配置主 DB2 LDAP 配置文件“IBMLDAPSecurity.ini”,以使 DB2 插件与当前 LDAP 配置一起使用。

IBMLDAPSecurity.ini 文件包含

;-----------------------------------------------------------
; SERVER RELATED VALUES
;-----------------------------------------------------------
; Name of your LDAP server(s).
; This is a space separated list of LDAP server addresses,
; with an optional port number for each one:
; host1[:port] [host2:[port2] ... ]
; The default port number is 389, or 636 if SSL is enabled.
LDAP_HOST = my.ldap.server
;-----------------------------------------------------------
; USER RELATED VALUES
;-----------------------------------------------------------
rs
; LDAP object class used for use USER_OBJECTCLASS = posixAccount
; LDAP user attribute that represents the "userid"
; This attribute is combined with the USER_OBJECTCLASS and
; USER_BASEDN (if specified) to construct an LDAP search
; filter when a user issues a DB2 CONNECT statement with an
; unqualified userid. For example, using the default values
; in this configuration file, (db2 connect to MYDB user bob
; using bobpass) results in the following search filter:
OrgPerson)(uid=bob)
; &(objectClass=inet USERID_ATTRIBUTE = uid
representing the DB2 authorization ID
; LDAP user attribute, AUTHID_ATTRIBUTE = uid
;-----------------------------------------------------------
; GROUP RELATED VALUES
;-----------------------------------------------------------
ps
; LDAP object class used for grou GROUP_OBJECTCLASS = groupOfNames
at represents the name of the group
; LDAP group attribute th GROUPNAME_ATTRIBUTE = cn
; Determines the method used to find the group memberships
; for a user. Possible values are:
; SEARCH_BY_DN - Search for groups that list the user as
; a member. Membership is indicated by the
; group attribute defined as
; GROUP_LOOKUP_ATTRIBUTE.
; USER_ATTRIBUTE - A user's groups are listed as attributes
; of the user object itself. Search for the
; user attribute defined as
TRIBUTE to get the groups.
; GROUP_LOOKUP_AT GROUP_LOOKUP_METHOD = SEARCH_BY_DN
; GROUP_LOOKUP_ATTRIBUTE
; Name of the attribute used to determine group membership,
; as described above.
llGroups
; GROUP_LOOKUP_ATTRIBUTE = ibm-a GROUP_LOOKUP_ATTRIBUTE = member

现在定位当前实例目录中的文件 IBMLDAPSecurity.ini 文件。将上述示例内容复制到其中。

Cp
//db2_ldap_pkg/IBMLDAPSecurity.ini
/home/db2inst2/sqllib/cfg/

现在,您需要使用以下两个语法重新启动 DB2 实例:

db2inst2> db2stop

Db2inst2> db2start

此时,如果您尝试“db2start”命令,您会收到安全错误消息。因为尚未针对您的 LDAP 环境正确配置 DB2 安全配置。

Customizing both configurations

将 LDAP_HOST 名称准备好,该名称在 slapd.conf 文件中进行配置。

现在,编辑 IMBLDAPSecurity.ini 文件并键入 LDAP_HOST 名称。所述两个文件中的 LDAP_HOST 名称必须相同。

文件的内容如下所示:

      ;-----------------------------------------------------------
      ; SERVER RELATED VALUES
      ;-----------------------------------------------------------
      LDAP_HOST = localhost
      ;-----------------------------------------------------------
      ; USER RELATED VALUES
      ----------------------------
      ;-------------------------------
      USER_OBJECTCLASS = posixAccount
      USER_BASEDN = dc=example,dc=com
      USERID_ATTRIBUTE = uid
      AUTHID_ATTRIBUTE = uid
      ;-----------------------------------------------------------
      ; GROUP RELATED VALUES
      ;-----------------------------------------------------------
      GROUP_OBJECTCLASS = groupOfNames
	  GROUP_BASEDN = dc=example,dc=com
      GROUPNAME_ATTRIBUTE = cn
      GROUP_LOOKUP_METHOD = SEARCH_BY_DN
      GROUP_LOOKUP_ATTRIBUTE = member

更改这些值后,LDAP 会立即生效,而您的 DB2 环境搭配 LDAP 也可完美运行。

您可以注销并重新登录到“db2inst2”用户。

现在,您的实例正在与 LDAP 目录一起工作。