DB2 - LDAP



介绍

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

LDAP 服务器包含以目录树形式组织的信息。客户端请求服务器提供信息或对特定信息执行某些操作。服务器通过提供所需信息(如果存在)来响应客户端,或者将客户端引用到另一个服务器以对所需信息进行操作。然后,客户端从另一个服务器获取所需信息。

目录的树状结构在所有参与的服务器上保持一致。这是 LDAP 目录服务的突出特性。因此,无论客户端引用哪个服务器,客户端始终都能以无错误的方式获取所需信息。在这里,我们使用 LDAP 来认证 IBM DB2 作为操作系统认证的替代。

LDAP 有两种类型

  1. 透明的
  2. 插件

让我们看看如何配置透明的 LDAP。

配置透明 LDAP

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

LDAP 服务器配置

创建一个 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 客户端配置

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。这是 LDAP 身份验证与加密密码和类型为 posixAccount 的特殊 LDAP 对象的通用接口。此类型的所有 LDAP 对象都表示具有可移植操作系统接口 (POSIX) 属性的帐户的抽象。

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

您需要为该接口指定基本 DN 和两个附加映射属性。OpenLDAP 客户端配置文件包含以下条目

host localhost  
base dc=example,dc=com

到目前为止,您只是定义了 LDAP 服务器的主机和基本 DN。

验证 OpenLDAP 环境

配置完 LDAP 服务器和 LDAP 客户端后,验证两者之间的通信。

步骤 1:检查您的本地 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 

使用 ldapsearch 测试与 LDAP 服务器的连接

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  

配置 DB2

在使用 LDAP 服务器和客户端之后,您需要配置我们的 DB2 数据库以与 LDAP 一起使用。让我们讨论一下,如何安装和配置您的数据库以使用我们的 LDAP 环境进行 DB2 用户身份验证过程。

配置 DB2 和 LDAP 交互插件

IBM 提供了一个包含 LDAP 插件的免费 DB2 软件包。DB2 软件包包括以下每个的三个 DB2 安全插件

  • 服务器端身份验证
  • 客户端身份验证
  • 组查找

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

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

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

图片

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 

准备用于 DB2 的文件系统

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

创建实例用户后,您应该在用户主目录中创建“ .profile”和“.login”文件,这些文件将由 DB2 修改。要在目录中创建此文件,请执行以下命令

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

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

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

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

配置用于 LDAP 支持的 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 实例后生效。重新启动实例后,您需要安装和配置名为“IBMLDAPSecurity.ini”的主要 DB2 LDAP 配置文件以使 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”命令,您将收到安全错误消息。因为,DB2 安全配置尚未针对您的 LDAP 环境正确配置。

自定义两个配置

保留在 slapd.conf 文件中配置的 LDAP_HOST 名称。

现在编辑 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 目录。

广告