InDepth

作者:Sander van Vugt

在互联网上,人们可以找到大量的信息,这些信息通常被组织成非常不同的目录。X.500 首次尝试建立目录标准,它是一个地址簿,旨在为 X.400 邮件应用程序提供邮件地址。为了从该目录检索数据,使用了目录访问协议 (DAP),但这有点笨重。

后来开发了其他目录,虽然通常差异很大,但大多数目录都有一个共同点,即基于 X.500 标准。还出现了一种新的协议来检索数据,即轻量级目录访问协议 (LDAP),如今几乎可以在任何计算机平台上使用它来从几乎所有与 X.500 兼容的目录中获取数据。

本文将探讨轻量级目录访问协议的使用。首先,我们将了解可以使用 LDAP 访问数据的目录的组成,然后我们将了解如何在 Linux 中使用此协议。最后,我将解释如何甚至可以使用 LDAP 目录来验证系统上的用户身份,这可以作为网络信息服务 (NIS) 的一个有趣的替代方案。

术语

LDAP 可用于从与 X.500 兼容的目录中获取信息。此目录是一个分层组织的数据库,其中不同类型的数据可供访问。它通常用于存储名称和邮件地址,但您也可以保留有关网络资源的信息或验证 Linux 计算机上用户身份所需的一切信息。目录的层次结构是通过使用容器对象创建的,容器对象也称为目录组件 (DC)。这些 DC 可以与 DNS 层次结构中使用的域进行比较。LDAP 容器甚至可以链接到 DNS 域;因此,如果您的公司注册了 DNS 域名,例如 azlan.com,您可以创建 LDAP 组织单元来获取名称,例如 ou=training, dc=azlan, dc=com。

容器对象中是叶对象,也称为条目,因为它们实际上只是 LDAP 数据库中的条目。此类叶对象的一个示例是用户及其关联的邮件地址,以及(如果您愿意)验证系统上此用户身份所需的所有其他信息。每个条目都有一个唯一的名称,称为专有名称 (DN)。例如,Azlan 培训部门的用户 Paul,其注册的 .com 域,获得的专有名称为 cn=Paul, ou=training, dc=azlan, dc=com。除此之外,条目还有一个通用名称 (CN),它是对象在其容器中的唯一标识符;您可以将其与人的姓氏进行比较。

所有这些对象都具有定义与对象关联的信息的属性;例如,用户对象可以具有诸如电子邮件地址和密码之类的属性。如果您想使用 LDAP 来验证 Linux 用户的身份,则这些属性必须具有适当的值,这一点很重要。也就是说,如果您想能够使用 Linux 资源,则需要一个属性来表示 /etc/passwd 中的 UID 字段。条目的确切定义、它们可以在目录中出现的位置以及与之关联的属性都在模式中完成。在 Linux 中,条目在文件 slapd.oc.conf 中定义,属性在 slapd.at.conf 中定义。

用于将信息输入 LDAP 数据库的常用数据格式是 LDAP 数据交换格式 (LDIF)。如果您想使用它,那么为每个条目指定强制属性非常重要;否则,当您尝试定义对象时,您会收到一些讨厌的错误代码。强制属性在 spad.oc.conf 中定义。

OpenLDAP

在 Linux 中,可能最常用的 LDAP 实现是 OpenLDAP (www.openldap.org)。可用的专有目录是与 LDAP 兼容的,例如 Novell 的 eDirectory 或 Netscape 的目录。在 Linux 上安装 OpenLDAP 后(通常是默认服务器安装的一部分),一些文件会复制到您的系统。在我们查看实际配置之前,让我们先概述一下复制的不同文件。

作为 LDAP 安装一部分的最重要的程序文件是守护程序 slapd,即独立的 LDAP 守护程序。如果您想在系统上获得 LDAP 的所有优点,则需要激活此进程。如果您在网络上使用多个 LDAP 服务器,并且想要在这些服务器之间复制数据,则还需要 slurpd。 slurpd 是将数据从 LDAP 主服务器复制到一个或多个 LDAP 从服务器的进程。

要配置您的 LDAP 服务器,当然,您需要编辑一些配置文件。它们中的大多数都在 /etc/openldap 中,但请注意。有时相同的文件也位于其他目录中,例如 /etc,这可能会使获得良好的配置变得困难。如果 /etc/openldap 中的文件存在于多个位置,我个人更喜欢仅保留 /etc/openldap 中的文件,并在所有其他位置创建指向它们的链接。

