一、 NIS 原理
在一个大型的网络当中,如果有多部 Linux 主机,万一要每部主机都需要设定相同的帐号与密码时,还真是麻烦。此时,如果能够有一部主控服务器 (master server) 来管理网络中所有主机的帐号, 当其他的主机有使用者登入的需求时,才到这部主控服务器上面要求相关的帐号、密码等使用者资料,如此一来,如果想要增加、修改、删除使用者资料,只要到这部主控服务器上面处理即可, 这样就能够降低重复设定使用者帐号的步骤。
这样的功能有很多的服务器软件可以达成,这里我们要介绍的则是 Network Information Services (NIS server) 这个服务器软件。
下面就先来谈一谈 NIS 的相关功能。
NIS 的主要功能
通常我们都会建议,一部 Linux 主机的功能越简单越好,也就是说,一部 Linux 就专门进行一项服务。这样有许多的好处,这包含功能简单所以系统资源得以完整运用, 并且在发生***或者是系统产生状况的时候,也比较容易追查问题所在。因此,一个公司内部常常会有好几部 Linux 主机,有的专门负责 WWW 、有的专门负责 Mail 、有的专门负责 SAMBA 等等的服务。
不过,这样虽然有分散风险、容易追踪问题的好处,但是,由于是同一个公司内的多部主机,所以事实上所有的 Linux 主机的帐号与密码都是一样的!那如果公司里面有 100 人的话, 我们就需要针对这么多部的主机去设定帐号密码。而且,如果未来还有新进员工,那么就设定密码就会使系统管理员抓狂。
这个时候,让我们换一个角度来思考:如果我设计了一部专门管理帐号与密码的主机,而其他的 Linux 主机当有客户端要登入的时候,就必须要到这部管理密码的主机来查寻使用者的帐号与密码,如此一来,我要管理所有的 Linux 主机的帐号与密码,只要到那部主要主机上面去进行设定即可! 这就是 Network Information Service, NIS 主机的主要功能。
事实上,Network Information Service 最早应该是称为 Sun Yellow Pages (简称 yp),也就是 Sun 这家公司出的一个名为 Yellow Pages 的服务器软件,请注意, NIS 与 YP 是一模一样的。这个 Yellow Pages 名字取的真是好!怎么说呢?知道黄页 (Yellow Pages) 是什么吗?就是我们家里的电话簿,今天如果你要查寻一家厂商的电话号码,通常就是直接去查黄页上面的记录来取得电话号码。而这个 NIS 也一样,当使用者要登入时, Linux 系统就会到 NIS 主机上面去找寻这个使用的帐号与密码信息来加以比对,以提供使用者登入的验证。
二、 实验环境
clip_p_w_picpath002
NIS 域名为 crazylinux
NIS 主服务器 IP100.0.0.1, 主机名 master.crazylinux 该服务器下面有 user01 账号
NIS 从服务器 IP100.0.0.2, 主机名 slave.crazylinux
NIS 客户机 IP100.0.0.3, 主机名 client.crazylinux
二、实验的配置
在配置服务器之前,我们首先确保ip,主机名信息。(过程略。。。)
首先配置NIS主服务器:
1.检查服务器是否安装了下列包:portmap、ypserv、ypbind、yp-tools
[root@localhost ~]# yum install portmap ypserv ypbind yp-tools
[root@localhost ~]# rpm -qa | grep ^yp
ypbind-1.19-11.el5
ypserv-2.19-5.el5
yp-tools-2.9-0.1
[root@localhost ~]# rpm -qa | grep portmap
portmap-4.0-65.2.2.1
2.建立NIS的域名
[root@localhost ~]# nisdomainname crazylinux
[root@localhost ~]# echo "/bin/nisdomainname crazylinux" >> /etc/rc.d/rc.local
[root@localhost ~]# echo "NISDOMAIN=crazylinux" >> /etc/sysconfig/network
/bin/nisdomainname crazylinux 添加这行使之开机运行
修改 /etc/sysconfig/network 文件,增加此行: NISDOMAIN=crazylinux 使之在启动 nis 服务自动设置 nis
3.设置ypserv服务的配置文件
[root@crazylinux /]# vi /etc/ypserv.conf
dns : no
# nis 服务器在使用时不需要 dns 系统 如需要在 /etc/hosts 中设置即可
files: 30
#
这说的是有多少数据库档案 (database file) 会被先读进高速缓存当中的意思, 不需跟改
trusted_master: your.master.servers.name
xfr_check_port: yes
#
上面这两个都仅与 Master + Slave 架构有关的设定值,一般来说,
#
只有一部主要 NIS Server 的系统中是用不到这两个设定值的!
#
如果你的 NIS slave 的架构,那么需要指定一部 master 做为数据库内容的
#
同步时候的主机,那就是 trusted_master 的设定内容啰!
#
如果没有 master/slave 架构时,那就不需要 trusted_master 这个设定了!
#
至于 xfr_check_port 则是指定 master slave 是否都要以 < 1024 
#
以下的 port 来进行沟通的讯息!通常预设就是 yes ,不需要更动他!

