OpenLDAP 无处不在

作者:Craig Swanson

本文旨在演示如何使用 OpenLDAP 作为异构环境的核心目录服务。LDAP 服务器提供共享电子邮件目录、Linux 和 Windows 用户的统一登录、主目录的自动挂载以及 Linux 和 Windows 客户端的文件共享。

Midwest Tool & Die 已经使用 OpenLDAP 三年了,性能一直完美无瑕。我们的目录实现了 100% 的正常运行时间。公司从在目录中共享电子邮件联系人中看到了第一个巨大的好处。现在,我们实现了从任何联网计算机的统一登录。我们的计算机用户可以通过 Windows/Samba 或 Linux/NFS/automount 访问相同的文件存储。结果是对网络服务的无缝访问。

OpenLDAP Everywhere

图 1. OpenLDAP 混合环境

图 1 展示了本文示例中使用的简单混合环境。本文讨论的配置未记录 SSL 的使用。它使用的 ldapsync.pl 程序可能会暴露您的 LDAP 管理员密码。因此,Windows 客户端可能会缓存用户密码,从而对 Linux 安全性造成新的风险。请谨慎审慎地审查您的安全需求,并自行承担风险尝试此配置。作者和我们的雇主 Midwest Tool & Die 均不对您的安全承担任何责任。

LDAP 服务器安装和配置

我们讨论的 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 所示。

OpenLDAP Everywhere

图 2. 组织单元是 LDAP 树上的分支。

目录中的每个条目都通过专有名称 (dn) 唯一标识。LDAP 管理员的 dn 看起来像 dn: cn=manager, dc=foo, dc=com。

ou 提供了一种对条目进行分组的方法,如表 1 所示。

表 1. 用于分组条目的 ou 方法

我们以 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)。

OpenLDAP Everywhere

图 3. Mozilla 中的目录服务器属性对话框

从 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 中,您可以在任何 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 共享)

通过统一登录,用户拥有通过 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。
配置 Linux LDAP 客户端

您现在需要安装身份验证软件包 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
最终 Linux 服务器配置

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 在被访问之前是不可见的。

使用 Samba 和 LDAP 的 Microsoft Windows 统一登录

要实现 Windows 和 Linux 统一登录,首先配置 Samba 主域控制器 (PDC)。用户主目录与 SMB 客户端共享。Samba 配置的详细信息超出了本文的范围。

配置 ldapsync.pl 和 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 中用户的密码条目。

用更简单的术语来说,此过程的工作方式如下

  1. 用户从 Windows 调用密码更改程序。

  2. 用户单击“确定”以更改密码并将数据发送到 Samba 服务器。

  3. Samba 查看其配置文件,并知道调用 ldapsync.pl 来更改 LDAP 密码。

  4. ldapsync.pl 使用 -o %u 选项执行,这些选项指定程序在不提示输入旧密码的情况下运行。它在运行时将用户名传递给脚本(如果您不想在不知道 root 密码的情况下更改它,这很重要)。

  5. Samba 将用户的新密码传递给 ldapsync.pl,而无需关心旧密码是什么。

  6. ldapsync.pl 与 Samba 聊天,期望收到包含新密码的正确响应。

  7. 如果它正确通过聊天,则密码将由 ldapsync.pl 加密。

  8. 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)。

与 Samba 共享 NFS 共享

您的 NFS 共享可以通过在 NFS 主机上运行 Samba 服务器与 Windows 客户端共享。Samba 服务器必须加入您的 FOO SMB 域。在 Samba 服务器上运行以下命令以加入 SMB 域

smbbpasswd -j [FOO] -r [PDC]
维护

恭喜!您的 LDAP 服务器已启动并运行,具有共享电子邮件联系人、统一登录和可从任何客户端访问的共享文件存储。您可能需要编写一些管理实用程序来帮助维护用户和组帐户。再次,我们建议为此任务使用 Perl。

致谢

ldapsync.pl 最初由 Jody Haynes 为 Samba-Tng 编写。

资源

OpenLDAP Everywhere
Craig Swanson (craig.swanson@midwest-tool.com) 是 Midwest Tool & Die 的部分所有者,自 1993 年以来一直使用 Linux。他设计了公司网络,并担任软件开发和制造工程的导师。

OpenLDAP Everywhere
Matt Lung (matt.lung@midwest-tool.com) 在 Midwest Tool & Die 担任网络工程师。他于五月毕业于普渡大学,获得计算机工程技术学位。他配置了公司的虚拟专用网络,并且喜欢制造机器人。
加载 Disqus 评论