酒厂管理信息系统
今天,几乎所有的UN*X都包含了NIS,甚至还有它的免费实现版本。一个是来自BSD的Net-2发行版,它源自Sun捐赠的公共域参考实现。这个版本的客户端库代码在GNU的libc中已经存在很久了,hypervisor是最近才被Swentü mmler [1]移植到Linux上的。此参考实现中缺少NIS服务器程序。Tobias Reber编写了另一个NIS软件包,其中包括所有的工具和一个服务器。这个包叫yps。[2]
目前,[3]已经编写了一个完全重写的码,称为,它支持普通的和孙的“+”。NYS不仅提供了一个NIS工具集和一个服务器,还添加了一个全新的库函数集,最终可能会添加到标准的libc中。这包括使用host.conf替换当前主机名解析的新设置方案。下面将讨论这些函数的特征。
这一章将集中讨论NYS,而不是另外两个软件包,我称它们为“传统的”NIS码。如果您真的想运行这些包中的任何一个,本章中的说明可能不够。要了解更多信息,请找一本关于NIS的标准(权威)书籍,比如像哈尔·斯特恩的《NFS和NIS》(见[斯特恩92])。
目前,NYS仍处于开发阶段,因此网络程序或登录程序等标准Linux工具尚未关注NYS的配置方案。只有当NYS并入主流libc后,如果想让这些执行程序全部使用NYS,就需要重新编译。在这些应用程序的Makefiles中,在libc之前,指定-lnsl作为链接器的最后一个选项。这将从libnsl-NYS库中连接相关函数,而不是从标准C库中连接。
10.1了解NIS
NIS将数据库信息存储在所谓的包含键值对的映射中。地图存储在运行NIS服务器的中央主机中,客户可以通过各种RPC调用从该主机中检索信息。大多数情况下,地图存储在DBM文件中。[4]
Maps本身是从主要的文本文件(如/etc/hosts或/etc/passwd)中生成的。对于某些文件,会生成多个映射,每个映射对应一种搜索关键字类型。例如,您可以在hosts文件中搜索主机名和IP地址。相应地,将生成两个NIS映射,分别称为hosts.byname和hosts.byaddr。表10.1列出了通用地图及其生成的文件。
主文件映射
/etc/hosts
/etc/networks
/etc/密码
/etc/group
/etc/服务
/etc/rpc
/etc/协议
/usr/lib/aliases hosts . by name hosts . by addr
网络名网络名地址
Passwd.byname
Group.byname group.bygid
services . by name services . by number
Rpc.byname rpc.bynumber
协议.别名协议.编号
邮件.别名
表10.1部分标准NIS地图及相应文件。
在一些NIS软件包或其他软件中,有一些其他的文件和地图可能对你有用。这些文件和映射可能包含本书中没有讨论的应用程序的信息,例如可能在某些BOOTP服务器中使用的bootparams映射,或者当前在Linux中不包含任何功能的文件(如ethers.byname和ethers.byaddr映射)。
对于一些地图,人们通常使用昵称,昵称很短,易于键入。要获得NIS工具可以理解的昵称的完整列表,请运行以下命令:
$ ypcat–x
NIS地图昵称翻译表:
" passwd "->;" passwd.byname "
"组"->;" group.byname "
"网络"->;"网络地址"
"主机"->;"主机.别名"
“协议”->;"协议.按号码"
"服务"->;" services.byname "
"别名"->;"邮件.别名"
“醚类”->;" ethers.byname "
" RPC "->;" rpc.bynumber "
"网络掩码"->;"网络掩码. byaddr "
"公共密钥"->;" publickey.byname "
" netid "->;" netid.byname "
" passwd . adjunct "->;" passwd.adjunct.byname "
" group . adjunct "->;" group.adjunct.byname "
"时区"->;" timezone.byname "
NIS服务器传统上称为ypserv。对于中等规模的网络,单台服务器通常就足够了;大型网络可能需要在不同的网段和不同的机器上运行多台服务器,以减少服务器和路由器的负载。通过使用这些服务器中的一个作为主服务器,其他服务器作为从服务器,这些服务器被同步。地图将只建立在主服务器上。将它们从主服务器分发到所有辅助服务器。
你可能注意到了,我们一直在含糊地谈论“网络”;当然,NIS所指的这种网络有一个独特的概念,即通过NIS***: NIS域享有其部分系统配置数据的所有主机的集合。不幸的是,NIS域名与我们在DNS中遇到的域名毫无共同之处。为了避免这一章的歧义,我将总是指出我所谈论的是哪一种类型的领域。
NIS域只有纯管理功能。它们对用户来说基本上是不可见的,除了域中所有机器之间* * *共享密码。因此,给予NIS域的名称只与管理员相关。通常,您可以使用任何名称,只要它不同于本地网络上的其他NIS域名。例如,虚拟酿酒厂的管理员可以选择建立两个NIS域,一个用于酿酒厂本身,另一个用于酿酒厂,她分别将其命名为brewery和winery。另一个非常常见的方案是简单地使用DNS域名作为NIS的域名。要设置和显示主机的NIS域名,可以使用dommainname命令。当它在没有任何参数的情况下被调用时,它打印出当前的NIS域名;要设置此域名,您必须成为超级用户并键入:
#域名啤酒厂
NIS域决定了应用程序将查询哪个NIS服务器。比如酒厂主机上的登录程序(当然)只会向酒厂的NIS服务器(或者其中一个,如果有多个服务器的话)查询用户的密码信息;啤酒厂主机上的应用程序将只查询啤酒厂服务器。
还有一个疑问需要解决,就是一个客户怎么知道要连接到哪个服务器。最简单的方法是有一个配置文件,它给出了要查看的服务器的主机名。然而,这种方法非常不灵活,因为它不允许客户根据这些服务器是否存在来使用不同的服务器(当然,来自同一个域)。因此,传统的NIS实现依赖于一个名为ypbind的特殊后台程序来检测其NIS域中合适的NIS服务器。在执行任何NIS查询之前,任何应用程序都必须首先从ypbind中找到要使用的服务器。
Ypbind通过向本地IP网络广播来探测服务器;第一个响应的服务器基本上是最快的,将用于后续的NIS查询。经过一段时间后,或者如果服务器不工作,ypbind将再次探测正在运行的服务器。
现在,关于动态绑定的争论是,你很少需要它,它会带来安全问题:ypbind盲目信任任何响应者,而这个响应者可能是一个不起眼的NIS服务器,也可能是一个恶意的入侵者。不用说,如果你在NIS上管理你的密码数据库,这将成为一件特别麻烦的事情。为了防止这个问题,NYS在默认情况下不使用ypbind,而是从配置文件中获取服务器的主机名。
NIS和NIS+
NIS和NIS+除了在名称上有着相同的目标之外,几乎没有什么共同之处。NIS+是以完全不同的方式构建的。它使用类似于DNS的分层名称空间,而不是平面名称空间和松散分离的NIS域。它使用所谓的由行和列组成的表格,而不是地图。在NIS+数据库中,表中的每一行代表一个对象,列代表NIS+知道并关心的对象的属性。给定NIS+域的每个表都由它们的父域的表组成。此外,表中的条目可以包含到另一个表的链接。这些特征使得以多种方式构建信息成为可能。
传统NIS的RPC版本号是2,而NIS+是版本3。
NIS+到目前为止好像还没有广泛使用,我其实也不太了解。嗯,我对此几乎一无所知。正因如此,这里就不赘述了。如果你对它感兴趣并想了解更多,请参考孙的管理手册([NISPlus])。
10.3客户端的NIS
如果您熟悉编程或移植网络应用程序,您会注意到上面列出的许多NIS映射对应于C库中的库函数。例如,要获得passwd信息,通常使用getpwnam(3)和getpwuid(3)函数,这两个函数分别返回与给定用户名或数字用户id对应的帐户信息。在正常情况下,这些函数将在标准文件(如/etc/passwd)中执行请求的查找。
然而,这些函数的基于NIS(NIS感知)的实现将改变这种行为,并且将启用RPC调用来让NIS服务器查询用户名或id。这个操作对应用程序是完全透明的。此功能可以“附加”或“替换”NIS地图的原始文件。当然,这实际上并没有修改文件,只是让应用程序看起来好像文件被替换或附加了。
对于传统的NIS实现,对于那些要被替换的地图和那些要被添加到原始信息的地图,有一些约定。有些地图(比如passwd地图)需要对passwd文件做hash修改,错了就会打开安全漏洞。为了避免这个缺陷,NYS有一个常规的配置方案,它决定了一个特定的客户端功能集是否使用原始文件,NIS和NIS+,以及使用的顺序。这将在本章后面讨论。
10.4运行NIS服务器。
经过这么多理论上的喋喋不休,现在我们开始做实际的配置工作。在本节中,我们将讨论NIS服务器的配置。如果你的网络上已经有一个NIS服务器在运行,你就不用自己设置服务器了;在这种情况下,您可以安全地跳过这一部分。
请注意,如果您只是要试验服务器,请确保您没有设置已经在您的网络上使用的NIS域名。因为会让整个网络服务瘫痪,让很多人不开心,生气。
目前有两个现有的Linux免费NIS服务器,一个包含在Tobias Reber的yps包中,另一个包含在皮特·埃里克松的ypserv包中。不管您运行哪一个,是使用NYS还是当前libc中的标准NIS客户端代码,都没有关系。在写这本书的时候,yps中NIS二级服务器处理的代码似乎更加完善。所以如果要涉及辅助服务器,yps可能是更好的选择。
在/usr/sbin中安装服务器程序(ypserv)后,您应该创建一个目录来存储服务器分发的地图文件。当为brewery域设置NIS域时,地图将存储在/var/yp/brewery中。服务器通过检测是否存在映射目录来确定它是否正在服务于特定的NIS域。如果您禁用了某些NIS域的服务,请务必同时删除该目录。
为了加快查询速度,地图通常存储在DBM文件中。它们是用一个名为makedbm(用于Tobias的服务器)或dbmload(用于Peter的服务器)的程序从主文件创建的。它们不可互换。将主文件转换成可以被dbmload分析的形式,通常需要一些awk或者sed的技巧,这对于输入来说有点枯燥和难记。因此,Perter Eriksson的ypserv包包含一个Makefile(称为ypMakefile),它将为您完成所有工作。您应该将它作为Makefile文件安装在您的地图目录中,并对其进行编辑以反映您想要分发的地图。在文件的开头,您会发现all目标,它列出了ypserv将提供的服务。默认情况下,该行如下所示:
all:ethers hosts networks protocols RPC services passwd group netid
例如,如果您不想生成ethers.byname和ethers.byaddr映射,只需从该规则中删除ethers先决条件。为了测试你的设置,一开始只用一两张地图就够了,比如服务。*地图。
在map的目录下,编辑Makefile后,键入“make”。这将自动生成并安装地图。您必须确保无论何时更改主文件,都必须更新映射,否则网络仍然看不到这些更改。
下一节将解释如何配置NIS客户端代码。如果您的安装设置不起作用,您应该查明是否有任何请求到达您的服务器。如果您为NYS服务器指定-D命令行标志,它将在控制台上打印出关于所有传入NIS查询的调试信息,并返回结果。这些会给你一个提示来确定问题是什么。Tobias的服务器没有这个选项。
10.5与NYS建立NIS客户。
在本章的其余部分,我们将讨论NIS客户的配置。
您的第一步应该是告诉NYS哪个服务器用于NIS服务,并在/etc/yp.conf配置文件中设置它。对于酒厂网络主机上的一个简单示例文件,它看起来像这样:
# yp . conf–NYS图书馆的yp配置。
#
域名酒庄
服务器vbardolino
第一条语句告诉所有NIS客户,他们属于酒厂NIS域。如果您省略这一行,NYS将使用您通过域名命令分配给系统的域名。server语句指定了使用的NIS服务器。当然,必须在hosts文件中设置vbardolino对应的IP地址;此外,还可以在server语句中使用IP地址本身。
在上面显示的表单中,server命令告诉NYS使用指定的服务器,而不考虑当前的NIS域。但是,如果您经常在不同的NIS域中移动您的计算机,您可能希望在yp.conf文件中保存几个域的信息。您可以通过在server语句中添加NIS域名来获得几个NIS域服务器的信息。例如,您可以为便携式计算机更改上面的示例文件,如下所示:
# yp . conf–NYS图书馆的yp配置
#
服务器vbardolino酒厂
服务器vstout啤酒厂
这允许您在系统启动时通过domainname命令设置所需的NIS域,以便在任一域中使用便携式计算机。
在创建了这个基本配置文件并确保它是可读的之后,您应该运行第一个测试来检查您是否可以连接到您的服务器。确保选择由您的服务器分发的任何映射,例如hosts.byname,并尝试使用ypcat工具来检索它。Ypcat和所有其他NIS管理工具一样,应该存在于/usr/sbin中。
# ypcat主机.别名
vbeaujolais.linus.lxnet.org vbeaujolais
vbardolino vbardolino.linus.lxnet.org
191 . 72 . 1 . 1弗拉杰vlager.linus.lxnet.org
vlager.linus.lxnet.org弗拉格勒
191 . 72 . 1.2 vstout vstout.linus.lxnet.org
191.72.1.3淡水河谷vale.linus.lxnet.org
vchianti.linus.lxnet.org vchianti
您得到的输出应该类似于上面显示的内容。如果您收到一条错误消息,指示“无法绑定到哪个服务器的服务器域”或类似信息,则您设置的NIS域名与yp.conf中的服务器不匹配,或者由于某种原因找不到该服务器。Ping后一种情况,请确保ping该主机会产生正确的结果,并且它确实在运行NIS服务器。您可以使用rpcinfo来验证后者,这将产生以下输出:
# rpcinfo–u server host ypserv
程序100004版本2准备就绪,正在等待
选择正确的地图。
确定可以联系NIS服务器后,您必须决定用NIS地图替换或添加哪个配置文件。通常,您会将NIS映射用于主机和密码查找功能。当不使用BIND时,前者特别有用。后者允许所有用户在NIS域的任何系统上登录他们的帐户;这通常需要通过NFS在所有主机之间共享一个中央/主目录。这将在第10.7节中详细讨论。其他地图(如services.byname)并不那么引人注目,但如果您安装的任何网络应用程序使用的服务名称不在标准服务文件中,它们可以为您节省一些编辑工作。
通常,当查找函数使用本地文件并询问NIS服务器时,您希望有一些自由选择。NYS允许您配置函数访问这些服务的顺序。这是由/etc/nsswitch.conf文件控制的,该文件引用名称服务开关,但不限于名称服务。对于NYS支持的任何数据查找函数,它都包含一行指定所使用的服务。
服务的正确顺序与数据类型有关。services.byname的映射不需要包含来自本地服务文件的不同条目;它可以包含更多的项目。因此,一个好的选择可能是先查询本地文件,当找不到服务名时只查找NIS。另一方面,主机名信息可能会非常频繁地改变,因此DNS或NIS服务器应该总是具有非常正确的信息,并且本地hosts文件仅在DNS和NIS不可用时用作备份。在这种情况下,您可能希望最后查询本地文件。
以下示例显示了如何以上述方式配置gethostbyname(2)、gethostbyaddr(2)和getservbyname(2)函数。他们将依次试用列出的服务;如果一个搜索成功,则返回结果,否则尝试下一个服务。
# small sample /etc/nsswitch.conf
#
主机:nis dns文件
服务:文件nis
nsswitch.conf文件中可以包含条目的完整服务列表如下所示。实际查询的地图、文件、服务器和对象取决于条目名称。
Nisplus或nis+
对此域使用NIS+服务器。服务器的位置从/etc/nis.conf文件中获得。
Nis使用该域的当前NIS服务器。被查询服务器的位置在yp.conf文件中设置,如前一节所示。对于hosts条目,查询hosts.byname和hosts.byaddr映射。
Dns使用DNS名称服务器。此服务类型仅对主机条目有用。要检索的名称服务器仍然由标准的resolv.conf文件决定。
文件使用本地文件,例如/etc/hosts文件作为主机条目。
Dbm从/var/dbm中的DBM文件中查找信息。文件中使用的名称对应于NIS地图。
目前,NYS支持以下nsswitch.conf条目:hosts、networks、passwd、group、shadow、gshadow、services、protocols、rpc和ethers。将来会添加更多的项目。
图10.1显示了一个更完整的示例,它介绍了nsswitch.conf的另一个功能:如果在NIS或DNS数据库中没有找到所需的项目,hosts条目中的[NOTFOUND=return]关键字会通知NYS返回。也就是说,只有当对NIS和DNS服务器的调用由于其他原因失败时,NYS才会继续搜索本地文件。因此,本地文件仅在启动时使用,并在NIS服务器关闭时作为备份。
# /etc/nsswitch.conf
#
主机:nis dns [NOTFOUND=return]文件
网络:nis [NOTFOUND=return]文件
服务:文件nis
协议:文件nis
rpc:文件nis
图10.1 nsswitch.conf示例文件。
10.7使用密码和组图。
NIS的主要应用之一是同步NIS域中所有主机上的用户和帐户信息。在这方面,您通常只保存一个小的本地/etc/passwd文件,对于该文件,添加了从NIS地图获得的站点范围的信息。但是,仅仅在nsswitch.conf中为该服务启用NIS查找是不够的。
当引用NIS描述的密码信息时,您必须首先确保本地passwd文件中任何用户的数字用户id与NIS服务器的用户id相匹配。其他用途也需要它,例如从网络中的其他主机加载NFS卷。
如果/etc/passwd或/etc/group中的任何数字id与maps中的不同,您必须调整属于该用户的所有文件的文件所有权。首先,必须将passwd和group中的uid和gid更改为新值;然后找出所有属于新变更用户的文件,最后变更这些文件的所有权。假设news曾经的id是9,okir的id是103,它们会被改为其他值;然后,您可以发出以下命令:
# find/-uid 9–print & gt;/tmp/uid.9
# find/-uid 103–print & gt;/tmp/uid.103
# cat /tmp/uid.9 | xargs chown新闻
# cat/tmp/uid . 103 | xargs chown okir
在更改任何文件的所有权之前,对新安装的passwd文件执行这些命令并收集所有文件的名称是非常重要的。要更新文件的组所有权,您将使用类似的命令。
完成此操作后,系统上的uid和gid值将与NIS域中所有其他主机上的值相匹配。下一步是在nsswitch.conf中添加一个配置行,该配置行支持用户和组信息的NIS查找:
#/etc/ns switch . conf–密码和组处理
passwd: nis文件
组:nis文件
这使得登录命令和所有其他类似命令在用户尝试登录时首先查询NIS地图,然后在搜索失败时返回使用本地文件。一般来说,您将从本地文件中删除所有用户,只留下根帐户和一般帐户,如mail。这是因为一些关键的系统任务可能需要将uid映射到用户名,反之亦然。例如,用于管理的cron作业可能会执行su命令以暂时成为新闻,或者UUCP子系统可能会发送状态报告。如果news和uucp在本地passwd文件中没有条目,则在NIS不可用期间,这些作业将会严重失败。
这里有两点需要注意:一方面,上面描述的设置只适用于没有影子密码的登录,像util-linux软件包中包含的那些。在NIS中使用影子密码的复杂性将在下面讨论。另一方面,login命令并不是访问passwd文件的唯一命令——参见许多人几乎一直在使用的ls命令。每当生成一个长列表时,ls将显示一个文件的用户和组的符号名;也就是说,对于它遇到的每个uid和gid,它都会查询一次NIS服务器。如果您的本地网络被阻塞,将严重延迟您的工作,或者更糟的是,当NIS服务器不在同一个物理网络上时,数据报必须通过路由器传输。
还没完呢。想象一下,如果用户想要更改她的密码,会发生什么。通常,她会执行passwd,它会读取新密码并更新本地passwd文件。对于NIS来说,这是不可能的,因为这个文件不再存在于本地,但它不是一个选项,让用户登录到NIS时,他们想改变他们的密码。因此,NIS提供了一个名为yppasswd的混合替代passwd,用于在当前的NIS中完成类似的工作。为了更改服务器主机上的密码,它通过RPC联系该主机上的yppasswdd守护程序,并为其提供更新的密码信息。通常,通过以下方式在常规程序上安装yppasswd:
# cd /bin
# mv密码密码.旧
# ln yppasswd密码
同时,您必须在服务器上安装rpc.yppasswdd,并从rc.inet2启动它。这将有效地向您的用户隐藏由NIS引起的任何失真。
10.8使用支持阴影的NIS。
到目前为止,对于使用影子登录程序组的站点,还没有NIS支持。shadow program group的作者John F. Haugh最近向comp.sources.misc发布了一个受GNU library的GPL保护的shadow库函数版本,它对NIS有一些支持,但并不完整,这些函数并没有被添加到标准C库中。另一方面,通过NIS从/etc/shadow发布信息违背了shadow组件的目的。
尽管NYS密码查找功能不使用shadow.byname映射或任何此类映射,但NYS支持本地/etc/shadow文件的透明使用。当调用getpwnam的NYS实现来查找与给定登录相关的信息时,将检索由nsswitch.conf中的passwd条目指定的工具。nis服务将简单地在NIS服务器的passwd.byname映射中查找这个名称。文件服务将检查/etc/shadow是否存在,如果存在,将尝试打开它。如果不存在,或者用户没有root权限,就会回到传统的只在/etc/passwd中查找用户信息的处理方式。但是,如果影子文件存在并且可以打开,NYS将从影子中提取用户的密码。getpwuid函数也是以这种方式实现的。这样,用NYS编译的可执行文件将透明地处理本地影子组件的安装。
10.9使用传统的NIS码。
如果您使用当前标准C库中的客户端代码,配置NIS客户端会略有不同。一方面,它使用ypbind守护进程来广播和查询正在运行的服务器,而不是从配置文件中获取信息。因此,您必须确保在启动期间开始运行ypbind。必须在设置NIS域并启动RPC端口映射程序后调用它。此时,如上所示调用ypcat来测试服务器可以工作了。
最近有很多关于NIS的bug报告,错误信息写着“clntudp _ create:RPC:port mapper failure–RPC:impossible to receive”。这是由于ypbind和库函数之间绑定信息的通信(通讯)方式发生了不兼容的变化。获得关于NIS工具的最新源程序并重新编译可以解决这个问题。[5]
同样,决定是否以及如何将NIS信息与本地文件中的信息合并的传统NIS方法也不同于NYS使用的方法。例如,为了使用NIS密码映射,您必须在/etc/passwd映射中包含以下行:
+:*:O:O:::
这标记了退出使查找函数“插入”NIS地图的位置。在/etc/group中插入一个类似的行(删除最后两个冒号)将对group做同样的事情。*地图。为了使用主机。* maps分发的地图,只需更改host.conf文件中的顺序行。例如,如果您想要使用NIS、DNS和/etc/hosts文件(按此顺序),您必须将此行更改为。
订购yp绑定主机
目前,传统的NIS实现不支持任何其他地图。