Linux 网络信息服务简介

作者:Preston Brown

随着计算机网络的增长,在计算机之间共享通用的系统信息以向计算机用户呈现统一的外观变得越来越重要。为了共享文件,我们使用 NFS 或 Samba 协议与文件服务器通信。邮件通常保存在中心位置,并使用 POP3 或 IMAP 协议从客户端访问。然而,大多数 Linux 发行版在“开箱即用”时并未准备好共享配置文件信息。情况不必如此。

网络信息服务 (NIS) 是 Sun Microsystems 最初发明的一种系统,用于在网络上无缝分发共享配置文件。随着机器数量超过两三台,/etc/passwd 和 /etc/group 等文件的手动维护变得越来越困难。例如,如果用户 foo 在工作组或集群中的一台计算机上更改了他的密码,他可能会期望能够在房间另一端的机器上坐下,并使用他的新密码登录。然而,由于密码配置文件未共享,现实情况是他现在有两个密码;一个是在他刚坐下的机器上的新密码,另一个是在所有其他机器上的旧密码。每次他使用一台新计算机时,他都必须更改他的密码。随着机器数量的增加,这不仅仅是烦人而已。

虽然存在 NIS 以外的其他方案来保持文件同步,但它们通常是涉及 rcpcron 的“黑客”方法,并且在灵活性方面有很多不足之处。此外,NIS 已成为 UNIX 行业标准,受到包括 IBM (AIX)、惠普 (HP-UX) 当然还有 Sun (SunOS/Solaris) 在内的许多商业 UNIX 供应商的支持。因此,在异构 UNIX 环境中设置 Linux 计算机时,NIS 通常是规则而不是例外。

Linux NIS 支持

NIS 有两个主要版本。第一个版本称为 NIS,但历史上被称为 Yellow Pages 或 YP,Linux 对其提供了良好的支持。第二个版本称为 NIS+,是 NIS 的新实现,旨在通过加密和其他方法解决原始协议中的安全问题。Linux 中的 NIS+ 支持处于 Beta 质量,并且仅在新 glibc/libc6 中随时可用,而后者目前仅适用于已安装的 Linux 基础的一小部分。NIS+ 最适合非常大型的安装:在大多数情况下,“原始”NIS 已足够,并且在采取适当的预防措施时也相当安全。

长期以来,Linux 包含了支持 NIS 所需的大部分组件,但不幸的是,Slackware 和 Red Hat 等发行版未能提供足够的设置信息或完整的工具集。

文档在历史上也一直严重缺乏;NIS-HOWTO 长期以来被忽视且过时,直到 1997 年 11 月才最终从新的 NIS 维护者那里收到了一些重大更新。总的来说,在 Linux 上设置 NIS 一直被认为是管理员可以承担的最困难的管理任务之一。我希望通过本文改变这种看法。

NIS 支持涉及多个方面。为了提供配置文件,一台计算机充当 NIS“主服务器”。可以有多台 NIS 服务器机器,但除了主服务器之外的机器称为“从服务器”,仅用于故障安全冗余。所有从服务器计算机接收信息的其他计算机都称为“客户端”。本文主要介绍如何设置 Linux NIS 客户端,但也描述了将 Linux 配置为服务器的基础知识。配置 NIS 从服务器和其他高级功能的描述超出了本文的范围。如果您需要这些领域的更多信息,我建议您获取 O'Reilly 出版的优秀书籍 Managing NFS and NIS,尽管它以 Sun 为中心,但也有许多信息适用于 Linux。

设置 NIS 服务器

如果您的网络上没有 NIS 主服务器,则需要设置一个。如果您已经有一个,则可以跳过本节。用于设置 NIS 服务器的软件包在逻辑上称为 ypserv,在撰写本文时(二月)的最新稳定版本是 1.2.6。不幸的是,Red Hat 4.2 附带了一个旧版本,您可能不想使用它。在 Red Hat 镜像站点上的目录 /contrib/hurricane/SRPMS 中有一个贡献的 RPM,如果您获得源 RPM,则可以重建并使用它。否则,可以找到原始发行版的 URL 是 ftp://ftp.uni-paderborn.de/linux/local/yp/。

配置并安装 ypserv 软件包(它指定的默认位置很好)后,请确保它将在启动时启动。RPM 将安装适当的 SYSV 样式 init 脚本,但如果您使用的是其他 Linux,则必须在启动网络守护程序的配置文件(通常是 /etc/rc.d/rc.inet2)中添加一个命令来启动 /usr/sbin/ypserv。

NIS 服务器提供给客户端的文件不是实际的本地配置文件,而是这些文件的“编译”版本,称为 NIS“映射”。创建 NIS 映射的过程是通过 Makefile 完成的,因此我将该过程称为类似于编译。NIS 映射采用 gdbm UNIX 数据库格式,以便快速随机访问。所有这些发生的主要目录是 /var/yp。

