54、网络信息服务(NIS)全解析

网络信息服务(NIS)全解析

1. NIS基础介绍

NIS(Network Information Service)是一种网络信息服务,用于在网络中集中管理和分发信息。当客户端程序请求信息时,如果NIS中有相应条目,该条目会被返回给客户端,再传递给最初请求信息的程序,而程序本身并不知道使用了NIS。若NIS映射表明用户密码条目不存在,程序也会在不知情的情况下接收到该信息。

NIS可共享的文件众多,常见的有 /etc/group /etc/hosts 等。与之关联的守护进程和进程主要包括:
- ypserv :运行在NIS服务器上,监听客户端的查询请求并作出响应。
- ypxfrd :用于将NIS数据库传播和传输到从服务器。
- ypbind :是NIS的客户端组件,负责查找可查询信息的NIS服务器,并将NIS客户端绑定到NIS域,运行NIS客户端程序的机器必须运行此守护进程。

虽然从技术上讲,NIS的表可称为“数据库”,但更常用“映射”来表示,例如在 /etc/passwd 文件中,将用户的登录名(唯一的)映射到密码条目的其他部分。

2. NIS服务器类型

NIS有且仅有一个权威服务器,即主NIS服务器,原始数据文件存于此处,这与域名系统(DNS)类似。若组织规模较大,可设置一个或多个辅助(从)NIS服务器来分担负载。从服务器不仅能分担负载,还能更好地应对服务器故障,即使主服务器或其他从服务器出现故障,从服务器仍可继续响应查询。

需要注意的是,一台服务器可以同时充当服务器和客户端的角色。主NIS服务器更新时,从服务器会接收更新以保持同步,这个过程称为服务器推送。主服务器在更新时会向从服务器推送映射文件的副本,从服务器接收后更新自身数据库,直到从服务器更新完成,主服务器才认为自身完全更新。此外,NIS还存在服务器拉取机制,但通常用于更复杂的配置,如拥有数百个从服务器的环境,在小型网络中一般不会用到。

3. NIS域

主NIS服务器会创建所谓的域,类似于Windows中的域控制器(DC)的域,但不同的是,NIS域无需NIS服务器管理员明确允许客户端加入(NIS模型假设所有客户端属于同一管理域,由同一系统管理员管理)。而且,NIS服务器仅集中管理信息和数据,本身不进行身份验证,用户身份验证由各个主机完成,NIS仅提供集中的用户列表。建议使用与DNS域名不同的名称来命名NIS域,这样便于与其他管理员交流网络域。

4. 主NIS服务器配置

多数Linux发行版在操作系统初始安装时会预装NIS客户端软件,方便将系统设置为NIS客户端,部分发行版甚至在操作系统安装过程中提供配置选项。但并非所有系统都需要充当NIS服务器,若需要,通常需手动安装NIS服务器组件,可从发行版的在线软件仓库或安装介质轻松下载所需软件。

安装并启用NIS服务器软件后,一般需完成以下操作:
1. 安装服务器端软件
- 在Fedora及大多数基于Red Hat包管理器(RPM)的Linux系统上,可使用以下命令安装:

[root@server-A ~]# dnf -y install ypserv
- 在openSUSE系统上,可使用YaST工具安装(若未安装):
yast -i ypserv
- 在基于Debian的发行版(如Ubuntu)上,可运行以下命令安装:
# sudo apt-get -y install nis
  1. 配置NIS :可按以下四个步骤进行:
    • 步骤1:设置域名 :以在名为 server-A 的服务器上设置名为 nis.example.org 的NIS域为例。
      • 查看当前NIS域:
[root@server-A ~]# domainname
(none)
    - 设置NIS域:
[root@server-A ~]# domainname nis.example.org
    - 再次查看以确认更改:
[root@server-A ~]# domainname
nis.example.org
    - 在Fedora及大多数Red Hat类型的系统上,为使NIS域名在系统重启后保持不变,可在`/etc/sysconfig/network`文件中创建`NISDOMAIN`变量:
[root@server-A ~]# echo "NISDOMAIN=nis.example.org" >> /etc/sysconfig/network
    - 在其他Linux发行版中,可在系统启动时执行的rc脚本中添加`domainname`命令,如编辑`/etc/init.d/ypserv`脚本,搜索包含`domainname`的行,若未找到则在第一行之后添加:
domainname nis.example.org
- **步骤2:启动NIS**:`ypserv`守护进程负责处理NIS请求。在Fedora、Red Hat Enterprise Linux(RHEL)或CentOS系统上,可使用`systemctl`命令启动:
[root@server-A ~]# systemctl start ypserv

NIS是基于远程过程调用(RPC)的服务,启动NIS前需确保 rpcbind 程序已运行。在依赖 systemd 作为服务管理器的发行版中, systemd 会自动处理 rpcbind ypserv 之间的服务依赖关系。若要手动启动 rpcbind ,可使用以下命令:

[root@server-A ~]# systemctl start rpcbind

使用 rpcinfo 命令确认 ypserv 服务已正确注册到 rpcbind

[root@server-A ~]# rpcinfo -p | grep ypserv
100004    2   udp    811  ypserv
100004    1   udp    811  ypserv

若需停止NIS服务器,可使用以下命令:

[root@server-A ~]# systemctl stop ypserv
- **步骤3:编辑Makefile**:`make`工具用于跟踪需要编译的文件并调用相应程序进行编译,包含`make`指令的文件称为Makefile。在NIS中,需将一系列文本文件转换为数据库格式,`make`工具正好适用。
    - 先备份原始的Makefile:
[root@server-A ~]# cp /var/yp/Makefile  /var/yp/Makefile.original
    - 以下是Makefile中一些重要指令的说明:
        - **指定从服务器(NOPUSH)**:若计划使用NIS从服务器,需将`NOPUSH`变量设置为`false`,并将从服务器的主机名列在`/var/yp/ypservers`文件中,同时在`/etc/hosts`文件中添加相应条目。
# If we have only one server, we don't have to push the maps to the
# slave servers (NOPUSH=true). If you have slave servers, change this
# to "NOPUSH=false" and put all hostnames of your slave servers in the file
# /var/yp/ypservers.
NOPUSH=true
        - **最小用户ID和组ID(MINUID和MINGID)**:不同Linux发行版对`/etc/passwd`和`/etc/group`文件中新创建账户的最小用户ID(UID)和组ID(GID)要求可能不同,需设置通过NIS共享的最小UID和GID值,且最小值不能为0。
# We do not put password entries with lower UIDs (the root and system
# entries) in the NIS password database for security. MINUID is the
# lowest UID that will be included in the password maps. If you
# create shadow maps, the UserID for a shadow entry is taken from
# the passwd file. If no entry is found, this shadow entry is
# ignored.
# MINGID is the lowest GID that will be included in the group maps.
MINUID=1000
MINGID=1000
        - **合并影子密码和真实密码(MERGE_PASSWD)**:为使NIS可用于其他系统进行用户身份验证,需允许通过NIS共享加密密码条目。若使用影子密码,NIS会自动将`/etc/shadow`文件中的加密字段合并到`/etc/passwd`的共享副本中。若无特殊原因,建议保持`MERGE_PASSWD`的默认设置。
# Should we merge the passwd file with the shadow file ?
# MERGE_PASSWD=true|false
MERGE_PASSWD=true
        - **合并组影子密码和真实组(MERGE_GROUP)**:`/etc/group`文件允许为组设置密码,由于该文件需公开可读,多数系统支持影子组文件(`/etc/gshadow`)。若无特殊原因,建议接受`MERGE_GROUP`变量的默认设置。
# Should we merge the group file with the gshadow file ?
# MERGE_GROUP=true|false
MERGE_GROUP=true
        - **指定文件名**:Makefile中预配置了一些通过NIS共享的文件,但列出并不意味着自动共享,只是为后续使用建立变量。