最重要的配置文件是 slapd.conf;您几乎可以在其中指定 slapd 的所有行为,并且它是您在运行 slapd 之前想要编辑的文件。除了 slapd.conf 之外,还有两个文件用于保存模式:slapd.oc.conf 和 slapd.at.conf。在大多数情况下,您不需要对这些文件做任何事情;它们本身就很好。但是,在某些情况下,您确实需要编辑它们才能使应用程序工作。最后一个配置文件是 ldap.conf;它是一个小但重要的文件,在 LDAP 客户端上使用,用于标识客户端需要从中获取数据的服务器。

除了这些配置文件之外,还有一些命令可用于将数据放入目录中并测试其中是否确实有任何数据。 ldapadd 用于向目录添加数据,ldapmodify 用于修改现有条目的属性,ldapsearch 用于查找一些特定条目。通过这些命令以及其他一些命令,您可以使用 LDIF 文件来操作目录中的数据。

我们将要讨论的最后一个文件是模块,如果您想让系统在 LDAP 服务器上进行身份验证,则可以使用这些模块。它们是其他软件包的一部分,因此并非始终安装在您的系统上。名称服务交换使用的模块称为 nss_ldap。您需要在 /etc/nsswitch.conf 中指定您要从 LDAP 目录而不是例如 /etc/passwd 中检索信息。另一个重要的模块是 pam_ldap。这是您在 Linux 中需要的模块,通过可插拔身份验证模块 (PAM) 让您的用户在 LDAP 数据库上进行身份验证。事实上,在您的系统上配置 LDAP 目录并不困难。只需四个步骤即可完成设置。

1. 安装软件

如果 LDAP 未作为系统上的默认服务器安装的一部分安装,您可以从 http://www.openldap.org/ 或其镜像站点之一下载并安装它。要完成安装,首先使用类似以下命令解压 tarball

tar -zxvf openldap-stable-xxxxx.tgz

其中 xxxxx 是您下载的文件版本号。然后激活上一步中创建的目录,并在此目录中运行 configure 脚本。此脚本验证是否已满足在系统上安装 LDAP 的所有条件。运行 make;首先使用 make depend 建立依赖关系,然后仅使用 make 编译程序。现在,您可以通过在 /test 目录中运行 make 来查看是否一切编译正确。最后,您可以实际将软件安装到您的系统上;在解压 tarball 时创建的目录中键入 make install

2. 编辑配置文件 slapd.conf

安装后,您将在 /etc/openldap 目录中找到配置文件 slapd.conf 的示例。您需要对其进行编辑以满足您组织的要求。对于初学者,您无需使其过于复杂;编辑示例文件,使其看起来像清单 1 所示。

清单 1. slapd.conf 示例

让我们看一下此文件中最重要的行。前两行用于包含两个额外的配置文件。在本例中,它们是模式文件,它们根本没有被修改,但您确实需要指示 slapd 它可以在哪里找到它们。“schemacheck = off” 行也不是太令人兴奋;它告诉 slapd 它不必检查模式。之后还有另外两行指向一些额外的文件:slapd.pid,它保存 slapd 正在使用的 PID,以及 slapd.args,它保存 slapd 启动时使用的参数。然后有一行定义您正在使用的数据库类型。您可以指定 ldbm、shell 和 passwd,但 ldbm 是最常见的。

然后有三条重要的行。第一条以“suffix dc=azlan, dc=com”开头;此行定义 slapd 应在其中工作的标准容器。在我的例子中,它等于我工作的公司的 DNS 名称。然后,可以管理或修改数据库的帐户的名称以其完整的专有名称提及。第三行定义了此管理器使用的密码;如您所见,它以纯文本密码形式写入,这不是很安全,但我们稍后会讨论。

“directory /usr/local/var/openldap-ldbm” 行定义了 LDAP 数据库将安装到的目录的位置。确保其模式为 700,并且 slapd 进程的所有者可以读取和写入它。

在这些行之后,还有一些并非绝对必要但可能非常方便的选项。首先是“lastmod on”,此选项跟踪对对象进行修改的用户。为此,使用了属性 modifiersName、modifyTimestamp、creatorsName 和 createTimestamp。然后我们有一些进行索引的选项。不幸的是,OpenLDAP 并不是最快的 LDAP 目录,因此使用一些索引文件来加速它可能是值得的。loglevel 64(完成广泛的日志记录)如果您想更快地工作,则很好。此参数的最小值为 1,最大值为 256,介于两者之间,您可以使用 2、4、8、16、32、64 和 128。