您还必须专门为您的站点更新一些配置文件。如果您不希望通过 NIS 发布的所有传统文件都可供客户端使用,则必须编辑 /var/yp/Makefile 并删除您希望省略的文件的规则。典型的规则可能如下所示

networks: networks.byaddr networks.byname

标准的 Red Hat 4.2 系统没有 /etc/networks 文件;如果该文件不存在,则在运行 make 时会收到错误。使用开头的“#”字符注释掉此行。幸运的是,Makefile 包含大量文档,其中包含所有不同的选项,因此对其进行更改非常容易。

出于安全原因,您可能还需要编辑 /etc/ypserv.conf 并更改一些默认值。ypserv.conf 的手册页解释了每个选项。最重要的选项是 sunos_kludge,如果您在 NIS 网络上有旧的 SunOS 4.1.x 机器,则必须将其设置为“yes”,以及“hosts”部分,该部分允许您包含和排除某些主机访问服务器上的特定 NIS 映射。ypserv 守护程序还支持 TCP wrappers 软件包,这为您提供了另一种细粒度访问控制选项。但这篇不是关于安全性的文章,因此如果您在安全性至关重要的环境中安装服务器,请仔细阅读服务器附带的文档。

您快完成了;您需要做的最后一件事是从本地配置文件创建 NIS 映射的初始构建。为此,请在 /var/yp 中运行 make。这将创建许多您永远不必更改的文件,但这些文件实际上会被提供给客户端。如果在 make 过程中收到错误,则很可能是 make 尝试转换为 NIS 映射的文件之一不存在。检查其是否存在;如果它不存在或者您不想构建它,请在 Makefile 中注释掉它。

如果您希望用户能够在客户端机器上而不是仅在服务器上更改密码,则必须运行 rpc.yppasswdd 守护程序。它随 NIS 服务器一起提供,并且有良好的文档。它所要做的就是在 ypserv 启动后在启动时运行。

现在设置已完成。重新启动您的机器,当它重新启动后,使用 ps 确保 ypserv 和 rpc.yppasswdd 正在运行。如果它们正在运行,客户端应该能够连接。在继续客户端设置之前,还有一些最后的注意事项。首先,请记住 NIS 映射 不是 与本地配置文件相同的,即使它们是从本地配置文件创建的。每次您更改本地文件(如 /etc/passwd 或 /etc/netgroup)时,都需要通过进入 /var/yp 并运行 make 来重建 NIS 映射。您可能希望设置一个 cron 作业,每小时执行一次此操作,以防您进行了一些更改但忘记重建。其次,如果您希望能够在服务器上查看 NIS 映射,则必须将其配置为客户端。按照下一节中的步骤进行操作。

设置 NIS 客户端

我将描述如何在运行 Red Hat 4.2 发行版的 Linux 机器上设置 NIS。但是,我介绍的内容通常适用于任何运行基于 libc5 的系统且 libc 中包含 NYS NIS 支持库(Red Hat 就是这种情况)或新的 libc6 系统的 Linux 机器。如果您不幸不属于这两种情况中的任何一种,我建议您全面升级您的 Linux 发行版,或者去 sunsite.unc.edu 获取不同的 libc。(升级 libc 不是一项适合胆小者的任务。)

将 Red Hat Linux 变成 NIS 客户端所需的两个软件包是 yp-clients-2.2ypbind-3.3。这些工具以字母“yp”开头是出于历史原因。如果您想获取 tar.gz 文件,它们可在 ftp://ftp.uni-paderborn.de/linux/local/yp/ 上获得。否则,您可以使用任何 Red Hat FTP 站点的预打包 RPM。 yp-clients 软件包位于标准二进制 RPMS 目录中,但 ypbind 软件包仅在“contrib/SRPMS”区域中可用。您可以在没有 ypbind 的情况下运行 NIS,但并非所有功能都可用。但是,您会想要这些功能,因此请获取 RPM 或源代码,编译并安装它。

安装这些软件包后,验证您是否正在运行端口映射器。端口映射器启用远程过程调用 (RPC) 机制,NIS 和 NFS 等都使用该机制。如果您已经运行 NFS,则无需担心。否则,请为您的相应发行版安装 portmap 软件包;它应该包含在内。

现在您已经安装了各种组件,您必须设置一些配置文件以在启动时启用 NIS。首先,您必须确定客户端将在其中运行的 NIS 域。这 不是 与您的 DNS 域相同的事物,尽管有时名称相同。NIS 域的传统位置在文件 /etc/defaultdomain 中。此文件应包含一行,其中包含您的 NIS 域名,例如,econ.yale.edu。但是,仅此文件的存在不会设置域名;要实际设置名称,您必须使用 domainname 命令。通常,这是在启动时从 init 脚本完成的。在 Red Hat 上,添加行