YPPWDDIR = /etc
YPSRCDIR = /etc
# These are the files from which the NIS databases are built. You may edit
# these to taste in the event that you wish to keep your NIS source files
# separate from your NIS server's actual configuration files.
GROUP = $(YPPWDDIR)/group
PASSWD = $(YPPWDDIR)/passwd
SHADOW = $(YPPWDDIR)/shadow
GSHADOW = $(YPPWDDIR)/gshadow
....<OUTPUT TRUNCATED>....
ALIASES = /etc/aliases
HOSTS = $(YPSRCDIR)/hosts
SERVICES = $(YPSRCDIR)/services
AUTO_MASTER = $(YPSRCDIR)/auto.master
AUTO_HOME = $(YPSRCDIR)/auto.home
AUTO_LOCAL = $(YPSRCDIR)/auto.local
TIMEZONE = $(YPSRCDIR)/timezone
        - **共享内容(all条目)**:在Makefile的`all`条目中,`all:`后面列出的所有映射都会被共享。
all: passwd group hosts rpc services netid protocols mail \
   # netgrp shadow publickey networks ethers bootparams printcap \
   # amd.home auto.master auto.home auto.local passwd.adjunct \
   # timezone locale netmasks

若要更改共享的映射,可在 # 符号后列出不想共享的映射。例如,若只想共享 passwd group 映射,可将 all: 行修改为:

all: passwd group \
          # hosts rpc services protocols netgrp mail \
          # shadow publickey networks ethers bootparams amd.home \
          # passwd.adjunct...
- **步骤4:使用ypinit初始化服务器**:准备好Makefile后,使用`ypinit`命令初始化YP(NIS)服务器。在64位服务器上,使用以下命令:
[root@server-A ~]# /usr/lib64/yp/ypinit  -m

若使用32位基于Linux的发行版或Debian Linux变体, ypinit 命令的路径可能略有不同,如在32位Fedora、RHEL或CentOS服务器上,路径为 /usr/lib/yp/ypinit

运行 ypinit 命令前,必须先设置NIS域名。 -m 选项表示将系统设置为主NIS服务器。运行命令后,系统会提示输入运行NIS服务器的主机列表,输入完成后按 Ctrl + D 确认。接着会提示确认输入信息是否正确,确认后系统会开始构建数据库。

完成后, ypinit 会自动运行 make 程序,构建映射并将其推送到指定的从服务器。若 rpcbind ypserv 服务未运行,可使用以下命令启动:

[root@server-A ~]# systemctl  restart rpcbind
[root@server-A ~]# systemctl restart ypserv

在基于Debian的发行版(如Ubuntu)上,可使用以下命令启动:

master@ubuntu-server-A:~$ sudo service rpcbind restart
master@ubuntu-server-A:~$ sudo service ypserv  restart
5. Makefile错误处理

运行 ypinit 命令时可能会出现一些错误,但通常并非致命错误。
- 若在Makefile中指定了不存在的文件进行共享,会出现类似以下的错误:

gmake[1]: *** No rule to make target '/etc/shadow', -
needed by 'passwd.byname'. Stop.

可创建该文件或编辑Makefile,使其不共享该文件。
- 另一个常见错误是:

failed to send 'clear' to local ypserv: RPC: Program not registered
Updating passwd.byuid...
failed to send 'clear' to local ypserv: RPC: Program not registered
gmake[1]: *** No rule to make target '/etc/gshadow', needed by 'group.byname'.
Stop.
gmake[1]: Leaving directory '/var/yp/server-A.example.org'

第一个错误表示NIS服务器尚未启动,可忽略;第二个错误与上述情况相同,修复后可使用以下命令重建映射:

[root@server-A ~]# cd /var/yp ; make
6. 更新NIS映射

若更新了通过NIS与网络其他部分共享的文件(如向中央 /etc/passwd 文件添加用户),需重建映射文件,可使用以下命令:

[root@server-A ~]# cd /var/yp ; make
7. 防火墙与NIS