# &lt;
主机名称 /IP>:< 网域名称 >:< 数据库类别 >:< 安全性 >
#
这个是这个档案里面最重要的部分了!主要在设定安全性的方面,
#
可以设定多行,而是否能够通过的规则是『一行一行检查』的方式!
#
所以这里的设定应该是:先开放要开放的网域,然后全部都关闭!
#
先谈一谈各个相关的项目:
# 1.
主机名称 /IP :这里可以这样设定: 192.168.1.0/255.255.255.0
# 2.
网域名称:通常都设定成为 * 即可!
# 3.
数据库类别:可以使用 * 来表示所有的数据库!
# 4.
安全性:主要有三种参数:
#
none :无论如何就是可以无条件进入本机;
#
port :仅允许 < 1024 以下的 port 进入;
#
deny :无论如何就是关闭不让人家登入主机!
#
由于我是允许 127.0.0.0/255.0.0.0 以及 100.0.0.0/255.0.0.0 进入,
#
其它的都关闭!所以我可以这样设定:
127.0.0.0/255.0.0.0   :  *  :  *  :  none
100.0.0.0/255.0.0.0 :  *  :  *  :  none
*                          :  *  :  *  :  deny
[root@localhost ~]# cat /var/yp/securenets 需要自己建立
host 127.0.0.1
255.0.0.0 100.0.0.0
4.设置/etc/hosts与建立可信任群组/etc/netgroup
[root@localhost ~]# touch /etc/netgroup
[root@localhost ~]# vi /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
100.0.0.1 master.crazylinux
100.0.0.2 slave.crazylinux
100.0.0.3 client.crazylinux
这个/etc/netgroup 文件可以记录在我们网络里面被信任的群,这个档案的内容当中,每一行都有三个字段,分别以逗号『,』隔开,意义为:
&lt;host>,<user>,<domain>
主机,使用者账号,领域名称
事实上,如果这个文件是空的的话,那么代表着全部的主机、账号与域名称都接受的意思,因为我们已经在/etc/ypserv.conf 里头设定好了关于安全的项目了,所以这个文件只要建立即可(本来是不存在的!)
5.初始化NIS数据库:
[root@localhost ~]# useradd user01
[root@localhost ~]# passwd user01
Changing password for user user01.
New UNIX password:
BAD PASSWORD: it is WAY too short
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
[root@localhost ~]# /usr/lib/yp/ypinit –m
At this point, we have to construct a list of the hosts which will run NIS
servers. master.crazylinux is in the list of NIS server hosts. Please continue to add
the names for the other hosts, one per line. When you are done with the
list, type a <control D>. # ctrl+D 回车
next host to add: master.crazylinux
next host to add:
The current list of NIS servers looks like this:
master.crazylinux
Is this correct? [y/n: y] y
We need a few minutes to build the databases...
Building /var/yp/crazylinux/ypservers...
Running /var/yp/Makefile...
gmake[1]: Entering directory `/var/yp/crazylinux'
Updating passwd.byname...
failed to send 'clear' to local ypserv: RPC: Port mapper failureUpdating passwd.byuid...
failed to send 'clear' to local ypserv: RPC: Port mapper failureUpdating group.byname...
failed to send 'clear' to local ypserv: RPC: Port mapper failureUpdating group.bygid...
failed to send 'clear' to local ypserv: RPC: Port mapper failureUpdating hosts.byname...
failed to send 'clear' to local ypserv: RPC: Port mapper failureUpdating hosts.byaddr...
failed to send 'clear' to local ypserv: RPC: Port mapper failureUpdating rpc.byname...
failed to send 'clear' to local ypserv: RPC: Port mapper failureUpdating rpc.bynumber...
failed to send 'clear' to local ypserv: RPC: Port mapper failureUpdating services.byname...
failed to send 'clear' to local ypserv: RPC: Port mapper failureUpdating services.byservicename...
failed to send 'clear' to local ypserv: RPC: Port mapper failureUpdating netid.byname...
failed to send 'clear' to local ypserv: RPC: Port mapper failureUpdating protocols.bynumber...
failed to send 'clear' to local ypserv: RPC: Port mapper failureUpdating protocols.byname...
failed to send 'clear' to local ypserv: RPC: Port mapper failureUpdating mail.aliases...
failed to send 'clear' to local ypserv: RPC: Port mapper failuregmake[1]: Leaving directory `/var/yp/crazylinux'
master.crazylinux has been set up as a NIS master server.
Now you can run ypinit -s master.crazylinux on all slave server.
6.启动相关服务:
[root@localhost ~]# service portmap restart
停止 portmap [ 确定 ]
启动 portmap [ 确定 ]
[root@localhost ~]# service ypserv restart
停止 YP 服务器的服务: [ 失败 ]
启动 YP 服务器的服务: [ 确定 ]
[root@localhost ~]# service yppasswd restart
yppasswd: 未被识别的服务
[root@localhost ~]# service yppasswdd restart
停止 YP 口令服务: [ 失败 ]
启动 YP 口令服务: [ 确定 ]
[root@localhost ~]# chkconfig --level 35 portmap on
[root@localhost ~]# chkconfig --level 35 ypserv on
[root@localhost ~]# chkconfig --level 35 yppasswdd on
同时检查进程是否正常运行以及信息是否正确: ps –aux | grep yp
[root@localhost ~]# tail /var/log/message
7.与slave server相关设置
[root@crazylinux /]# vi /var/yp/Makefile
NOPUSH=true 大约在 23 行附近 修改成
NOPUSH=false 使主服务器给辅助服务器提供同步
[root@localhost ~]# cat /var/yp/ypservers 该成下面 2 可以将所有的 nis slave 都添加到这里
master.crazylinux
slave.crazylinux
[root@localhost ~]# service ypxfrd restart 这个服务是让 slave 主动连接上 ypxfrd 来更新数据库
停止 YP 映射图服务器: [ 失败 ]
启动 YP 映射图服务器: [ 确定 ]
注:如直接想将master的数据库直接传给slave的话可以用下面的命令
[root@crazylinux]# yppush -h slave.crazylinux passwd.*
以下进行NIS从服务器的配置:(以下步骤与主基本一样)
1.检查服务器是否安装了下列包:portmap、ypserv、ypbind、yp-tools
[root@localhost ~]# yum install portmap ypbind yp-tools ypserv
[root@localhost ~]# rpm -qa | grep ^yp
ypbind-1.19-11.el5
yp-tools-2.9-0.1
ypserv-2.19-5.el5
[root@localhost ~]# rpm -qa | grep portmap
portmap-4.0-65.2.2.1
2.建立NIS的域名
[root@localhost ~]# nisdomainname crazylinux
[root@localhost ~]# echo "/bin/nisdomainname crazylinux" &gt;&gt; /etc/rc.d/rc.local
[root@localhost ~]# echo "NISDOMAIN=crazylinux" &gt;&gt; /etc/sysconfig/network
/bin/nisdomainname crazylinux 添加这行使之开机运行
修改 /etc/sysconfig/network 文件,增加此行: NISDOMAIN=crazylinux 使之在启动 nis 服务自动设置 nis
3.设置ypserv服务的配置文件
[root@crazylinux /]# vi /etc/ypserv.conf 在最后添加
127.0.0.0/255.0.0.0   :  *  :  *  :  none
100.0.0.0/255.0.0.0 :  *  :  *  :  none
*                          :  *  :  *  :  deny
[root@localhost ~]# cat /var/yp/securenets 需要自己建立
host 127.0.0.1
255.0.0.0 100.0.0.0
4.设置/etc/hosts与建立可信任群组/etc/netgroup
[root@crazylinux /]#vi /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost
100.0.0.1 master.crazylinux
100.0.0.2 slave.crazylinux
100.0.0.3 client.crazylinux
[root@crazylinux /]# touch /etc/netgroup
5.启动服务并建立数据库
[root@crazylinux /]#service portmap restart
[root@crazylinux /]# service ypserv start
[root@crazylinux /]#/usr/lib/yp/ypinit -s master.crazylinux
[root@crazylinux /]# ypcat -h localhost passwd.byname 检测是否成功
但是主服务器随时可能回修改帐号密码,那从服务器怎么设置呢?
[root@crazylinux /]#vi /etc/crontab 在最后添加
20 * * * * root /usr/lib/yp/ypxfr_1perhour
40 6 * * * root /usr/lib/yp/ypxfr_2perday
55 6,18 * * * root /usr/lib/yp/ypxfr_2perday
注:实际操作可能有问题,解决办法以 /usr/lib/yp/ypxfr_1perhour 为例
[root@crazylinux /]# vi /usr/lib/yp/ypxfr_1perhour
找到这一行
$YPBINDIR/ypxfr $map 修改成
$YPBINDIR/ypxfr $map –h master.crazylinux
[root@crazylinux /]#service ypbind restart
以下进行客户端上的配置:
1.确认安装以下包: ypbind、yp-tools默认安装了的
[root@localhost ~]# yum install portmap ypbind yp-tools
[root@localhost ~]# rpm -qa | grep ^yp
ypbind-1.19-11.el5
yp-tools-2.9-0.1
[root@localhost ~]# rpm -qa | grep portmap
portmap-4.0-65.2.2.1
2.建立NIS的域名
[root@localhost ~]# nisdomainname crazylinux
[root@localhost ~]# echo "/bin/nisdomainname crazylinux" &gt;&gt; /etc/rc.d/rc.local
[root@localhost ~]# echo "NISDOMAIN=crazylinux" &gt;&gt; /etc/sysconfig/network
/bin/nisdomainname crazylinux 添加这行使之开机运行
修改 /etc/sysconfig/network 文件,增加此行: NISDOMAIN=crazylinux 使之在启动 nis 服务自动设置 nis
3.设置/etc/hosts与建立可信任群组/etc/netgroup
[root@crazylinux /]#vi /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost
100.0.0.1 master.crazylinux
100.0.0.2 slave.crazylinux
100.0.0.3 client.crazylinux
[root@crazylinux /]# touch /etc/netgroup
4.设置nsswitch.conf (主机验证功能的顺序)
[root@crazylinux /]# vi /etc/nsswitch.conf
# 找到相关的参数 并改成底下这样
passwd:     files nis nisplus
shadow:     files nis nisplus
group:      files nis nisplus
hosts:      files nis dns
#
这个档案在设定一些信息的查寻程序 那个 files 指的是本机的相关档案
#
至于 nis 则是透过 NIS 来进行查寻 至于 nisplus 则是 NIS+ 这是比较新
#
版的 NIS 不过 官方网站上面说 目前这个发展的计划已经暂停了
# 1. passwd:
就是使用者相关信息查寻 分别为 /etc/passwd, nis nisplus
# 2. shadow:
就是使用者密码的查寻 , /etc/shadow, nis nisplus
# 3. group: 
就是使用者的群组信息查寻 , /etc/group, nis nisplus
# 4. hosts: 
就是主机名称与 IP 对应的查寻 ,/etc/hosts, nis /etc/resolv.conf
5.设置/etc/sysconfig/authconfig(redhat认证机制)
[root@crazylinux /]# vi /etc/sysconfig/authconfig
USENIS=no 改成 yes
6.设置/etc/yp.conf
[root@localhost ~]# cat /etc/yp.conf
domain crazylinux server master.crazylinux 把第 4 # 去掉修改成这样 还可以设置成 broadcast 广播
domain crazylinux server slave.crazylinux
7.启动ypbind服务程序
[root@localhost ~]# service portmap status
portmap (pid 1683) is running...
[root@localhost ~]# service ypbind start
Binding to the NIS domain: [ OK ]
Listening for an NIS domain server..
在这里就可以用服务器上面的 user01 帐号在客户机上面登陆了,但是会出现 -bash-3.00$ (因为 user01 没有主目录,可以用之前学习的 nfs 把服务器上面的 /home 目录共享出来)
在NIS服务器中输出NFS共享目录
在nis服务器上
[root@localhost ~]# vi /etc/exports 添加
/home 100.0.0.0/8(rw,async,np_root_squash)
[root@localhost ~]#service nfs start
在NIS客户机上
[root@localhost ~]#vi /etc/fstab
master.crazylinux:/home/ /home nfs defaults 0 0
现在在客户机中用服务器里面的帐号登陆 嘿嘿 OK
 
