13.1. NIS 简介

NIS 将数据库信息保存在名为 maps 的文件中,这些文件包含键值对。一个键值对的例子是用户的登录名及其加密形式的登录密码。Maps 存储在运行 NIS 服务器的中央主机上,客户端可以通过各种 RPC 调用从中检索信息。通常,maps 存储在 DBM 文件中。[1]

maps 本身通常从主文本文件生成,例如/etc/hosts/etc/passwd。对于某些文件,会创建多个 maps,每种搜索键类型一个。例如,您可以搜索hosts文件以查找主机名以及 IP 地址。因此,从中派生出两个 NIS maps,分别称为hosts.bynamehosts.byaddr表 13-1 列出了常见的 maps 以及生成它们的文件。

表 13-1. 一些标准的 NIS Maps 及其对应的文件

主文件Map(s)描述
/etc/hosts

hosts.byname, hosts.byaddr

将 IP 地址映射到主机名

/etc/networks

networks.byname, networks.byaddr

将 IP 网络地址映射到网络名称

/etc/passwd

passwd.byname, passwd.byuid

将加密密码映射到用户登录名

/etc/group

group.byname, group.bygid

将组 ID 映射到组名

/etc/services

services.byname, services.bynumber

将服务描述映射到服务名称
/etc/rpc

rpc.byname, rpc.bynumber

将 Sun RPC 服务号映射到 RPC 服务名称

/etc/protocols

protocols.byname, protocols.bynumber

将协议号映射到协议名称

/usr/lib/aliasesmail.aliases

将邮件别名映射到邮件别名名称

您可能会在其他 NIS 软件包中找到对其他文件和 maps 的支持。这些通常包含本书未讨论的应用程序的信息,例如bootparamsmap,Sun 的 bootparamd 服务器使用它。

对于某些 maps,人们通常使用别名,它们更短,因此更容易键入。请注意,这些别名仅被 ypcatypmatch 这两个用于检查 NIS 配置的工具所理解。要获取这些工具理解的别名完整列表,请运行以下命令
$ ypcat -x
Use "passwd" for "passwd.byname"
Use "group" for "group.byname"
Use "networks" for "networks.byaddr"
Use "hosts" for "hosts.byaddr"
Use "protocols" for "protocols.bynumber"
Use "services" for "services.byname"
Use "aliases" for "mail.aliases"
Use "ethers" for "ethers.byname"

NIS 服务器程序传统上称为 ypserv。对于一般的网络,通常一个服务器就足够了;大型网络可以选择在不同的机器和网络的不同网段上运行多个服务器,以减轻服务器机器和路由器的负载。这些服务器通过将其中一个设为主服务器,其余的设为从服务器来同步。Maps 仅在主服务器的主机上创建。从那里,它们被分发到所有从服务器。

我们一直在非常模糊地谈论“网络”。NIS 中有一个独特的术语,指的是通过 NIS 共享其系统配置数据的所有主机的集合:NIS 域。不幸的是,NIS 域与我们在 DNS 中遇到的域完全不同。为了避免本章中的任何歧义,我们因此将始终明确指出我们指的是哪种类型的域。

NIS 域具有纯粹的管理功能。它们对用户来说几乎是不可见的,除了域中所有机器之间共享密码。因此,给 NIS 域的名称仅与管理员相关。通常,任何名称都可以,只要它与本地网络上的任何其他 NIS 域名不同即可。例如,Virtual Brewery 的管理员可以选择创建两个 NIS 域,一个用于 Brewery 本身,一个用于 Winery,她分别命名为 brewerywinery。另一种非常常见的方案是也为 NIS 使用 DNS 域名。

要设置和显示主机的 NIS 域名,您可以使用 domainname 命令。当不带任何参数调用时,它会打印当前的 NIS 域名;要设置域名,您必须成为超级用户
# domainname brewery

NIS 域确定应用程序将查询哪个 NIS 服务器。例如,Winery 主机上的 login 程序当然应该只查询 Winery 的 NIS 服务器(或者其中一个,如果有多个)以获取用户的密码信息,而 Brewery 主机上的应用程序应该坚持使用 Brewery 的服务器。

现在仍然存在一个谜团需要解决:客户端如何找出要连接到哪个服务器?最简单的方法是使用一个配置文件,其中命名要查找服务器的主机。然而,这种方法相当不灵活,因为它不允许客户端根据服务器的可用性使用不同的服务器(当然,来自同一个域)。因此,NIS 实现依赖于一个名为 ypbind 的特殊守护程序来检测其 NIS 域中合适的 NIS 服务器。在执行任何 NIS 查询之前,应用程序首先从 ypbind 找出要使用的服务器。

ypbind 通过广播到本地 IP 网络来探测服务器;第一个响应的服务器被认为是速度最快的服务器,并在所有后续的 NIS 查询中使用。在一定时间间隔过去后,或者如果服务器变得不可用,ypbind 会再次探测活动服务器。

仅当您的网络提供多个 NIS 服务器时,动态绑定才有用。动态绑定也引入了一个安全问题。ypbind 盲目地相信任何响应者,无论是普通的 NIS 服务器还是恶意入侵者。不用说,如果您通过 NIS 管理密码数据库,这将变得特别麻烦。为了防止这种情况,Linux ypbind 程序为您提供了探测本地网络以查找本地 NIS 服务器的选项,或者在配置文件中配置 NIS 服务器主机名。

注释

[1]

DBM 是一个简单的数据库管理库,它使用哈希技术来加速搜索操作。GNU 项目有一个免费的 DBM 实现,称为gdbm,它是大多数 Linux 发行版的一部分。