像Fedora这样的Red Hat类Linux发行版通常会启用基于主机的防火墙规则来保护系统服务,默认防火墙规则几乎总会阻止NIS客户端连接到NIS服务器。目前,打开NIS服务器端口的非优雅方法是先找出 ypserv rpcbind 服务注册的端口,然后在服务器防火墙中打开 rpcbind 的服务端口以及 ypserv 的特定端口(此过程也可通过 systemd 进行脚本化或自动化)。手动操作步骤如下:
- 首先,使用预定义的 rpc-bind firewalld服务打开 rpcbind 的端口:

# firewall-cmd --add-service=rpc-bind --permanent

通过以上步骤,你可以全面了解NIS的工作原理、服务器配置、错误处理以及与防火墙的交互,从而更好地在网络中管理和使用NIS服务。

网络信息服务(NIS)全解析

8. NIS客户端配置

配置好主NIS服务器后,接下来需要配置NIS客户端,使其能够连接到NIS服务器并获取共享信息。以下是配置NIS客户端的详细步骤:
1. 安装NIS客户端软件 :不同的Linux发行版安装方式不同,以常见的发行版为例。
- 在基于Red Hat包管理器(RPM)的系统(如Fedora、CentOS等)上,使用以下命令安装:

[root@client ~]# dnf -y install ypbind
- 在基于Debian的发行版(如Ubuntu)上,使用以下命令安装:
[root@client ~]# sudo apt-get -y install nis
  1. 设置NIS域名 :客户端需要与NIS服务器使用相同的域名,以确保能够正确连接。使用 domainname 命令设置域名,例如:
[root@client ~]# domainname nis.example.org

为了使域名在系统重启后保持不变,在不同发行版中有不同的设置方法。
- 在Fedora及大多数Red Hat类型的系统上,在 /etc/sysconfig/network 文件中添加 NISDOMAIN 变量:

[root@client ~]# echo "NISDOMAIN=nis.example.org" >> /etc/sysconfig/network
- 在其他Linux发行版中,在系统启动脚本中添加`domainname`命令,如编辑`/etc/init.d/ypbind`脚本,添加:
domainname nis.example.org
  1. 配置 /etc/yp.conf 文件 :该文件用于指定NIS服务器的地址。打开 /etc/yp.conf 文件,添加以下内容:
domain nis.example.org server server-A.example.org

其中, nis.example.org 是NIS域名, server-A.example.org 是NIS服务器的主机名或IP地址。
4. 启动 ypbind 服务 ypbind 服务负责将客户端绑定到NIS域,启动该服务并设置为开机自启。
- 在使用 systemd 的系统上,使用以下命令:

[root@client ~]# systemctl start ypbind
[root@client ~]# systemctl enable ypbind
- 在使用`init`系统的系统上,使用以下命令:
[root@client ~]# service ypbind start
[root@client ~]# chkconfig ypbind on
9. 验证NIS配置

配置完成后,需要对NIS的配置进行验证,确保客户端能够正常从NIS服务器获取信息。以下是几种验证方法:
1. 使用 ypwhich 命令 :该命令用于显示当前客户端连接的NIS服务器。运行以下命令:

[root@client ~]# ypwhich
server-A.example.org

如果输出显示了NIS服务器的主机名或IP地址,说明客户端已成功连接到NIS服务器。
2. 使用 ypcat 命令 :该命令用于从NIS服务器获取共享文件的内容。例如,获取 passwd 文件的内容:

[root@client ~]# ypcat passwd

如果能够正常输出 passwd 文件的内容,说明NIS服务器的共享信息可以正常获取。

10. NIS的安全考虑