domainname `cat /etc/defaultdomain`

在 /etc/rc.d/rc.sysinit 的顶部附近。在非 SYSV init 系统(如 Slackware)上,要更改的适当文件很可能是 /etc/rc.d/rc.inet2。主要目标是在启动过程中“尽早”运行 domainname,在可能依赖 NIS 运行的其他网络服务之前,但在网络硬件初始化和 IP 地址信息设置之后。

接下来,您必须启动 ypbind 守护程序,这将启用 NIS 客户端服务。如果您安装了上面引用的 ypbind RPM,则适当的 SYSV 样式启动文件应该已准备就绪。否则,您将必须自己启动 ypbind。在初始化 NIS 域名的行之后插入对 /usr/sbin/ypbind 的调用。

第三,创建文件 /etc/yp.conf 并包含行

ypserver

servername 替换为您的 NIS 主服务器或从服务器的主机名,其主机名也必须在 /etc/hosts 中列出。您可以在单独的行中列出多个服务器;如果一台主机在启动时关闭,客户端将尝试其他主机。未能创建此文件不会禁用 NIS,但 ypbind 将在您的整个 IP 子网上广播对服务器的请求,这可能是一个重大的安全漏洞。有人可以在您的子网上设置一个流氓 NIS 服务器,然后向您提供虚假的配置文件。防患于未然——创建 /etc/yp.conf。

还不错,对吧?现在您已准备就绪。重新启动您的机器,当它重新启动后,登录并进行一些诊断。首先键入 domainname,不带任何参数,以确保它响应正确的 NIS 域。如果不是,请检查设置域的命令是否已正确运行。然后键入 ypwhich,该命令告诉您您正在与哪个 NIS 服务器通信。如果一切顺利,它将响应您在 /etc/yp.conf 文件中列出的服务器。现在是时候让 NIS 工作了。

常用 NIS 命令

yp-clients 软件包附带了许多有用的命令行实用程序,用于查询 NIS 系统。 ypwhich 告诉您您绑定到哪个 NIS 服务器。键入命令 ypcat filename 将显示通过 NIS 提供的文件的内容。例如,ypcat passwd 将显示 NIS 密码文件。键入命令 ypmatch key filename 将匹配指定文件名中的“key”。例如,我可以执行 ypmatch pbrown passwd,它将返回我的帐户的条目。这些命令在 shell 脚本、调试 NIS 设置问题和许多其他创造性方式中都很有用。

设置 nsswitch.conf

用于告诉您的客户端计算机从 NIS 获取哪些文件以及从硬盘驱动器本地获取哪些文件的文件称为 /etc/nsswitch.conf。此文件包含在 Red Hat Linux 中,但如果您没有副本,则应该能够从 libc 发行版或 NIS-HOWTO 中获取示例。该文件的格式与 Solaris 中的格式相同,因此如果您熟悉该格式,则领先一步。如果不是,则简短的教程很有用。

nsswitch.conf 文件由以下形式的条目组成

filename:

冒号前的行部分描述了所讨论的文件,例如 passwd 或 group。冒号后的信息描述了应如何获取该文件。我们关心的访问方法包括 niscompatfiles。访问方法是累积的;如果指定了多种方法,它们 相加 以创建最终文件。例如,条目

passwd: files nis
将首先读取本地密码文件,然后读取 NIS 密码文件,从而生成两者的混合体。如果存在重复条目,则列表中排在前面的访问方法优先。

最有可能的是,所有行都说 files nisplus nis 作为访问方法。您没有运行 NIS+,因此将跳过该方法,一切都会顺利——您最终将获得本地文件和 NIS 文件的组合,这可能正是您想要的。但是,您可能希望更精细地控制来自 NIS 文件的哪些条目添加到您的本地文件。这就是 compat 访问方法发挥作用的地方。

如果您将 compat 列为唯一的访问方法,则启用密码文件和组文件中的特殊语法。默认情况下,不咨询 NIS 版本的 文件;仅使用本地文件。要从 NIS 文件添加条目,请在以“+”字符开头的密码/组文件中放置行。例如,如果我想将单个用户 steveb 添加到我的本地密码文件中,我将在密码文件的末尾放置以下行

+steveb::::::

冒号是通常包含在密码文件中的字段的占位符。任何省略的信息都将从 NIS 文件中填写。在这里,我省略了除用户名之外的所有内容;所有其他信息(密码、全名字段、主目录、shell)将由 NIS 自动替换。同样,如果您想在此计算机上更改 steveb 的 shell,您可以使用此行作为他的条目