最后,指定了对目录的一些访问权限。默认值为“read”,这意味着任何人都可以读取任何内容,包括密码。以“access to attr=userpassword”开头的四行包含关于谁可以对目录中的密码执行操作的规范。第一行指定允许每个人修改自己的密码。Root 允许写入任何密码,而普通用户可以读取但不能写入密码(当然,为了能够登录到系统)。

3. 启动 slapd

一旦您对 slapd.conf 的编辑感到满意,下一步就是启动 LDAP 守护程序 slapd。当然,您可以键入 slapd 来执行此操作,但您也可以通过添加选项 dn 来告诉它显示所有调试消息,其中 n 代表您想要看到的调试级别编号。

4. 向目录添加数据

现在您可以继续下一步,即向目录添加数据。在本例中,我们将添加一些简单的数据。为此,您必须编写一个 LDIF 文件,该文件可能具有清单 2 中显示的内容。

清单 2. LDIF 文件示例

如果您创建了一个类似清单 2 的文件,可以将其称为 ~/users.ldif,您可以使用以下命令将其添加到目录中

ldapadd -D "cn=manager, dc=azlan, dc=com" -W < ~/users.ldif

系统将提示您输入密码,当然,密码是 slapd.conf 中指定的 root 帐户的密码。如果一切顺利,数据现在应该已添加到目录中。

许多错误可以通过验证 slapd 是否真的在运行(哦,是的,这种情况会发生)以及您的配置或 LDIF 文件中是否有任何多余的空格来解决。

5. 查看是否工作

现在您已将数据添加到目录中,您可以实际确定它是否与命令一起工作

ldapsearch -L -b "dc=azlan, dc=com" -W "(objectclass=*)"

您应该获得目录中的所有数据作为结果返回(参见图 1)。

InDepth

图 1. ldapsearch

既然您已经走了这么远,您可以使用您的目录做很多事情。例如,您可以简单地使用浏览器并在 LDAP 目录中查找数据。但这并不是最有趣的部分。作为替代方案,您可以配置 Linux 客户端,以便不再在本地密码和 shadow 文件上进行身份验证,而是在 LDAP 服务器上进行身份验证,从而为您提供一个中心点来管理所有用户数据,而不是数百台计算机及其所有单独的密码文件。要实现这一切,请执行以下操作。

1. 安装软件

在您可以配置客户端以在 LDAP 服务器上进行身份验证之前,您应确保已安装所有必要的软件。如果您使用的是 RPM,则应存在软件包 openldap、auth_ldap 和 nss_ldap。您可以使用 rpm -q packagename 来验证这一点。如果它们不存在,您可以在 rpmfind.com 上找到它们。

2. 编辑 ldap.conf

通常,系统上有两个文件名为 ldif.conf。一个在 /etc 中,供 nss_ldap 和 pam_ldap 使用,以确定它们可以在哪里找到所需的信息。另一个在 /etc/openldap 中,供 ldapadd 和 ldapsearch 等实用程序使用,以确定它们应在哪个容器中工作。如前所述,删除其中一个并创建指向另一个的链接以简化操作。完成此操作后,您可以将必要的数据放入其中。对于简单的配置,您只需要两行

BASE    dc=azlan, dc=com
HOST    laetitia.azlan.com

第一行指定客户端应在其中查找数据的默认容器,第二行给出 LDAP 服务器的名称。当然,您的系统必须能够通过 DNS 或类似方式解析此名称,否则您可以使用 IP 地址。

3. 编辑 nsswitch.conf

接下来,您必须告诉名称服务交换它应该在哪里查找数据。通过编辑文件 /etc/nsswitch.conf 来执行此操作;它应包含以下行

passwd: files ldap
shadow: files ldap
group: files ldap

通过这些行,您的系统首先尝试在本地密码文件上验证用户身份,如果失败,则尝试在 LDAP 数据库上进行身份验证。因此,如果用户存在于 /etc/passwd 中,并且他或她给出了 /etc/shadow 中的密码,则不会使用 LDAP。

4. 编辑您的 PAM 配置