NIS虽然提供了集中管理信息的便利,但也存在一定的安全风险,需要采取相应的措施来保障系统安全。
1. 限制访问 :只允许授权的客户端连接到NIS服务器,可以通过防火墙规则来限制对NIS服务端口的访问。例如,只允许特定IP地址段的客户端访问。
2. 加密传输 :NIS默认使用明文传输数据,容易被窃听。可以使用VPN等技术对NIS数据传输进行加密,提高数据的安全性。
3. 定期更新 :及时更新NIS服务器和客户端的软件版本,修复已知的安全漏洞。同时,定期更新共享文件的内容,确保信息的准确性和安全性。
4. 监控和审计 :对NIS服务器和客户端的活动进行监控和审计,及时发现异常行为并采取相应的措施。可以使用日志分析工具来分析系统日志,查找潜在的安全威胁。

11. NIS与其他服务的集成

在实际应用中,NIS通常需要与其他服务进行集成,以满足不同的业务需求。以下是一些常见的集成场景:
1. 与LDAP集成 :LDAP(Lightweight Directory Access Protocol)是一种用于访问和管理分布式目录信息的协议。可以将NIS与LDAP集成,实现用户信息的集中管理和共享。例如,将NIS中的用户信息同步到LDAP中,使其他支持LDAP的应用程序也能够访问这些信息。
2. 与Kerberos集成 :Kerberos是一种网络认证协议,用于提供安全的身份验证服务。将NIS与Kerberos集成,可以增强用户身份验证的安全性。例如,在用户登录时,先通过Kerberos进行身份验证,然后再从NIS中获取用户的相关信息。
3. 与NFS集成 :NFS(Network File System)是一种用于在网络中共享文件的协议。将NIS与NFS集成,可以实现用户对共享文件的访问权限管理。例如,根据NIS中的用户信息,为不同的用户分配不同的文件访问权限。

12. NIS的优缺点总结

NIS作为一种网络信息服务,具有以下优点和缺点:
| 优点 | 缺点 |
| ---- | ---- |
| 集中管理:可以将多个系统的用户信息、组信息等集中管理,方便管理员进行维护和更新。 | 安全性较低:NIS默认使用明文传输数据,容易被窃听和篡改,需要额外的安全措施来保障数据安全。 |
| 简化配置:客户端只需要配置NIS服务器的地址和域名,就可以获取共享信息,减少了客户端的配置工作量。 | 可扩展性有限:在大规模网络环境中,NIS的性能和可扩展性会受到一定的限制,可能需要使用更复杂的目录服务。 |
| 兼容性好:NIS是一种标准的网络信息服务,大多数Linux发行版都支持NIS,可以与其他系统进行良好的兼容。 | 依赖RPC:NIS基于RPC(Remote Procedure Call)协议,RPC协议存在一些安全漏洞,可能会影响NIS的安全性。 |

13. 总结与展望

NIS是一种经典的网络信息服务,在集中管理网络信息方面具有重要的作用。通过本文的介绍,我们详细了解了NIS的工作原理、服务器和客户端的配置方法、错误处理、安全考虑以及与其他服务的集成等方面的内容。

随着技术的不断发展,虽然出现了一些新的目录服务(如LDAP、Active Directory等),但NIS仍然在一些特定的场景中得到广泛应用。在未来,NIS可能会与其他技术进一步融合,不断提升其性能和安全性,为网络管理提供更加便捷和高效的解决方案。同时,我们也需要关注网络安全的发展趋势,采取更加有效的安全措施来保障NIS系统的安全运行。

通过以上内容,你可以全面掌握NIS的相关知识和操作技能,在实际的网络环境中灵活运用NIS服务,提高网络管理的效率和安全性。

下面是一个mermaid流程图,展示NIS服务器和客户端的配置流程:

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;

    A([开始]):::startend --> B(安装NIS服务器软件):::process
    B --> C(配置NIS域名):::process
    C --> D(启动ypserv服务):::process
    D --> E(编辑Makefile):::process
    E --> F(使用ypinit初始化服务器):::process
    F --> G(配置防火墙):::process
    G --> H(安装NIS客户端软件):::process
    H --> I(设置NIS域名):::process
    I --> J(配置/etc/yp.conf文件):::process
    J --> K(启动ypbind服务):::process
    K --> L(验证NIS配置):::process
    L --> M([结束]):::startend
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值