由于工作需要,最近简单研究了一下RedHat(CentOS)上的OpenLDAP,发现6.2的配置和以前的版本,特别是5.*的很不一样。
简介
Linux 发行版中提供的 OpenLDAP 软件按照一个客户机/服务器模型实现了轻量级目录访问协议(LDAP)。LDAP 的设计目的是提供一种有效的方法来查找和管理信息。OpenLDAP 软件和包提供了创建目录信息树(一个主要进行读操作的数据库)的工具。本文向您展示如何存储用户的帐号信息,并修改身份验证服务来使用 LDAP 获取所需要的信息。内部细节并不重要,因为这些工具可以将数据库的内容以文本格式(LDAP 数据交换格式,LDIF)呈现在您的面前。
LDAP 信息被组织成属性和值的组合,称为 条目(entry)。条目可能会具有必须的属性或可选属性。一个条目的属性必须要遵循 /etc/openldap/schema/ 模式文件中定义的规则。规则包含在条目的 objectclass 属性中。看一下下面的关系,我们可以看出posixAccount objectclass 中包含了密码文件条目的信息(posixAccount userPassword 是文件条目的 base64 编码)。
图 1. LDAP 目录条目和 Linux 密码文件之间的关系
LDAP 为作为容器使用的特殊条目提供了将这些条目组织成树结构的功能。在这个例子中,我们将使用一个容器 People 保存用户帐号信息,使用另外一个容器 Groups 保存组帐号信息。所生成的目录信息树如图 2 所示。
图 2. 用户帐号信息使用的目录信息树
让我们来看一下如何配置 OpenLDAP 服务器,如何将信息从系统文件迁移到 LDAP 目录中,如何配置 OpenLDAP 客户机通过 LDAP 对用户进行身份验证。在使用一个集中的身份验证数据库时,应该通过使用复制技术采用第二个 LDAP 服务器提供高可用性,这样在主服务器出现问题时,就可以使用第二个 LDAP 服务器响应客户机的请求。由于诸如密码之类的身份验证数据会通过网络进行传输,因此希望使用 TSL 协议建立加密通信连接。
配置 LDAP 服务器
我使用 CentOS 6.2 上的包来构建服务器:
openldap-clients-2.4.23-20.el6.x86_64
openldap-2.4.23-20.el6.x86_64
openldap-servers-2.4.23-20.el6.x86_64
openldap:包含 OpenLDAP 配置文件、库和文档
openldap-servers:包含 slapd 和 slurpd 服务器、迁移脚本和相关文件
openldap-clients:包含客户机程序,用来访问和修改 OpenLDAP 目录
OpenLDAP 包在服务器上安装了很多程序:
守护进程:
slapd:主 LDAP 服务器
slurpd:负责与复制 LDAP 服务器保持同步的服务器
对网络上的目录进行操作的客户机程序。下面这两个程序是一对儿:
ldapadd:打开一个到 LDAP 服务器的连接,绑定、修改或增加条目
dapsearch:打开一个到 LDAP 服务器的连接,绑定并使用指定的参数进行搜索
对本地系统上的数据库进行操作的几个程序:
slapadd:将以LDAP目录交换格式(LDIF)指定的条目添加到 LDAP 数据库中slapcat:打开 LDAP 数据库,并将对应的条目输出为 LDIF 格式
对于RH5.*来说,OpenLDAP的主要服务器配置文件是 /etc/openldap/slapd.conf。slapd.conf 文件中包括一系列全局配置选项。但是至少CentOS6.2的配置文件已经换地方了,找了很久才找到这篇《Directory Servers》,我们可以转换以前的slapd.conf为最新的格式:
~]# slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d/
具体设置可以参考《Directory Servers》。如果只是简单的测试,其实需要更改的也很少:
至于设置启动运行级别及启动ldap服务,比较简单,此处略去不讲。
迁移密码和 shadow 信息
我的安装包里貌似没有MigrationTools,也懒得去装,因此以下LDIF 全部为手工编写:
base.ldif 条目:
[root@OpenLDAP-Server slapd.d]# cat base.ldif
dn: dc=vnxldap, dc=com dc: vnxldap
description: LDAP Admin
objectClass: dcobject
objectClass: organizationalUnit
ou: rootobject
dn: ou=People,dc=vnxldap,dc=com ou: People
objectClass: top objectClass: organizationalUnit
dn: ou=Group,dc=vnxldap,dc=com ou: Group
objectClass: top objectClass: organizationalUnit
迁移 ldapuser 信息:
[root@OpenLDAP-Server slapd.d]# grep ldapuser /etc/passwd
ldapuser:x:500:500::/home/ldapuser:/bin/bash
[root@OpenLDAP-Server slapd.d]# cat passwd.ldif
dn: uid=ldapuser,ou=People,dc=vnxldap,dc=com uid: ldapuser
cn: ldapuser
objectClass: account
objectClass: posixAccount
objectClass: top objectClass: shadowAccount
userPassword: {SSHA}oVzczxYaRDM6RrPNZhScAII6RH2Y7333
shadowLastChange: 13048 shadowMax: 99999 shadowWarning: 7 loginshell: /bin/bash
uidNumber: 500 gidNumber: 500 homeDirectory: /home/ldapuser
gecos: ldapuser
迁移 ldapuser 组:
[root@OpenLDAP-Server slapd.d]# grep ldapuser /etc/group
ldapuser:x:500: [root@OpenLDAP-Server slapd.d]# cat group.ldif
dn: cn=ldapuser, ou=Group,dc=vnxldap,dc=com objectClass:posixGroup
objectClass:top cn: ldapuser
userpassword: {crypt}x
gidNumber:500
在 LDAP 服务器上,使用 OpenLDAP 客户机工具 ldapadd 将以上条目插入到数据库中。简单身份验证必须要使用 -x 选项指定。在LDAP配置文件中定义的 rootdn 身份验证识别名是 “cn=Manager,dc=vnxldap,dc=com”。对于简单身份验证来说,必须使用密码。选项 -W 强制提示输入密码。这个密码就是在 LDAP配置文件中指定的 rootpw 参数的值。
[root@OpenLDAP-Server slapd.d]# ldapadd -x -D cn=Manager,dc=vnxldap,dc=com -w 123456 -f base.ldif [root@OpenLDAP-Server slapd.d]# ldapadd -x -D cn=Manager,dc=vnxldap,dc=com -w 123456 -f group.ldif [root@OpenLDAP-Server slapd.d]# ldapadd -x -D cn=Manager,dc=vnxldap,dc=com -w 123456 -f passwd.ldif
配置 LDAP 客户机
用来设置客户机包括:
nss_ldap-226-6:包括两个 LDAP 访问客户机:nss_ldap 和 pam_ldap
nss_ldap 是一组 C 库扩展,它允许 LDAP 目录服务器用作一个用户和组信息的主源
pam_ldap 是一个 Linux-PAM 模块,它支持身份验证功能
LDAP 身份验证要想正确地工作,需要配置两个服务:系统命名服务和身份验证服务。
系统命名服务(NSS)需要配置为使用 LDAP 来解析诸如用户和组帐号之类的资源。例如,在运行命令 ls -l 时,如果某个文件 inode 给出文件的所有者是 “user 501”,那么命名服务就需要将 “uid 501” 解析成用户名,并在 ls 命令输出结果中输出。通常来说,这是通过查找 /etc/passwd 文件中的所有用户帐号实现的。由于用户现在都存储在 LDAP 目录中,因此系统需要配置成同时对 passwd 文件和 LDAP 目录中的帐号进行解析。这种功能是通过 /usr/lib/libnss_ldap.so 库提供的。
身份验证服务是实际向 LDAP 验证用户身份的服务。可插入身份验证模块(PAM)提供了本地 Linux 身份验证服务。下面我们将配置 PAM 先对本地的 /etc/passwd 文件检查用户帐号,然后再对 LDAP 服务器进行检查。PAM LDAP 模块可以用来将身份验证重定向到 LDAP 目录上。/lib/security/pam_ldap.so PAM 模块提供了 LDAP 身份验证功能。
身份验证本身是由 PAM 程序执行的,它从身份验证候选机制中获取用户名,将其绑定到 OpenLDAP 服务器上,检索与这个 uid 条目(用户名条目)相关的 DN;从身份验证候选机制中获取密码,然后使用这个 DN 和密码试图将其绑定到 OpenLDAP 服务器上。如果绑定成功,PAM 会报告说这个用户已经成功通过了 pam_ldap.so 提供的身份验证测试。根据 PAM 的配置不同,在用户看到命令行提示符之前可能会执行其他测试。
我们可以采用两种方法来配置LDAP客户机。一种快速而简单的方法是运行/usr/sbin/authconfig-gtk,并在两个屏幕中输入信息。另外一种方法是通过编辑客户机 LDAP配置文件/etc/ldap.conf,然后修改 /etc/nsswitch.conf、/etc/sysconfig/authconfig 和 /etc/pam.d/system-auth。
首先让我们来看一下如何运行 authconfig-gtk:
发现 Redhat 5 和CentOS 6 又不一样,以下是Redhat 5的界面:
RedHat 5测试通过:
以下是CentOS 6界面:《参考Redhat 官网》
Launching the Authentication Configuration Tool UI
To open the Authentication Configuration Tool:
Open the System.
Select the Administration menu.
Select the Authentication item.
Alternatively, run the system-config-authentication command。
上来先来个红色警告,一定要强行使用TLS验证或HTTS:
那就选择TLS验证好了,下面也选择LDAP 密码(即简单密码),又报错:
命令行也不行:
[root@OpenLDAP-Client security]# authconfig --enableldap --enableldapauth --ldapserver=10.32.106.127 --ldapbasedn= dc=vnxldap,dc=com --update
authconfig: Authentication module /lib64/security/pam_ldap.so is missing. Authentication process might not work correctly.
那就安装pam_ldap,此处略去几十个字。
继续往后走,还是登陆不了,《LDAP Authentication On Red Hat Enterprise 6》指出还得启动nslcd及安装nss-pam-ldapd。The nss-pam-ldapd package allows LDAP directory servers to be used as a primary source of name service information. (Name service information typically includes users, hosts, groups, and other such data historically stored in flat files or NIS.)
好,那就再安装nss-pam-ldapd:
[root@OpenLDAP-Client ~]# service nslcd status
nslcd (pid 2451) is running...
Authentication Configuration Tool UI高级设置:
尝试LDAP登陆又报错:
[root@OpenLDAP-Client ~]# tail -f /var/log/messages
May 13 20:01:01 OpenLDAP-Client nslcd[2451]: [8e1f29] ldap_start_tls_s() failed: Protocol error (uri= ldap://10.32.106.127/ ) May 13 20:01:01 OpenLDAP-Client nslcd[2451]: [8e1f29] failed to bind to LDAP server ldap://10.32.106.127/: Protocol error
May 13 20:01:01 OpenLDAP-Client nslcd[2451]: [8e1f29] no available LDAP server found
几番测试死活不行,遂直接改成第二张方案,即编辑客户机文件
LDAP 配置文件 /etc/openldap/ldap.conf
/etc/nsswitch.conf
/etc/sysconfig/authconfig
/etc/pam.d/system-auth
1. /etc/openldap/ldap.conf:
PAM 和 NSS 模块使用的基本配置文件是 /etc/openldap/ldap.conf。host 选项指定 LDAP 服务器,base 选项指定这个目录使用的 DN。
-bash-3.2$$ cat /etc/openldap/ldap.conf
URI ldap://10.32.106.127/ BASE dc=vnxldap,dc=com
TLS_CACERTDIR /etc/openldap/cacerts
2. /etc/nsswitch.conf
要让 NSS 服务使用 OpenLDAP 服务器,需要将 “ldap” 添加到 /etc/nsswitch.conf 文件的 passwd、shadow 和 group 行中,如下所示:
passwd: files ldap
shadow: files ldap
group: files ldap
3. /etc/sysconfig/authconfig
用来跟踪特定身份验证机制是否已经启用的文件是 /etc/sysconfig/authconfig。我们可以希望以下条目的值都是 “yes”:
-bash-3.2$$ cat /etc/sysconfig/authconfig
USELDAP=yes
USELDAPAUTH=yes
USEMD5=yes
USESHADOW=yes
USELOCAUTHORIZE=yes
4. /etc/pam.d/system-auth
要让 PAM 身份验证服务使用 OpenLDAP 服务器,请将 pam_ldap 行加入到 /etc/pam.d/system-auth 中,位置在对应的标准 pam_unix.so 条目之后:
session required pam_unix.so session optional pam_ldap.so
可还是不行,总是不能使用Red Hat 5.0的明文密码方式,放狗搜索了一下,唯一的解决方法就是在/etc/sysconfig/authconfig 把FORCELEGACY=YES ,我试了下还是不行。总是强行要求使用TLS验证或HTTS。研究了一两个小时,TLS验证或HTTS也不行,算是正式放弃了。网上也有不少人遇到和我同样的问题,没有那么多时间去折腾,6.2的改动实在太大了。
2012-05-17更新:
今天找了个RH的工程师帮我看了下,很快就找到了原因,真是各种囧啊!其实只需要把ssl start_tls在nslcd.conf中注释掉就可以:
最后
如果一切顺利的话(目前在RH 5.0的Client测试通过),用户帐号信息可以从客户机系统中删除并从 LDAP 目录中进行获取了。当用户试图登录客户机系统时,PAM 身份验证服务就会从用户那里获取用户名,在我们的例子中是 ldapuser。PAM 会从 LDAP 服务器中检索识别名(DN)条目 dn: uid=ldapuser, ou=People, dc=vnxldap, dc=com.。PAM 然后会从用户那里获取密码。然后 PAM 试图使用这个 DN 和密码与 LDAP 服务器进行绑定。DN 和密码都以正文文本的格式发送给 LDAP 服务器。在对密码进行散列操作之后,如果服务器可以让用户登录,就会向 PAM 报告说已经成功进行了绑定。成功绑定可以完全满足 PAM 对 pam_ldap 模块汇报成功的标准,如果所有其他 PAM 标准都已经满足了,那么就允许用户登录到系统中。
当 LDAP 服务器对身份验证进行处理时,需要解决另外两个问题才能满足提供可靠安全的身份验证的目标。现在,任何客户机系统不能成功地与 LDAP 服务器进行通信都会阻止用户登录客户机系统。在下一节中我们将看到如何消除这种单点故障,这将显示客户机如何从备份服务器上访问 LDAP 目录。由于用户密码是在网络上以正文文本格式传输的,因此这并不能满足安全身份验证的需求。配置 TLS 安全性 将解决这个问题。