接下来,您应该查看 PAM。这是大多数现代 Linux 发行版上使用的机制,用于与用户身份验证相关的不同程序。例如,它可以被 login 使用,也可以被 FTP、su、ssh、passwd 等使用。在最新版本的 PAM 中,这些程序中的每一个都有一个配置文件,通常在 /etc/pam.d 中。在此配置文件中,您可以指定模块应使用的 PAM 模块。

如果您希望登录过程在 LDAP 上进行身份验证,则相应的配置文件可能如清单 3 所示。

清单 3. 登录执行身份验证

让我们简要解释一下。用户和密码信息在四个进程中使用。首先是身份验证,在 PAM 文件中以“auth”表示。此过程允许您进入系统,其职责之一是检查您的密码。然后是“account”,它验证用户是否具有任何可能阻止他或她登录系统的帐户限制。之后是“password”,如果您想更改密码,则使用它。最后,“session”指定如果您想使用您已通过身份验证的系统上的其他资源,则需要完成的任务。

这些模块中的每一个都有特定的任务。这些任务在 PAM 模块中指定,其中最重要的一个模块是 pam_unix.so。此模块负责正常的 passwd/shadow 身份验证,如果您想访问系统,通常是必需的。但是,如果您正在使用 LDAP,那么如果 LDAP 能够让您进入,那也很好。因此,在调用 pam_unix 的行之前,有一行调用 pam_ldap。它不是必需的(如果 LDAP 服务器关闭,您仍然希望能够使用您的系统),但它已足够。也就是说,如果您可以通过 pam_ldap 验证身份,则不必之后再转到 pam_unix。除了这两个主要模块之外,还有一些此处未讨论的次要模块。

5. 创建具有所有所需属性的用户

完成上述四个步骤后,您的计算机已准备好在 LDAP 目录上进行身份验证。但是您的目录也准备好了吗?要为身份验证准备目录,您需要将所有相关的用户属性放入其中,即通常在 /etc/passwd 和 /etc/shadow 中的所有信息。否则,如果您没有正确的用户 ID 和这些文件中的所有其他好东西,您将如何使用您宝贵的资源?要获取信息,您可以使用一些专门创建的 Perl 脚本来从计算机上的文件中获取信息并将其放入 LDAP 数据库中,或者您可以创建自己的 LDIF 文件来导入您想要的用户。

如果您想自动完成所有操作,则可以在 http://www.padl.org/ 上找到许多 Perl 脚本。有一些脚本可以导入几乎所有也可以在 NIS 数据库中的设置 — 您的密码文件、您的主机文件、您的网络文件等。但是,在您可以使用它们之前,您必须编辑通用配置文件 migrate_common.ph。在此文件中,您必须更改一些参数,这些参数指定了必须创建数据的位置。特别重要的是 DEFAULT_MAIL_DOMAIN 和 DEFAULT_BASE;它们分别指定用户拥有其电子邮件帐户的 DNS 域和必须在其中创建用户的 LDAP 容器。完成此操作后,您可以开始导入。对于每种不同的信息,都有一个单独的脚本;其中最有趣的可能是 migrate_all_online.sh(它导入所有网络信息)和 migrate_passwd.pl(它导入系统上的用户)。

完成此操作的另一种方法是通过 LDIF 文件,必须使用 ldapadd 将其内容添加到数据库中。此文件最重要的事情是指定所有正确的属性。清单 4 显示了如何确保这一点的示例。

清单 4. LDIF 文件的示例属性规范

此方法只有两个缺点。首先,当您在 LDIF 数据库中创建用户时,不会自动创建主目录,但是有一个名为 pam_mkhomedir.so 的 PAM 模块可以为您处理它。另一个问题是用户密码;没有很好的方法以加密形式将其放入数据库中。一种不太优雅的方法是先在 /etc/passwd 和 /etc/shadow 中创建用户,给他或她一个密码,然后从 /etc/shadow 中复制加密的字符串并放入您的 LDIF 文件中。

完成此操作后,您可以尝试一下。从本地文件中删除用户,打开登录提示符并尝试登录;它应该可以正常工作。

InDepth
Sander van Vugt (sander.van.vugt@azlan.nl) 居住在荷兰。他在 Azlan Training 担任 Linux、Novell 和 Nortel 技术培训师,并撰写了多本关于 Linux 的书籍和文章。
加载 Disqus 评论