OpenLDAP 无处不在
本文旨在演示如何使用 OpenLDAP 作为异构环境的核心目录服务。LDAP 服务器提供共享电子邮件目录、Linux 和 Windows 用户的统一登录、主目录的自动挂载以及 Linux 和 Windows 客户端的文件共享。
Midwest Tool & Die 已经使用 OpenLDAP 三年了,性能一直完美无瑕。我们的目录实现了 100% 的正常运行时间。公司从在目录中共享电子邮件联系人中看到了第一个巨大的好处。现在,我们实现了从任何联网计算机的统一登录。我们的计算机用户可以通过 Windows/Samba 或 Linux/NFS/automount 访问相同的文件存储。结果是对网络服务的无缝访问。
图 1 展示了本文示例中使用的简单混合环境。本文讨论的配置未记录 SSL 的使用。它使用的 ldapsync.pl 程序可能会暴露您的 LDAP 管理员密码。因此,Windows 客户端可能会缓存用户密码,从而对 Linux 安全性造成新的风险。请谨慎审慎地审查您的安全需求,并自行承担风险尝试此配置。作者和我们的雇主 Midwest Tool & Die 均不对您的安全承担任何责任。
我们讨论的 LDAP 服务器是使用 RPM 二进制软件包安装的,并在 Red Hat 7.1 上使用 openldap-2.0.11-8。您还需要安装 auth_ldap 和 nss_ldap 软件包。本文假设域名为 foo.com。
要使用最新的源代码,请按照 www.openldap.org/doc/admin/quickstart.html 的说明下载并安装 OpenLDAP。如下所示编辑 OpenLDAP 服务器配置文件 /etc/openldap/slapd.conf
# Schemas to use include /etc/openldap/schema/core.schema include /etc/openldap/schema/cosine.schema include /etc/openldap/schema/inetorgperson.schema include /etc/openldap/schema/nis.schema include /etc/openldap/schema/redhat/ rfc822-MailMember.schema include /etc/openldap/schema/redhat/autofs.schema include /etc/openldap/schema/redhat/ kerberosobject.schema database ldbm suffix "dc=foo,dc=com" rootdn "cn=Manager, dc=foo,dc=com" rootpw {crypt}sadtCr0CILzv2 directory /var/lib/ldap index default eq index objectClass,uid,uidNumber,gidNumber eq index cn,mail,surname,givenname eq,sub # Access Control (See openldap v.2.0 Admin Guide) access to attr=userPassword by self write by anonymous auth by dn="cn=manager,dc=foo,dc=com" write by * compare access to * by self write by dn="cn=manager,dc=foo,dc=com" write by * read
LDAP 模式定义了构成目录条目的对象类和属性。通过上面的编辑,定义适合我们用途的模式的繁重工作已经完成。我们需要的模式,在 slapd.conf 的第一部分列出,已经定义并与 RPM 安装包一起打包。
如果您发现需要为目录添加 objectClass 或属性,请参阅 OpenLDAP 管理指南 www.openldap.org/doc/admin20/schema.html。我们将使用默认数据库类型 ldbm,我们的示例使用 LDAP 域组件。因此,foo.com 变为 dc=foo,dc=com。此外,管理员对 LDAP 条目具有完全写入权限。
Red Hat 7.3 参考指南建议使用 crypt 来保护管理员密码
perl -e "print crypt('passwd', 'salt_string',);"
在之前的 Perl 行中,将 salt_string 替换为两个字符的 salt,并将 passwd 替换为密码的明文版本。将生成的加密密码粘贴到如上所示的 slapd.conf 中。
索引行提高了经常查询的属性的性能。访问控制限制对 userPassword 条目的访问,但用户和管理员可以修改该条目。对于所有其他条目,管理员具有写入权限,而其他所有人都被授予读取权限。
LDAP 可以看作是一棵树,foo.com 在树干上。分支创建为组织单元 (ou),如图 2 所示。
目录中的每个条目都通过专有名称 (dn) 唯一标识。LDAP 管理员的 dn 看起来像 dn: cn=manager, dc=foo, dc=com。
ou 提供了一种对条目进行分组的方法,如表 1 所示。
我们以 LDIF (LDAP 交换格式) 创建各个条目,并将它们保存到 top.ldif
dn: dc=foo, dc=com objectclass: dcObject objectclass: organization o: Foo Company dc: foo dn: cn=manager, dc=foo, dc=com objectclass: organizationalRole cn: manager dn: ou=people, dc=foo, dc=com ou: people objectclass: organizationalUnit objectclass: domainRelatedObject associatedDomain: foo.com dn: ou=contacts, ou=people, dc=foo, dc=com ou: contacts ou: people objectclass: organizationalUnit objectclass: domainRelatedObject associatedDomain: foo.com dn: ou=group, dc=foo, dc=com ou: group objectclass: organizationalUnit objectclass: domainRelatedObject
使用 ldapadd 将顶级条目添加到目录
ldapadd -x -D 'cn=manager,dc=foo,dc=com' -W \ -f top.ldif然后,使用 ldapsearch 测试您的工作以检索所有条目
ldapsearch -x -b 'dc=foo,dc=com'
此时,我们在 LDAP 中有足够的结构可以投入实际使用。我们将从共享电子邮件联系人开始,这也应该在 LDIF 中。
为了简化流程,您或许可以将您的电子邮件地址簿导出为 LDIF 格式。例如,在 Mozilla 1.0 中,您可以从地址簿窗口的“工具”菜单中导出为 LDIF 格式。Microsoft Outlook Express 也允许将地址簿导出为 LDIF 格式。您需要处理生成的文件,使其看起来像我们下面的联系人示例;我建议为此任务使用 Perl。
联系人通过其电子邮件地址唯一标识。以下是示例联系人的 dn
dn: uid=someone@somewhere.com,ou=contacts, ou=people, dc=foo,dc=com
包含所有属性的联系人的完整条目如下所示
dn: uid=someone@somewhere.com,ou=contacts, ou=people, dc=foo,dc=com cn: Someone Youknow mail: uid: givenname: Someone sn: Youknow objectclass: person objectClass: top objectClass: inetOrgPerson用空行分隔每个联系人条目,并将其保存到名为 contacts.ldif 的文件中。然后,您可以使用 ldapadd 将联系人添加到目录
ldapadd -x -D 'cn=manager,dc=foo,dc=com' -W \ -f contacts.ldif再次,使用 ldapsearch 测试您的工作以检索所有条目
ldapsearch -x -b 'dc=foo,dc=com'
现在是时候配置 Mozilla 以使用新的 LDAP 服务器了(参见图 3)。
从 Mozilla Mail 和 News 窗口的“编辑”菜单中,选择“邮件和新闻组帐户设置”。在“寻址”选项卡中,选择“使用不同的 LDAP 服务器”,然后选择“编辑目录”,然后选择“添加”。在“目录服务器属性”对话框中填写
Name: FOO Server: ldapserver.foo.com base DN: ou=people,dc=foo,dc=com
接下来,告诉 Mozilla 在您的目录中查找地址。在“邮件和新闻组”首选项的“寻址”下,选择“地址自动完成”,并在“目录服务器”中填写 FOO。
通过向您的 LDAP 目录中的某个联系人撰写消息来测试您的设置。地址应该在您键入时自动完成。另一个测试是从 Mozilla Mail 地址簿中搜索 LDAP 目录。搜索包含 * 的“姓名”或“电子邮件”应返回所有联系人条目。同样,您也可以配置 Microsoft Outlook Express 以使用 LDAP 目录。
通过将用户帐户信息存储在 LDAP 中,您可以在任何 Linux 控制台使用相同的用户名和密码。首先,您必须决定应在 LDAP 中输入哪些用户名。以下是我们用于 UID/GID 的用户方案
系统帐户:UID < 500
LDAP 中的真实用户:499 < UID < 10,000
本地用户、组(不在 LDAP 中)> 10,000
此用户方案允许 9,500 个 LDAP 用户和组条目,同时允许不干扰 LDAP UID/GID 的本地每系统用户和组。
本地计算机用户的条目通过登录名“uid”标识。本地计算机用户是 ou=people 的成员:dn: uid=gomerp,ou=people,dc=foo,dc=com。
完整条目包含控制帐户访问所需的属性
dn: uid=gomerp,ou=people,dc=foo,dc=com uid: gomerp cn: Gomer Pyle givenname: Gomer sn: Pyle mail: objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson objectClass: account objectClass: posixAccount objectClass: top objectClass: kerberosSecurityObject objectClass: shadowAccount userPassword: useradd_ldap_flag shadowLastChange: 11547 shadowMax: 99999 shadowFlag: 0 krbname: loginShell: /bin/bash uidNumber: 531 gidNumber: 531 homeDirectory: /h/gomerp gecos: Gomer Pyle
为了简化此操作,OpenLDAP 附带了可以提取用户帐户信息的迁移实用程序;请参阅 /usr/share/openldap/migration。您需要做的第一件事是编辑 migrate_common.ph
# Default DNS domain $DEFAULT_MAIL_DOMAIN = "foo.com"; # Default base $DEFAULT_BASE = "dc=foo,dc=com"; # turn this on to support more general object classes # such as person. $EXTENDED_SCHEMA = 1;然后,提取用户帐户信息
/usr/share/openldap/migration/migrate_passwd.pl \ /etc/passwod >people.ldif完成后,查看生成的 LDIF 文件。您应该删除系统帐户(如 root)和不需要出现在 LDAP 中的本地系统用户的条目。最后,将用户条目添加到 LDAP
ldapadd -x -D 'cn=manager,dc=foo,dc=com' -W \ -f people.ldif与往常一样,使用 ldapsearch 测试您的工作以检索所有条目
ldapsearch -x -b "dc=foo,dc=com" "(objectclass=*)"由于计算机用户属于 ou=people,您现在可以在您的邮件客户端中查找他们的电子邮件地址。
您需要为每个在多台 Linux 计算机之间共享的组创建一个组条目。每个用户还需要一个用户私有组的组条目。组条目通过“cn”标识,每个组都属于 ou=group,例如
dn: cn=gomerp,ou=group,dc=foo,dc=com
用户私有组将如下所示
dn: cn=gomerp,ou=group,dc=foo,dc=com objectClass: posixGroup objectClass: top cn: gomerp userPassword: {crypt}x gidNumber: 531而共享组将如下所示
dn: cn=web_dev,ou=group,dc=foo,dc=com objectClass: posixGroup objectClass: top cn: web_dev gidNumber: 502 memberUid: gomerp memberUid: goober memberUid: barneyf创建组条目后,提取组信息
/usr/share/openldap/migration/migrate_passwd.pl \ /etc/group >group.ldif查看生成的 LDIF 文件,删除系统组和不需要出现在 LDAP 中的本地系统用户的条目。然后,将组条目添加到 LDAP
ldapadd -x -D 'cn=manager,dc=foo,dc=com' -W \ -f group.ldif使用 ldapsearch 测试您的工作以检索所有组条目
ldapsearch -x -b 'dc=foo,cd=com'
通过统一登录,用户拥有通过 NFS 共享的单个主目录。为了简单起见,我们从 ldapserver.foo.com 托管我们的主目录,并通过 NFS 共享 /home。NFS 超出了本文的范围,但以下是 /etc/exports 中有效的一行。
/home *.foo.com(rw)
Linux LDAP 客户端在登录时使用自动挂载和 NFS 挂载用户的主目录。LDAP 使用自动挂载是 NIS(网络信息服务)自动挂载映射的替代品。替换 auto.master、auto.home 和 auto.misc 的自动挂载映射。
我们还为 auto.master 创建一个新的组织单元
dn: ou=auto.master,dc=foo,dc=com objectClass: top objectClass: automountMap ou: auto.master
auto.master 条目通过“cn”标识。automountInformation 属性指示自动挂载在 LDAP 中查找映射
dn: cn=/h, ou=auto.master,dc=foo,dc=com objectClass: automount automountInformation: ldap:ou=auto.home, dc=foo,dc=com cn: /h趁此机会,让我们为其他 NFS 共享目录创建一个 auto.master 条目
dn: cn=/share, ou=auto.master,dc=foo,dc=com objectClass: automount automountInformation: ldap:ou=auto.misc, dc=foo,dc=com cn: /share以 LDIF 格式创建自动挂载条目并另存为 auto.master.ldif
dn: ou=auto.master,dc=foo,dc=com objectClass: top objectClass: automountMap ou: auto.master dn: cn=/h, ou=auto.master,dc=foo,dc=com objectClass: automount automountInformation: ldap:ou=auto.home, dc=foo,dc=com cn: /h dn: cn=/share, ou=auto.master,dc=foo,dc=com objectClass: automount automountInformation: ldap:ou=auto.misc, dc=foo,dc=com cn: /share将 auto.master 条目添加到 LDAP
ldapadd -x -D 'cn=manager,dc=foo,dc=com' -W \ -f auto.master.ldif接下来,我们为 auto.home 创建一个新的组织单元 ou=auto.home。主目录条目通过“cn”标识
dn: cn=gomerp,ou=auto.home,dc=foo,dc=com以 LDIF 格式为每个用户创建 auto.home 条目并另存为 auto.home.ldif
dn: ou=auto.home,dc=foo,dc=com objectClass: top objectClass: automountMap ou: auto.home dn: cn=gomerp,ou=auto.home,dc=foo,dc=com objectClass: automount automountInformation: ldapserver.foo.com:/home/gomerp cn: super3将 auto.home 条目添加到 LDAP
ldapadd -x -D 'cn=manager,dc=foo,dc=com' -W \ -f auto.home.ldif当从 Linux LDAP 客户端自动挂载时,您的主目录 (ldapserver.foo.com:/home/gomerp) 将挂载到 /h/gomerp。其他 NFS 共享可以输入到 LDAP 中,并在需要时自动挂载。auto.misc 组织单元保存这些自动挂载映射,其形式为 ou=auto.misc。
如上所示,我们已经为 /share 创建了一个 auto.master 条目。现在,在 auto.misc 下为 NFS 共享创建条目,并将它们另存为 auto.misc.ldif
dn: ou=auto.misc,dc=foo,dc=com objectClass: top objectClass: automountMap ou: auto.misc dn: cn=redhat,ou=auto.misc,dc=foo,dc=com objectClass: automount automountInformation: bigdisk.foo.com:/pub/redhat cn: redhat dn: cn=engineering,ou=auto.misc,dc=foo,dc=com objectClass: automount automountInformation: bigdisk.foo.com:/data/engineering cn: engineering
将 auto.misc 条目添加到 LDAP
ldapadd -x -D 'cn=manager,dc=foo,dc=com' -W \ -f auto.misc.ldif当从 Linux LDAP 客户端自动挂载时,您的共享目录 bigdisk.foo.com:/data/engineering 将挂载到 /share/engineering。
您现在需要安装身份验证软件包 auth_ldap 和名称切换服务软件包 nss_ldap。Red Hat 工具 /usr/bin/authconfig 可用于配置客户端。选择“使用 LDAP®服务器:ldapserver.foo.com,基本 DN:dc=foo,dc=com”。Authconfig 将写入以下文件:/etc/ldap.conf、/etc/openldap/ldap.conf 和 /etc/nsswitch.conf。
验证 /etc/nsswitch.conf 是否具有以下条目
passwd: files ldap shadow: files group: files ldap automount: files ldap
验证 /etc/ldap.conf 是否具有这些条目
host ldapserver.foo.com base dc=foo,dc=com以及 /etc/openldap/ldap.conf 是否具有这些条目
HOST ldapserver.foo.com BASE dc=foo,dc=com
LDAP 服务器也是 LDAP 的客户端。在 LDAP 服务器上,禁用 /home 作为 /h 的自动挂载。nsswitch 配置为首先检查文件,然后检查 LDAP 以获取自动挂载信息。因此,我们将在 ldapserver.foo.com:/etc/auto.master 中创建一个虚拟条目
/h /etc/auto.null
用户的密码和组条目必须从主目录服务器上的密码和组文件中删除。创建备份,然后编辑 /etc/passwd、/etc/shadow、/etc/group 和 /etc/gshadow 以删除 LDAP 真实用户条目。
要进行测试,请使用 LDAP 用户名登录到 Linux LDAP 客户端。您应该看到该用户的相应登录 shell 和主目录。要测试 auto.misc 共享,您必须按名称访问共享
cd /share/redhat
自动挂载仅在 NFS 共享被使用时才挂载,因此目录 /share/redhat 在被访问之前是不可见的。
要实现 Windows 和 Linux 统一登录,首先配置 Samba 主域控制器 (PDC)。用户主目录与 SMB 客户端共享。Samba 配置的详细信息超出了本文的范围。
可以使用 Samba 和 Perl 程序 ldapsync.pl 从 MS Windows 更改用户密码,该程序可从 www.mami.net/univr/tng-ldap/howto/#how_to_change_password 获取。
ldapsync.pl 脚本是 Samba 调用的 /bin/passwd 程序的替代品,用于更改用户密码,并使它们与 Samba 密码保持同步。当在 Windows 中更改用户密码时,ldapsync.pl 脚本从 Samba 调用,并且它以 root 身份运行,就像 /bin/passwd 通常在未修改的 Samba 中运行一样。LDAP 启用的用户需要 ldapsync.pl 脚本才能正常工作。由于用户密码不是本地存储在 /etc/passwd 中,而是存储在 LDAP 中,因此 ldapsync.pl 脚本绑定到 LDAP 目录并修改 LDAP 中用户的密码条目。
用更简单的术语来说,此过程的工作方式如下
用户从 Windows 调用密码更改程序。
用户单击“确定”以更改密码并将数据发送到 Samba 服务器。
Samba 查看其配置文件,并知道调用 ldapsync.pl 来更改 LDAP 密码。
ldapsync.pl 使用 -o %u 选项执行,这些选项指定程序在不提示输入旧密码的情况下运行。它在运行时将用户名传递给脚本(如果您不想在不知道 root 密码的情况下更改它,这很重要)。
Samba 将用户的新密码传递给 ldapsync.pl,而无需关心旧密码是什么。
ldapsync.pl 与 Samba 聊天,期望收到包含新密码的正确响应。
如果它正确通过聊天,则密码将由 ldapsync.pl 加密。
ldapsync.pl 然后使用用户的正确 dn 绑定 LDAP,并在用户的 LDAP 条目上执行 ldapmodify,替换存储在 LDAP 中的 userPassword 字段。LDAP 和 Samba 最后一次聊天,监听来自 LDAP 的成功消息,此时过程结束。
要为此配置 Samba,您将需要以下 Smb.conf 条目
passwd program = /etc/samba/ldapsync.pl -o %u passwd chat = *New*password* %n\n *Retype*new*password* %n\n *modifying*当用户在 Windows 中更改密码时,系统会提示他们输入旧密码、新密码,然后要求确认新密码。由于调用 ldapsync.pl 时不关心旧密码,因此只检查两个新条目。首先,* 指示它查找任何内容,然后进行特定匹配。因此,*New*password*%n\n 的意思是匹配任何内容,然后是单词 New,然后是任何内容和单词 password,然后是任何内容和用户输入的新密码 (%n)。*modifying* 的意思是如果 LDAP 返回它已修改条目,则该过程成功。
您必须编辑 ldapsync.pl 以输入 LDAP 绑定信息
$binddn = "cn=manager,dc=foo,dc=com"; $passwd = "passwd";
然后,将 ldapsync.pl 的访问权限限制为仅 root 用户 (0700)。
您的 NFS 共享可以通过在 NFS 主机上运行 Samba 服务器与 Windows 客户端共享。Samba 服务器必须加入您的 FOO SMB 域。在 Samba 服务器上运行以下命令以加入 SMB 域
smbbpasswd -j [FOO] -r [PDC]
恭喜!您的 LDAP 服务器已启动并运行,具有共享电子邮件联系人、统一登录和可从任何客户端访问的共享文件存储。您可能需要编写一些管理实用程序来帮助维护用户和组帐户。再次,我们建议为此任务使用 Perl。

