CentOS (RedHat) 6.2 使用 OpenLDAP

由于工作需要,最近简单研究了一下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 目录条目和 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/

CentOS (RedHat) 6.2 使用 OpenLDAP 管理用户帐号

具体设置可以参考《Directory Servers》。如果只是简单的测试,其实需要更改的也很少:

CentOS (RedHat) 6.2 使用 OpenLDAP 管理用户帐号

至于设置启动运行级别及启动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的界面:

CentOS (RedHat) 6.2 使用 OpenLDAP 管理用户帐号 

CentOS (RedHat) 6.2 使用 OpenLDAP 管理用户帐号

RedHat 5测试通过:

CentOS (RedHat) 6.2 使用 OpenLDAP 管理用户帐号

以下是CentOS 6界面:《参考Redhat 官网

Launching the Authentication Configuration Tool UI

To open the Authentication Configuration Tool:

  1. Open the System.

  2. Select the Administration menu.

  3. Select the Authentication item.

    CentOS (RedHat) 6.2 使用 OpenLDAP 管理用户帐号

Alternatively, run the system-config-authentication command。

CentOS (RedHat) 6.2 使用 OpenLDAP 管理用户帐号

上来先来个红色警告,一定要强行使用TLS验证或HTTS:

CentOS (RedHat) 6.2 使用 OpenLDAP 管理用户帐号

那就选择TLS验证好了,下面也选择LDAP 密码(即简单密码),又报错:

CentOS (RedHat) 6.2 使用 OpenLDAP 管理用户帐号

命令行也不行:

[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高级设置:

CentOS (RedHat) 6.2 使用 OpenLDAP 管理用户帐号

尝试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
几番测试死活不行,遂直接改成第二张方案,即编辑客户机文件
  1. LDAP 配置文件 /etc/openldap/ldap.conf
  2. /etc/nsswitch.conf
  3. /etc/sysconfig/authconfig
  4. /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中注释掉就可以:CentOS (RedHat) 6.2 使用 OpenLDAP 管理用户帐号CentOS (RedHat) 6.2 使用 OpenLDAP 管理用户帐号 

最后

如果一切顺利的话(目前在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 安全性 将解决这个问题。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值