Skip to content

DB2 - LDAP

DB2 - 与 LDAP 集成实现集中式认证

Section titled “DB2 - 与 LDAP 集成实现集中式认证”

在现代 IT 环境中,在每台服务器上单独管理用户帐户(基于操作系统的认证)既低效又不安全。集中式用户目录服务通过为用户身份提供单一可信来源来解决此问题。轻量级目录访问协议(LDAP)是与这些目录服务(如 OpenLDAP 或 Microsoft Active Directory)交互的行业标准。

通过将 Db2 与 LDAP 服务器集成,您可以将用户认证和组查找委托给您的集中式目录。这简化了用户管理,通过强制执行一致的密码策略来增强安全性,并简化了访问控制。本教程将指导您配置 Db2 以使用 LDAP 目录进行认证。

Db2 通过安全插件模型支持 LDAP 集成。我们将重点介绍最常见且安全的方案:透明的服务器端认证。

在配置 Db2 之前,您必须确保您的 LDAP 目录结构支持 Db2。Db2 需要查找用户和组对象。尽管具体的模式(schema)可能有所不同,但核心要求是一致的。

您将需要为您的 Db2 用户和组创建条目。通常,这些条目使用标准的 objectClass,例如用户使用 posixAccount,组使用 posixGroup 或 groupOfNames。下面是一个 LDAP 数据交换格式(LDIF)示例,展示了用户 db2inst1 和组 db2adms。

## 用户 'db2inst1' 的条目
dn: uid=db2inst1,ou=users,dc=example,dc=com
objectClass: top
objectClass: inetOrgPerson
objectClass: posixAccount
uid: db2inst1
sn: db2inst1
cn: Db2 Instance One
uidNumber: 1001
gidNumber: 1001
homeDirectory: /home/db2inst1
## 组 'db2adms' 的条目
dn: cn=db2adms,ou=groups,dc=example,dc=com
objectClass: top
objectClass: groupOfNames
cn: db2adms
member: uid=db2inst1,ou=users,dc=example,dc=com

注意:您的判别名(DNs),例如 dc=example,dc=com,将取决于您的 LDAP 服务器配置。请确保在继续之前,这些用户和组已在您的 LDAP 服务器上创建。

集成过程涉及三个主要步骤:复制插件文件,为插件创建配置文件,以及更新 Db2 数据库管理器(DBM)配置以使用该插件。

Db2 在安装时提供了必要的插件库。您需要将它们从安装路径复制到实例的安全插件目录。请以实例所有者的身份执行这些步骤。

# 路径可能因您的 Db2 版本和安装位置而异
SQLLIB_PATH=$(db2 get dbm cfg | grep 'Path to database directory' | awk -F'= ' '{print $2}')/sqllib
PLUGIN_SOURCE_PATH=/opt/ibm/db2/V11.5/security/plugin
# 复制服务器端认证和组查找插件
cp ${PLUGIN_SOURCE_PATH}/server/IBMLDAPauthserver.so ${SQLLIB_PATH}/security/plugin/server/
cp ${PLUGIN_SOURCE_PATH}/group/IBMLDAPgroups.so ${SQLLIB_PATH}/security/plugin/group/

在 <instance_home>/sqllib/cfg/ 目录下创建一个名为 IBMLDAPSecurity.ini 的文件。该文件会告诉 Db2 插件如何连接和搜索您的 LDAP 服务器。

# 位置:<instance_home>/sqllib/cfg/IBMLDAPSecurity.ini
# --- 服务器相关值 ---
# 您的 LDAP 服务器主机名或 IP。对于多个服务器,用空格分隔。
# 对于安全 LDAP (LDAPS),请使用端口 636 并设置 SSL_ENABLE=true。
LDAP_HOST = myldap.server.com:389
# 设置为 TRUE 以使用 LDAPS 进行加密通信
SSL_ENABLE = FALSE
# --- 用户相关值 ---
# 用户搜索的起始基本 DN。
USER_BASEDN = ou=users,dc=example,dc=com
# 存储用户 ID 的 LDAP 属性(例如,'uid','sAMAccountName')。
USERID_ATTRIBUTE = uid
# 定义用户条目的对象类。
USER_OBJECTCLASS = posixAccount
# --- 组相关值 ---
# 组搜索的起始基本 DN。
GROUP_BASEDN = ou=groups,dc=example,dc=com
# 存储组名的 LDAP 属性。
GROUPNAME_ATTRIBUTE = cn
# 定义组条目的对象类。
GROUP_OBJECTCLASS = groupOfNames
# 列出其成员的组内属性。
GROUP_LOOKUP_ATTRIBUTE = member

最佳实践:对于生产系统,始终使用 LDAPS。这需要将 SSL_ENABLE 设置为 TRUE,并且可能需要使用 SSL_KEYDB 和 SSL_STASH 参数为 SSL 证书配置密钥库。有关详细信息,请参阅 Db2 官方文档。

最后,告诉 Db2 使用新的插件进行认证和组管理。这些更改需要重启实例才能生效。

# 作为 Db2 实例所有者:
db2 UPDATE DBM CFG USING AUTHENTICATION SERVER_ENCRYPT
db2 UPDATE DBM CFG USING SRVCON_PW_PLUGIN IBMLDAPauthserver
db2 UPDATE DBM CFG USING GROUP_PLUGIN IBMLDAPgroups
# 重启 Db2 实例以使更改生效
db2stop
db2start

重启实例后,您可以通过尝试使用 LDAP 用户的凭据连接到数据库来验证配置。

# 使用 LDAP 用户 ID 和密码连接
db2 CONNECT TO mydatabase USER ldapuser1 USING 'password123'
  • 连接失败: 如果 db2start 失败或连接被拒绝,请检查 db2diag.log 文件。它通常包含来自 LDAP 插件的详细错误消息。
  • 凭据无效: 这意味着 LDAP 服务器拒绝了用户名/密码。请验证凭据,并确保 .ini 文件中的 USERID_ATTRIBUTE 设置正确(例如,OpenLDAP 使用 uid,Active Directory 使用 sAMAccountName)。
  • 用户未找到: 如果用户有效但 Db2 找不到它,请仔细检查 USER_BASEDN 和 USER_OBJECTCLASS 设置。确保 Db2 服务器可以访问指定端口上的 LDAP_HOST。
  • 组问题: 如果用户可以连接但缺少预期权限,请验证与组相关的设置(GROUP_BASEDN、GROUPNAME_ATTRIBUTE 等),并确保该用户在 LDAP 组中被正确列为 member。
  • 调试工具: 从 Db2 服务器机器上使用 ldapsearch 等命令行工具手动查询 LDAP 服务器。这有助于独立于 Db2 确认连接性以及您的搜索过滤器和基本 DN 是否正确。

本教程介绍了透明 LDAP 认证。Db2 还支持将 LDAP 用户映射到不同的 Db2 授权 ID 以及更复杂的目录模式。对于高级配置和安全强化,请始终查阅您特定版本的最新 IBM Db2 知识中心。