+steveb::::::/usr/local/bin/newshell
除名称和 shell 外的所有字段都将通过 NIS 获取。要包含密码文件中的所有人,您将包含此条目
+::::::
/etc/group 的行是类似的。如果您为组启用 compat 访问方法,则可以通过包含以下内容来包含单个组
+mygroup:::
在您的组文件末尾。要仅包含组中的少数用户(与 NIS 映射中列出的用户不同),请放置如下行
+mygroup:::steveb,pbrown,jrust
其中包含的用户被明确拼写出来。

也可以使用“-”字符而不是“+”字符,并且会按照您的预期执行操作——它从文件中删除指定的登录名或组。唯一的警告是,您必须在任何其他可能包含用户的行之前包含“-”行。例如,如果 jrust 包含在 NIS 密码文件中,并且您想从本地计算机中删除他,但允许其他人访问,您将在密码文件的末尾添加这两行

-jrust::::::
+::::::

另一种常见情况是您想阻止用户登录,但又希望他们的信息在密码文件中可用。为此,您将在密码文件的末尾添加行

+::::::/bin/false
在先前包含一些特权用户(如系统管理员)之后。由于登录的用户将没有 shell,因此他们将立即被踢出,但他们的所有信息都将通过 ypcat 或其他 NIS 工具在计算机上可用。一个注意事项——不要在密码或组文件的开头放置任何“+”或“-”行,否则您的计算机将在启动时挂起。这可能已在 libc6 中修复,但在 libc5 中这是一个问题。
netgroup 文件

netgroup 文件为系统管理员提供了一种强大的方式,可以将用户和主机分组到不同的组中,然后在客户端计算机上设置 NIS 访问权限时可以引用这些组。netgroup 文件维护在 NIS 主服务器上的 /etc/netgroup 中。它由组名后跟一个或多个以下格式的条目组成

(

例如,您可能有如下一行

sysadmins (,pbrown,) (,kbrown,) (,vladdy,) (,ieong,)
这将把列出的四个用户放入 netgroup sysadmins 中。然后,您可以使用此特殊组在客户端上的 /etc/passwd 等文件中使用“+/-”表示法。例如,要允许 sysadmins 组访问特定的 NIS 客户端计算机,但不允许其他人访问,您将在密码文件的末尾使用如下条目
+@sysadmins
+:::::/bin/false
请注意,netgroup 名称前面带有“@”字符,以便 NIS 知道这是您引用的 netgroup,而不是普通用户名。

您可以将 netgroup 用于各种创造性的事物。创建一个 netgroup,其中列出了危险用户,并在密码文件中使用“-”行来禁止他们,但包括其他人。为您网络上的所有“半私有”机器创建 netgroup,并列出这些机器的有效用户。将它们包含在您的密码文件中,以便仅向这些用户授予访问权限。可能性几乎是无限的。

其他细节

虽然在大多数情况下,您正在运行 NIS 而不是使用传统配置文件这一事实将是完全透明的,但在少数情况下并非如此。其中最明显的是,您无法使用 passwd 命令在客户端机器上更改密码。如果您这样做,每次使用该命令时,整个 NIS 密码映射都将附加到本地 /etc/passwd 文件,这肯定不是预期的效果。这可能已在 libc6 中更改,但在 Red Hat 4.2 附带的标准实用程序中绝对是一个问题。但是,并非所有希望都破灭了;有一个解决方案,它称为 yppasswd。此实用程序的作用与 passwd 完全相同,但会调用 NIS 服务器来执行实际更改,而不是尝试在本地更改内容。NIS 服务器必须通过运行 yppasswdd 守护程序来支持此功能。在没有它的情况下,您将不得不告诉用户登录到 NIS 服务器来更改他们的密码,这只是一个小小的麻烦。

如果您在设置服务器或客户端时遇到麻烦,则问题最有可能的来源是 /etc/nsswitch.conf 文件。确保每一行都在创建您想要的表现,并且在有疑问时请参阅手册页。另外,检查密码和组文件中的“+/-”语法,并确保它遵循正确的表示法。小的拼写错误可能会产生广泛的影响,因此请仔细校对。

不幸的是,我无法希望涵盖设置复杂分布式网络环境的所有细节。您很可能存在此处尚未解决的独特问题或疑虑。如果是这种情况,我强烈推荐之前提到的 O'Reilly 关于 NIS(和 NFS)的书籍。如果所有这些方法都行不通,请尝试 Usenet 上的 Linux,尤其是 Sun 新闻组。很有可能其他人以前已经处理过您的问题。

祝您在 Linux 网络上成功设置 NIS。您最初投入的几个小时将在长期内为您节省数天的头痛时间。

Preston Brown 今年春天将从耶鲁大学毕业,获得计算机科学学士学位。他已担任耶鲁大学经济学系系统管理员三年多,并且非常熟悉设置 NIS 的乐趣。您可以通过 preston.brown@yale.edu 与他联系,提出您的问题和意见。

加载 Disqus 评论