ccidnet????

出版日期:2000-10-01 总期号:164 本年期号:10

本期导读
新闻专递
方案设计
应用篇
技术篇
产品篇
利用NIS在局域网上共享帐户和口令

张子波


  一、引言


  在一个拥有大量Linux/UNIX机器的网络中,如果用户要在机器之间建立起连接,共享系统资源,就必须在每台需要连接的机器上拥有自己的用户帐号。而每台机器的用户帐号又是相互独立的,这就迫使用户必须在很多机器上维护自己的帐号和口令。显然,在多台机器上维护帐号和口令是一件非常繁琐的工作。本文将详细介绍如何通过NIS(网络信息服务)来解决上述问题。

  NIS也称YP(Yellow Pages)协议,是一个提供目录服务的RPC(远程过程调用)应用服务。通过它,就可以在网络上共享一个集中式的口令文件,从而大大简化客户端用户对帐户和口令的维护工作。目前该协议已在Linux系统上得以实现,并开发出了一个新的版本,称为NYS。本文将以基于Intel平台的Linux操作系统为例,阐述NIS的工作原理和配置方法。


  二、NIS的工作原理


  NIS采用客户机-服务器结构。它把网络上的许多机器分组在一个NIS子网内,形成一个NIS域。在每一个域中,至少要有一台机器被设置成NIS服务器,提供对NIS客户端的访问授权。这台服务器被称之为master(主)NIS服务器。根据网络规模的不同,用户也可以在一个域中设置多台NIS服务器,相对于master服务器,其它的NIS服务器被称为slave(从)NIS服务器。在规模较大的网络中,用户可以划分多个NIS子网,形成多个NIS域,并为每个域设置一台或多台NIS服务器。

  在NIS服务器上,NIS将访问信息保存在一组映像中,这些映像与网络上的一个NIS域相对应。在master服务器上映像文件由两种格式组成。一种是ASCII格式,由一组ASCII码格式的记录组成。这些记录的格式与/etc/passwd文件十分相似。另一种是DBM(DateBase Management)格式,这种格式的映像文件是由ASCII格式的映像文件转换而来。

  在一个NIS域中,如果存在多台NIS服务器,那么在建立slave服务器时,slave服务器会从master服务器上复制映像文件,并监听master服务器上映像文件的变化。一旦master服务器上的映像发生变化,slave服务器会自动更新。当master服务器出现故障或其对NIS客户机的请求响应过慢时,某个slave服务器就会代替master服务器进行响应。

  在一个NIS域中,所有的NIS客户机可以共享NIS服务器上的/etc/passwd和/etc/group文件。这样,用户无论在那一台客户机上登录,都可以使用同一个用户名和口令,而且可以保证用户UID和GID完全相同。在任何一台机器上改变用户的口令,网络上其它机器的口令都会随之改变。这样,用户只须在网络上维护一个passwd和group文件就可以了。


  三、配置NIS


  由于NIS采用客户机-服务器结构,因此NIS软件也由两个组件组成:客户机和服务器。本文将以RedHat Linux 6.0(kernel 2.2.5)为操作系统平台,介绍NIS服务器和客户机的配置方法。

  1.NIS服务器配置

  在RedHat Linux 6.0中,提供了两个NIS服务器:yps和ypserv。由于ypserv的系统安全性较好,因此本文重点介绍ypserv的配置方法。目前ypserv的版本为1.3.6.91。假设NIS服务器的机器名为:NISSERVER,IP地址为:202.9.201.111,子网屏蔽为:255.255.255.0。

  (1)安装ypserv。用root帐号登录,然后执行下面的命令:

  # rpm -i /mnt/cdrom/RedHat/RPMS/ypserv-1.3.6.91-1.i386.rpm

  (2)由于NIS是一个PRC应用服务,因此在启动ypserv之前,必须先启动RPC portmapper守护进程。如果portmap守护进程还未启动,则执行下面的命令:

  # /sbin/portmap

  (3)建立/etc/passwd和/etc/group文件的影子文件。假设系统中有两个本地帐户和两个NIS帐户,此时/etc/passwd文件的内容如下所示:

  root:fy19kpi1XepWM:0:0:root:/root:/bin/bash

  bin:*:1:1:bin:/bin:

  daemon:*:2:2:daemon:/sbin:

  adm:*:3:4:adm:/var/adm:

  lp:*:4:7:lp:/var/spool/lpd:

  sync:*:5:0:sync:/sbin:/bin/sync

  shutdown:*:6:0:shutdown:/sbin:/sbin/shutdown

  halt:*:7:0:halt:/sbin:/sbin/halt

  mail:*:8:12:mail:/var/spool/mail:

  news:*:9:13:news:/var/spool/news:

  uucp:*:10:14:uucp:/var/spool/uucp:

  operator:*:11:0:operator:/root:

  games:*:12:100:games:/usr/games:

  gopher:*:13:30:gopher:/usr/lib/gopher-data:

  ftp:*:14:50:FTP User:/home/ftp:

  nobody:*:99:99:Nobody:/:

  postgres:!!:100:233:PostgreSQL Server:/var/lib/pgsql:/bin/bash

  xfs:!!:101:234:X Font Server:/etc/X11/fs:/bin/false

  localuser1:KR/a/aX2/iEJw:500:500::/users/localuser1:/bin/bash

  localuser2:SRSx3SIrXKob6:501:501::/users/localuser2:/bin/bash

  nisuser1:sRmx4fVU4XmKI:502:502::/users/nisuser1:/bin/bash

  nisuser2:.SQ9ALyzH/wOY:503:503::/users/nisuser2:/bin/bash

  执行如下命令:

  # /usr/sbin/pwconv (建立/etc/shadow文件)

  # /usr/sbin/grpconv (建立/etc/gshadow文件)

  然后将/etc/shadow文件中的NIS帐户删除,再用/etc/passwd-文件中的NIS帐户记录替换/etc/passwd文件中的NIS帐户记录。完成修改后的/etc/passwd和/etc/shadow文件应如下所示:

  /etc/passwd文件:

  root:x:0:0:root:/root:/bin/bash

  bin:x:1:1:bin:/bin:

  daemon:x:2:2:daemon:/sbin:

  adm:x:3:4:adm:/var/adm:

  lp:x:4:7:lp:/var/spool/lpd:

  sync:x:5:0:sync:/sbin:/bin/sync

  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

  halt:x:7:0:halt:/sbin:/sbin/halt

  mail:x:8:12:mail:/var/spool/mail:

  news:x:9:13:news:/var/spool/news:

  uucp:x:10:14:uucp:/var/spool/uucp:

  operator:x:11:0:operator:/root:

  games:x:12:100:games:/usr/games:

  gopher:x:13:30:gopher:/usr/lib/gopher-data:

  ftp:x:14:50:FTP User:/home/ftp:

  nobody:x:99:99:Nobody:/:

  postgres:x:100:233:PostgreSQL Server:/var/lib/pgsql:/bin/bash

  xfs:x:101:234:X Font Server:/etc/X11/fs:/bin/false

  localuser1:x:500:500::/users/localuser1:/bin/bash

  localuser2:x:501:501::/users/localuser2:/bin/bash

  nisuser1:sRmx4fVU4XmKI:502:502::/users/nisuser1:/bin/bash

  nisuser2:.SQ9ALyzH/wOY:503:503::/users/nisuser2:/bin/bash

  /etc/shadow文件:

  root:fy19kpi1XepWM:10805:0:99999:7:::

  bin:*:10805:0:99999:7:::

  daemon:*:10805:0:99999:7:::

  adm:*:10805:0:99999:7:::

  lp:*:10805:0:99999:7:::

  sync:*:10805:0:99999:7:::

  shutdown:*:10805:0:99999:7:::

  halt:*:10805:0:99999:7:::

  mail:*:10805:0:99999:7:::

  news:*:10805:0:99999:7:::

  uucp:*:10805:0:99999:7:::

  operator:*:10805:0:99999:7:::

  games:*:10805:0:99999:7:::

  gopher:*:10805:0:99999:7:::

  ftp:*:10805:0:99999:7:::

  nobody:*:10805:0:99999:7:::

  postgres:!!:10805:0:99999:7:::

  xfs:!!:10805:0:99999:7:::

  localuser1:KR/a/aX2/iEJw:10805:0:99999:7:::

  localuser2:SRSx3SIrXKob6:10805:0:99999:7:::

  (4)编辑/var/yp/Makefile文件。

  ①如果在NIS域中存在slave服务器,须将NOPUSH设置为:

  NOPUSH=false

  如果不存在slave服务器,则该项应设置为“true"。

  ②设置转换到passwd映像和group映像文件中的最小UID和GID。这样可以避免将root帐号和一些系统帐号转换到NIS映像中,从而保证系统的安全性。

  MINUID=502

  MINGID=502

  ③设置放置在域上的映射,即设置哪些文件使用NIS。将不需要转换的文件项删掉。

  all: passwd group

  (5)设置网络上哪些客户机可以访问NIS服务器。编辑/var/yp/securenets文件。该文件的格式为:子网屏蔽 网络地址。例如:允许C类网络202.9.201.上的所有主机访问,则输入:

  255.255.255.0 202.9.201.0

  (6)启动ypserv守护进程。

  # /usr/sbin/ypserv

  (7)检验ypserv是否正常运行

  # rpcinfo -u localhost ypserv

  该命令输出应为:

  program 100004 version1 ready and waiting

  program 100004 version2 ready and waiting

  (8)设置NIS域名

  # /bin/domainname nisdomain

  (9)建立NIS数据库

  # /usr/lib/yp/ypinit -m

  输入NIS master的主机名后键入CTRL+D即可。此时,系统会在/var/yp目录下生成一个nisdomain子目录。里面包含passwd和group文件的映像文件passwd.byname、passwd.byuid、group.byname和group.bygid。

  (10)用NFS输出NIS帐户的home目录/users

  ① 编辑/etc/exports文件,加入一行:

  /users (rw,no_root_quash)

  ②重新启动NFS守护进程

  # /etc/rc.d/init.d/nfs restart

  2.NIS客户机配置

  在RedHat Linux 6.0中提供的NIS客户机软件为ypbind 3.3。安装该软件时还需安装yp-tools 2.2。

  (1)安装ypbind和yp-tools

  # rpm -i /mnt/cdrom/RedHat/RPMS/ypbind-3.3-20.i386.rpm

  # rpm -i /mnt/cdrom/RedHat/RPMS/yp-tools-2.2-1.i386.rpm

  (2)设置/etc/hosts文件,在该文件中加入一条NIS服务器的记录:

  202.9.201.111 nisserver

  (3)编辑/etc/yp.conf文件,设置NIS客户机所在NIS域及NIS服务器名称。

  domain nisdomain

  ypserver nisserver

  (4)设置NIS域名

  # /bin/domainname nisdomain

  (5)启动ypbind守护进程

  # /sbin/ypbind

  (6)检验ypbind是否工作正常

  # rpcinfo -u localhost ypbind

  该命令输出应为:

  program 100007 version2 ready and waiting

  (7)编辑/etc/nsswitch.conf文件,设置哪些文件从NIS服务器获取,哪些文件从本地获取。该文件内容如下所示:

  passwd: compat

  group: compat

  shadow: compat

  passwd_compat: nis

  group_compat: nis

  shadow_compat: nis

  hosts: files dns

  services: files

  networks: files

  protocols: files

  rpc:files

  ethers: files

  netmasks: files

  bootparams: files

  automount: files

  aliases:files

  (8)设置可在本机登录的NIS帐户。如果允许nisuser1和nisuser2在本机登录,则在/etc/passwd文件中追加下面两行:

  +nisuser1

  +nisuser2

  在/etc/group文件中追加下面两行:

  +nisuser1

  +nisuser2

  (9)mount位于NIS服务器上的NIS帐户的home目录

  mount nisserver:/users /users

  (10)检验NIS是否配置正确

  # ypcat passwd

  该命令将得到一个NIS服务器上passwd文件映射列表。内容如下所示:

  nisuser1:sRmx4fVU4XmKI:502:502::/users/nisuser1:/bin/bash

  nisuser2:.SQ9ALyzH/wOY:503:503::/users/nisuser2:/bin/bash

  经过以上配置,用户就可以在NIS客户端使用NIS帐号登录了。


  四、NIS映像文件的更新


  如果用户想更改passwd和group文件的映像,只需在更改完passwd、shadow和group文件后,在/var/yp目录下执行make命令即可。这时,在NIS客户端用ypcat查看,就会发现passwd和group列表已经更新了。


  五、更改NIS帐号口令


  要更改NIS帐号口令,需在NIS服务器上运行yppasswdd守护进程。在NIS服务器上执行如下命令:

  # /etc/rc.d/init.d/yppasswdd start

  然后在NIS客户机上用/usr/bin/yppasswd命令更改用户口令。


  六、结论


  本文详细介绍了利用NIS共享网络口令文件的原理和方法。其实,在使用NIS的网络中,不仅passwd和group文件可以使用NIS,其它一些文件(如:/etc/hosts、/etc/netgroup等)也可以使用NIS。在规模较大的网络中,使用NIS所带来的好处是非常明显的。笔者已用该方案解决了本公司Linux/UNIX网络系统共享口令文件的问题,使用效果良好。(笔者软件环境:NIS服务器采用RedHat Linux 6.0,工作站采用HP-UX 10.20和RedHat Linux 6.0)

  但是,使用NIS也有一个不足之处,那就是一旦NIS服务器宕机或出现故障,所有的NIS帐户都将无法登录。因此,读者可以根据网络规模的大小及对系统可靠性和响应速度的要求,适当增加NIS域和NIS服务器的数量,来提高系统的性能和可靠性。