NIC Client 端检验 NIS 设定:yptest, ypwhich, ypcat
设定好了 NIS Client 之后,先以 netstat 与 rpcinfo 检验一下是否成功的启动之后,接下来就是要测试到底我们的 NIS Client 与 NIS Server 之间沟通的情况如何了!此时就需要使用到 NIS 提供的 yp-tools 这个套件,里面的几个小小的执行程序来动作了:
o yptest :主要在测试 yp 的设定内容、数据库内容等等所有 NIS 相关的资料测试;
o ypwhich:主要在测试 NIS Client 与 Server 之间沟通的数据库 (database) 到底是哪几个档案;
o ypcat  :主要在取得 NIS Server 上面的使用者密码信息!
分别谈一谈每个程序的用途与说明吧!
yptest
[root@client root]# yptest
Test 1: domainname
Configured domainname is "cluster"
Test 2: ypbind
Used NIS server: server.cluster
....
....
Test 8: yp_maplist
rpc.bynumber
rpc.byname
hosts.byaddr
hosts.byname
group.byname
passwd.byname
ypservers
passwd.byuid
Test 9: yp_all
test test:dkoUW2XHV30sEV5gLM4NapyuhBcpVs.:500:500::/home/test:/bin/bash
看到了吗?会有很多的资料一项一项的去测试,测试的结果都会显示在屏幕上面,最好都没有问题之后再开始 NIS Client 的服务吧! ^_^
ypwhich
[root@client root]# ypwhich
server.cluster
[root@clent root]# ypwhich -x
Use "ethers"    for map "ethers.byname"
Use "aliases"   for map "mail.aliases"
Use "services"  for map "services.byname"
Use "protocols" for map "protocols.bynumber"
Use "hosts"     for map "hosts.byname"
Use "networks"  for map "networks.byaddr"
Use "group"     for map "group.byname"
Use "passwd"    for map "passwd.byname"
单纯使用 ypwhich 的时候显示的是『NIS Client 的 domain』名称,而当加入 -x 这个参数时,则是显示『NIS Client 与 Server 之间沟通的数据库有哪些?』由上面我们可以很清楚的就看到相关的档案啦!这些数据库档案则是放置在我的 NIS Server 的 /var/yp/cluster/* 里面啰!
ypcat
[root@client root]# ypcat -x
Use "ethers"    for map "ethers.byname"
Use "aliases"   for map "mail.aliases"
Use "services"  for map "services.byname"
Use "protocols" for map "protocols.bynumber"
Use "hosts"     for map "hosts.byname"
Use "networks"  for map "networks.byaddr"
Use "group"     for map "group.byname"
Use "passwd"    for map "passwd.byname"
# 主要的功能就是『列出数据库』啰!与 ypwhich -x 相同功能!
# 所以我们有 ethers, aliases......passwd 等数据库名称与文件名!
[root@client root]# ypcat [数据库名称或功能]
# 这个指令可以用来取得 NIS Server 上面各个数据库的内容!
# 举例来说,我们想要知道 passwd ( 密码数据 ) 的所有使用者内容,就需要:
[root@client root]# ypcat passwd  (或 ypcat passwd.byname )
test:dkoUW2XHV30sEV5gLM4NapyuhBcpVs.:500:500::/home/test:/bin/bash
# 如果是想要知道 hosts 的内容 (NIS Server 主机上面 /etc/hosts 的内容):
[root@client root]# ypcat hosts
127.0.0.1       localhost       localhost.localdomain
192.168.10.30   server.cluster
# 反正就是加上数据库,你就可以取得 NIS server 主机上面的数据库内容啦!
这三个指令在进行 NIS Client 端的检验时,是相当有用的喔!不要忽略了他的存在啊!尤其是刚架设好 NIS Client 时,一定要使用 yptest 去检查看看有没有设定错误喔!根据屏幕显示的讯息去一个一个校正错误才行啊!
修改使用者密码 ( 需要有 root 身份 ): yppasswd, ypchfn, ypchsh
好了,既然 NIS Client 已经可以正式的来 run 了,那么还可能有什么大问题呢!?最大的问题在于....我能不能在 NIS Client 端修改各个账号的密码呢?答案是『能!』但是不怎么方便~因为,我们要修改的是 NIS Server 端的数据库喔!也就是说,我们在 NIS Client 端登入之后,要修改自己这个账号的密码,其实改到的是 NIS Server 的数据库密码啊!而要修改数据库密码时,需要使用 root 的身份,所以一定需要 root 的密码~如此一来,实在是不太方便~如果真的要修改的话,那么可以使用底下三个小指令来进行修改,不过,不怎么建议这样做就是了!
o yppasswd :与 passwd 指令相同功能;
o ypchfn   :与 chfn 相同功能;
o ypchsh   :与 chsh 相同功能。
clip_p_w_picpath001 无论如何,我是不太建议大家使用这些指令去修改数据库的内容啦!比较建议这样做:
n 登入到 NIS Server 主机里面去,进行 useradd 或者是 passwd 修改账号与密码等等的更动;
n 使用 /usr/lib/yp/ypinit -m 重新制作数据库档案!
这样就 OK 啦!比较简单啦我想~至于上面三个指令,请使用 Linux 的好朋友 man 来查看一下吧! ^_^