32.4. 网络信息系统(NIS)

网络信息系统(NIS)旨在集中管理类 UNIX® 系统,如 Solaris™、HP-UX、AIX®、Linux、NetBSD、OpenBSD 和 FreeBSD。NIS 最初被称为黄页(Yellow Pages),但由于商标问题,名称已更改。这就是 NIS 命令以 yp 开头的原因。

NIS 是基于远程过程调用(RPC)的客户端/服务器系统,它允许 NIS 域中的一组计算机共享一组通用的配置文件。这允许系统管理员仅使用最少的配置数据设置 NIS 客户端系统,并从单个位置添加、删除或修改配置数据。

FreeBSD 使用第 2 版 NIS 协议。

32.4.1. NIS 术语和流程

表 28.1 总结了 NIS 使用的术语和重要过程:

表 24. NIS 术语

术语

说明

NIS 域名

NIS 服务器和客户端共享一个 NIS 域名。通常,此名称与 DNS 没有任何关系。

rpcbind(8)

此服务启用 RPC,并且必须正在运行才能运行 NIS 服务器或充当 NIS 客户端。

ypbind(8)

此服务将 NIS 客户端绑定到其 NIS 服务器。它将采用 NIS 域名并使用 RPC 连接到服务器。它是 NIS 环境中客户端/服务器通信的核心。如果此服务未在客户端计算机上运行,则它将无法访问 NIS 服务器。

ypserv(8)

这是 NIS 服务器的过程。如果此服务停止运行,服务器将不再能够响应 NIS 请求,因此希望有一个从属服务器可以接管。一些非 FreeBSD 客户端不会尝试使用从属服务器重新连接,ypbind 进程可能需要在这些客户端上重新启动。

rpc.yppasswdd(8)

此过程仅在 NIS 主服务器上运行。此守护程序允许 NIS 客户端更改其 NIS 密码。如果此守护程序未运行,则用户必须登录到 NIS 主服务器并在那里更改其密码。

32.4.2. 机器类型

NIS 环境中有三种类型的主机:

  • NIS 主服务器

    此服务器充当主机配置信息的中央存储库,并维护所有 NIS 客户机使用的文件的权威副本。NIS 客户端使用的 passwdgroup 和其他各种文件存储在主服务器上。虽然一台计算机可能是多个 NIS 域的 NIS 主服务器,但本章不介绍这种类型的配置,因为它假定的是一个相对较小的 NIS 环境。

  • NIS 从属服务器

    NIS 从属服务器维护 NIS 主服务器数据文件的副本,以提供冗余。从属服务器还有助于平衡主服务器的负载,因为 NIS 客户端始终连接到首先响应的 NIS 服务器。

  • NIS 客户端

    NIS 客户端在登录期间对 NIS 服务器进行身份验证。

可以使用 NIS 共享许多文件中的信息。通常通过 NIS 共享 master.passwdgrouphosts 文件。每当客户端上的进程需要通常在本地这些文件中找到的信息时,它就会向绑定到的 NIS 服务器发出查询。

32.4.3. 规划注意事项

本节介绍一个 NIS 示例环境,它由 15 台 FreeBSD 机器组成,没有集中的管理点。每台机器都有自己的 /etc/passwd/etc/master.passwd。这些文件仅通过手动干预保持彼此同步。目前,将用户添加到实验室时,必须在所有 15 台计算机上重复该过程。

实验室的配置如下:

计算机名称

IP 地址

计算机角色

ellington

10.0.0.2

NIS 主服务器

coltrane

10.0.0.3

NIS 从属服务器

basie

10.0.0.4

教师工作站

bird

10.0.0.5

客户端

cli[1-11]

10.0.0.[6-17]

其他客户端

如果这是第一次开发 NIS 方案,则应提前进行彻底规划。无论网络规模如何,作为规划过程的一部分,都需要做出一些决策。

32.4.3.1. 选择 NIS 域名

当客户端广播其信息请求时,它包括它所属的 NIS 域的名称。这就是一个网络上的多个服务器如何判断哪个服务器应该回答哪个请求。将 NIS 域名视为一组主机的名称。

某些组织选择使用其互联网域名作为其 NIS 域名。不建议这样做,因为在尝试调试网络问题时,这可能会导致混淆。NIS 域名在网络中应该是唯一的,如果它描述了它所代表的计算机组,则会很有帮助。例如 Acme Inc. 的艺术部门可能属于 NIS 域“acme-art”。此示例将使用域名 test-domain

但是,一些非 FreeBSD 操作系统要求 NIS 域名与互联网域名相同。如果网络上的一台或多台计算机具有此限制,则必须将互联网域名用作 NIS 域名。

32.4.3.2. 物理服务器要求

在选择要用作 NIS 服务器的计算机时,需要记住几件事。由于 NIS 客户端取决于服务器的可用性,因此请选择不经常重新启动的计算机。理想情况下,NIS 服务器应该是一台独立计算机,其唯一目的是成为 NIS 服务器。如果网络没有被大量使用,则可以将 NIS 服务器放在运行其他服务的计算机上。但是,如果 NIS 服务器变得不可用,它将对所有 NIS 客户端产生负面影响。

32.4.4. 配置 NIS 主服务器

所有 NIS 文件的规范副本都存储在主服务器上。用于存储信息的数据库称为 NIS 映射。在 FreeBSD 中,这些映射存储在 /var/yp/[domainname] 中,其中 [domainname] 是 NIS 域的名称。由于支持多个域,因此可以有多个目录,每个域一个目录。每个域都有自己独立的映射集。

NIS 主服务器和从属服务器通过 ypserv(8) 处理所有 NIS 请求。此守护程序负责接收来自 NIS 客户端的传入请求,将请求的域和映射名称转换为相应数据库文件的路径,以及将数据从数据库传输回客户端。

根据环境需要,设置主 NIS 服务器可能相对简单。由于 FreeBSD 提供了内置的 NIS 支持,因此只需通过向 /etc/rc.conf 添加以下行来启用它:

nisdomainname="test-domain"    ①
nis_server_enable="YES"        ②
nis_yppasswdd_enable="YES"     ③

① 这一行将 NIS 域名设置为 test-domain

② 在系统引导时自动启动 NIS 服务器进程。

③ 启用守护程序 rpc.yppasswdd(8),以便用户可以从客户端计算机更改其 NIS 密码。

在服务器计算机也是 NIS 客户端的多服务器域中必须小心。通常,强制服务器绑定到自身,而不是允许它们广播绑定请求并可能彼此绑定,这是一个好主意。如果一台服务器出现故障,而其他服务器依赖于它,则可能会导致奇怪的故障模式。最终,所有客户端都将超时并尝试绑定到其他服务器,但所涉及的延迟可能相当大,并且故障模式仍然存在,因为服务器可能会再次相互绑定。

也可以是客户端的服务器通过向 /etc/rc.conf 添加以下附加行来强制绑定到特定服务器:

nis_client_enable="YES"    ①
nis_client_flags="-S test-domain,server"    ②

① 这也使运行客户端内容成为可能。

② 此行将 NIS 域名设置为 test-domain 并绑定到自身。

保存编辑后,键入 /etc/netstart 以重新启动网络并应用 /etc/rc.conf 中定义的值。在初始化 NIS 映射之前,启动 ypserv(8)

# service ypserv start

32.4.4.1. 初始化 NIS 映射

NIS 映射是从 NIS 主服务器上 /etc 中的配置文件生成的,但有一个例外:/etc/master.passwd。这是为了防止将密码传播到 NIS 域中的所有服务器。因此,在初始化 NIS 映射之前,请配置主密码文件:

# cp /etc/master.passwd /var/yp/master.passwd
# cd /var/yp
# vi master.passwd

建议删除系统帐户的所有条目以及不需要传播到 NIS 客户端的任何用户帐户,例如 root 和任何其他管理帐户。

注意

通过将 /var/yp/master.passwd 的权限设置为 600,确保组和其它用户对其不可读。

完成此任务后,初始化 NIS 映射。FreeBSD 用 ypinit(8) 脚本来完成这个任务。为主服务器生成映射时,请包括 -m 并指定 NIS 域名:

ellington# ypinit -m test-domain
Server Type: MASTER Domain: test-domain
Creating an YP server will require that you answer a few questions.
Questions will all be asked at the beginning of the procedure.
Do you want this procedure to quit on non-fatal errors? [y/n: n] n
Ok, please remember to go back and redo manually whatever fails.
If not, something might not work.
At this point, we have to construct a list of this domains YP servers.
rod.darktech.org is already known as master server.
Please continue to add any slave servers, one per line. When you are
done with the list, type a <control D>.
master server   :  ellington
next host to add:  coltrane
next host to add:  ^D
The current list of NIS servers looks like this:
ellington
coltrane
Is this correct?  [y/n: y] y

[..output from map generation..]

NIS Map update completed.
ellington has been setup as an YP master server without any errors.

这将从 /var/yp/Makefile.dist 创建 /var/yp/Makefile。缺省情况下,此文件假定环境具有一个只有 FreeBSD 客户端的 NIS 服务器。由于test-domain 有一个从属服务器,请在 /var/yp/Makefile 中编辑此行,使其以注释(#)开头:

NOPUSH = "True"

32.4.4.2. 添加新用户

每次创建新用户时,都必须将用户帐户添加到主 NIS 服务器并重新生成 NIS 映射。在此之前,新用户将无法登录除 NIS 主服务器以外的任何位置。例如,若要将新用户 jsmith 添加到 test-domain 域中,请在主服务器上运行以下命令:

# pw useradd jsmith
# cd /var/yp
# make test-domain

也可以使用 adduser jsmith 代替 pw useradd smith 来添加用户。

32.4.5. 设置 NIS 从属服务器

要设置 NIS 从属服务器,请登录到从属服务器并编辑 /etc/rc.conf 作为主服务器。不要生成任何 NIS 映射,因为主服务器上已存在这些映射。在从属服务器上运行 ypinit 时,请使用 -s(对于从属服务器)而不是 -m(对于主服务器)。除了域名之外,此选项还需要 NIS 主机的名称,如以下示例所示:

coltrane# ypinit -s ellington test-domain

Server Type: SLAVE Domain: test-domain Master: ellington

Creating an YP server will require that you answer a few questions.
Questions will all be asked at the beginning of the procedure.

Do you want this procedure to quit on non-fatal errors? [y/n: n]  n

Ok, please remember to go back and redo manually whatever fails.
If not, something might not work.
There will be no further questions. The remainder of the procedure
should take a few minutes, to copy the databases from ellington.
Transferring netgroup...
ypxfr: Exiting: Map successfully transferred
Transferring netgroup.byuser...
ypxfr: Exiting: Map successfully transferred
Transferring netgroup.byhost...
ypxfr: Exiting: Map successfully transferred
Transferring master.passwd.byuid...
ypxfr: Exiting: Map successfully transferred
Transferring passwd.byuid...
ypxfr: Exiting: Map successfully transferred
Transferring passwd.byname...
ypxfr: Exiting: Map successfully transferred
Transferring group.bygid...
ypxfr: Exiting: Map successfully transferred
Transferring group.byname...
ypxfr: Exiting: Map successfully transferred
Transferring services.byname...
ypxfr: Exiting: Map successfully transferred
Transferring rpc.bynumber...
ypxfr: Exiting: Map successfully transferred
Transferring rpc.byname...
ypxfr: Exiting: Map successfully transferred
Transferring protocols.byname...
ypxfr: Exiting: Map successfully transferred
Transferring master.passwd.byname...
ypxfr: Exiting: Map successfully transferred
Transferring networks.byname...
ypxfr: Exiting: Map successfully transferred
Transferring networks.byaddr...
ypxfr: Exiting: Map successfully transferred
Transferring netid.byname...
ypxfr: Exiting: Map successfully transferred
Transferring hosts.byaddr...
ypxfr: Exiting: Map successfully transferred
Transferring protocols.bynumber...
ypxfr: Exiting: Map successfully transferred
Transferring ypservers...
ypxfr: Exiting: Map successfully transferred
Transferring hosts.byname...
ypxfr: Exiting: Map successfully transferred

coltrane has been setup as an YP slave server without any errors.
Remember to update map ypservers on ellington.

这将在从属服务器上生成一个名为 /var/yp/test-domain 的目录,其中包含 NIS 主服务器映射的副本。在每个从属服务器上添加这些 /etc/crontab 条目将强制从属服务器将其映射与主服务器上的映射同步:

20      *       *       *       *       root   /usr/libexec/ypxfr passwd.byname
21      *       *       *       *       root   /usr/libexec/ypxfr passwd.byuid

这些条目不是必需的,因为主服务器会自动尝试将任何映射更改推送到其从属服务器。但是,由于客户端可能依赖于从属服务器来提供正确的密码信息,因此建议强制频繁更新密码映射。这在映射更新可能并不总是完成的繁忙网络中尤其重要。

要完成配置,请在从属服务器上运行 /etc/netstart 以启动 NIS 服务。

32.4.6. 设置 NIS 客户端

NIS 客户机使用 ypbind(8) 绑定到 NIS 服务器。此守护程序在本地网络上广播 RPC 请求。这些请求指定在客户端上配置的域名。如果同一域中的 NIS 服务器收到其中一个广播,它将响应 ypbind,这将记录服务器的地址。如果有多个服务器可用,则客户端将使用第一个服务器的地址进行响应,并将其所有 NIS 请求定向到该服务器。客户端将定期自动 ping 服务器,以确保它仍然可用。如果它未能在合理的时间内收到回复,ypbind 会将域标记为未绑定,并再次开始广播,希望找到另一台服务器。

要将 FreeBSD 机器配置为 NIS 客户端:

  1. 编辑 /etc/rc.conf 并添加以下行,以便在网络启动期间设置 NIS 域名并开始 ypbind(8)

nisdomainname="test-domain"
nis_client_enable="YES"
  1. 要从 NIS 服务器导入所有可能的密码条目,请使用 vipw/etc/master.passwd 中删除除一个用户帐户之外的所有用户帐户。删除帐户时,请记住,至少应保留一个本地帐户,并且此帐户应是 wheel 的成员。如果 NIS 存在问题,则可以使用此本地帐户远程登录、成为超级用户并修复问题。在保存编辑之前,请将以下行添加到文件末尾:

+:::::::::

此行将客户端配置为在 NIS 服务器的密码中为任何人提供有效帐户,以映射客户端上的帐户。通过修改此行,可以通过多种方式配置 NIS 客户端。使用网络组 中介绍了一种方法。要了解更多详细信息,请参阅 O’Reilly Media 出版的 Managing NFS and NIS

  1. 要从 NIS 服务器导入所有可能的组条目,请将此行添加到 /etc/group

+:*::

要立即启动 NIS 客户端,请以超级用户身份执行以下命令:

# /etc/netstart
# service ypbind start

完成这些步骤后,在客户端上运行 ypcat passwd 应显示服务器的 passwd 映射。

32.4.7. NIS 安全

由于 RPC 是一种基于广播的服务,在同一域内运行 ypbind 的任何系统都可以检索 NIS 映射的内容。为了防止未经授权的交换,ypserv(8) 支持一个叫做 securenets 的功能,它可以用来限制对一组特定主机的访问。默认情况下,这些信息存储在 /var/yp/securenets 中,除非 ypserv(8) 是以 -p 和另一个路径启动的。这个文件包含的条目由一个网络规范和一个网络掩码组成,中间用空格隔开。以 "#" 开头的行被认为是注释。一个 [.filename]#securenets 的样本可能看起来像这样:

# allow connections from local host -- mandatory
127.0.0.1     255.255.255.255
# allow connections from any host
# on the 192.168.128.0 network
192.168.128.0 255.255.255.0
# allow connections from any host
# between 10.0.0.0 to 10.0.15.255
# this includes the machines in the testlab
10.0.0.0      255.255.240.0

如果 ypserv(8) 收到来自与这些规则之一匹配的地址的请求,它将正常处理该请求。如果地址与规则不匹配,则将忽略该请求并记录警告消息。如果 securenets 不存在,ypserv 将允许来自任何主机的连接。

TCP wrapper 是一种替代机制,用于提供访问控制而不是 securenets。虽然这两种访问控制机制都增加一些安全性,但它们都容易受到“IP 欺骗”攻击。所有与 NIS 相关的流量都应在防火墙处阻止。

使用 securenets 的服务器可能无法为具有过时 TCP/IP 实现的合法 NIS 客户端提供服务。其中一些实现在执行广播时将所有主机位设置为零,或者在计算广播地址时无法观察到子网掩码。虽然其中一些问题可以通过更改客户端配置来解决,但其他问题可能会强制停用这些客户端系统或放弃 securenets

使用 TCP 包装会增加 NIS 服务器的延迟。额外的延迟可能足够长,会导致客户端程序超时,尤其是在具有慢速 NIS 服务器的繁忙网络中。如果一个或多个客户端存在延迟,请将这些客户端转换为 NIS 从属服务器,并强制它们绑定到自身。

32.4.7.1. 禁止某些用户

在此示例中,basie 系统是 NIS 域中的教师工作站。主 NIS 服务器上的 passwd 映射包含教职员工和学生的帐户。本节演示如何在拒绝学生登录的同时允许教师在此系统上登录。

要阻止指定的用户登录系统,即使他们存在于 NIS 数据库中,使用 vipw 在客户机上的 /etc/master.passwd 末尾添加 -username 和正确数量的冒号,其中 username 是要禁止登录的用户的用户名。含有被禁止的用户的那一行必须在允许 NIS 用户的 + 行之前。在这个例子中,bill 被禁止登录到 basie

basie# cat /etc/master.passwd
root:[password]:0:0::0:0:The super-user:/root:/bin/csh
toor:[password]:0:0::0:0:The other super-user:/root:/bin/sh
daemon:*:1:1::0:0:Owner of many system processes:/root:/usr/sbin/nologin
operator:*:2:5::0:0:System &:/:/usr/sbin/nologin
bin:*:3:7::0:0:Binaries Commands and Source,,,:/:/usr/sbin/nologin
tty:*:4:65533::0:0:Tty Sandbox:/:/usr/sbin/nologin
kmem:*:5:65533::0:0:KMem Sandbox:/:/usr/sbin/nologin
games:*:7:13::0:0:Games pseudo-user:/usr/games:/usr/sbin/nologin
news:*:8:8::0:0:News Subsystem:/:/usr/sbin/nologin
man:*:9:9::0:0:Mister Man Pages:/usr/share/man:/usr/sbin/nologin
bind:*:53:53::0:0:Bind Sandbox:/:/usr/sbin/nologin
uucp:*:66:66::0:0:UUCP pseudo-user:/var/spool/uucppublic:/usr/libexec/uucp/uucico
xten:*:67:67::0:0:X-10 daemon:/usr/local/xten:/usr/sbin/nologin
pop:*:68:6::0:0:Post Office Owner:/nonexistent:/usr/sbin/nologin
nobody:*:65534:65534::0:0:Unprivileged user:/nonexistent:/usr/sbin/nologin
-bill:::::::::
+:::::::::

basie#

32.4.8. 使用网络组

禁止指定用户登录到单个系统在较大的网络上变得无法扩展,并很快失去 NIS 的主要好处:集中管理

开发网络组是为了处理具有数百个用户和计算机的大型复杂网络。它们的使用与 UNIX® 组相当,其中的主要区别在于缺少数字 ID 以及通过包括用户帐户和其他网络组来定义网络组的能力。

为了扩展本章中使用的示例,将扩展 NIS 域以添加表 28.2 和 28.3 中所示的用户和系统:

表 25. 其他用户

用户名

说明

alpha,beta

IT 部门员工

charlie,delta

IT 部门学徒

echofoxtrottgolf

员工

able,baker , …

实习生

表 26. 其他系统

计算机名称

说明

war, deathfaminepollution

只有 IT 员工才能登录到这些服务器。

pride , greedenvywrathlustsloth

允许 IT 部门的所有成员登录到这些服务器。

one, twothreefour , …

员工使用的普通工作站。

trashcan

一台非常旧的机器,没有任何关键数据。甚至实习生也可以使用这个系统。

当使用网络组配置此方案时,会将每个用户分配到一个或多个网络组,然后允许或禁止网络组的所有成员登录。添加新计算机时,必须为所有网络组定义登录限制。添加新用户时,必须将该帐户添加到一个或多个网络组。如果仔细规划了 NIS 设置,则只需修改一个中央配置文件即可授予或拒绝对计算机的访问权限。

第一步是初始化 NIS ‘netgroup’ 映射。在 FreeBSD 中,默认情况下不创建此映射。在 NIS 主服务器上,使用编辑器创建名为 /var/yp/netgroup 的映射。

此示例创建四个网络组来表示 IT 员工、IT 学徒、员工和实习生:

IT_EMP  (,alpha,test-domain)    (,beta,test-domain)
IT_APP  (,charlie,test-domain)  (,delta,test-domain)
USERS   (,echo,test-domain)     (,foxtrott,test-domain) \
        (,golf,test-domain)
INTERNS (,able,test-domain)     (,baker,test-domain)

每个条目配置一个网络组。条目中的第一列是网络组的名称。每组括号表示一组由一个或多个组成的用户或另一个网络组的名称。指定用户时,每个组中以逗号分隔的三个字段表示:

  1. 表示用户的其他字段有效的主机的名称。如果未指定主机名,则该条目在所有主机上都有效。

  2. 属于此网络组的帐户的名称。

  3. 帐户的 NIS 域。帐户可以从其他 NIS 域导入到网络组中。

如果组包含多个用户,请用空格分隔每个用户。此外,每个字段可能包含通配符。有关详细信息,请参见 netgroup(5)

不应使用长度超过 8 个字符的网络组名称。名称区分大小写,对网络组名称使用大写字母是区分用户、计算机和网络组名称的简单方法。

一些非 FreeBSD NIS 客户端不能处理包含超过 15 个条目的网络组。通过创建多个具有 15 个或更少用户的子网络组以及由子网络组组成的真实网络组,可以规避此限制,如以下示例所示:

BIGGRP1  (,joe1,domain)  (,joe2,domain)  (,joe3,domain) [...]
BIGGRP2  (,joe16,domain)  (,joe17,domain) [...]
BIGGRP3  (,joe31,domain)  (,joe32,domain)
BIGGROUP  BIGGRP1 BIGGRP2 BIGGRP3

如果单个网络组中存在超过 225 个(15 x 15)个用户,请重复此过程。

要激活并分发新的 NIS 映射,请执行以下操作:

ellington# cd /var/yp
ellington# make

这将生成三个 NIS 映射 netgroupnetgroup.byhostnetgroup.byuser。使用 ypcat(1) 的映射键选项来检查新的 NIS 映射是否可用:

ellington% ypcat -k netgroup
ellington% ypcat -k netgroup.byhost
ellington% ypcat -k netgroup.byuser

第一个命令的输出应类似于 /var/yp/netgroup 的内容。第二个命令仅在创建特定于主机的网络组时生成输出。第三个命令用于获取用户的网络组列表。

要配置客户端,请使用 vipw(8) 指定网络组的名称。例如,在名为 war 的服务器上,替换以下行:

+:::::::::

+@IT_EMP:::::::::

这指定只有在网络组 IT_EMP 中定义的用户将被导入到这个系统的密码数据库,并且只有这些用户被允许登录到这个系统。

这个配置也适用于 shell 的 ~ 函数和所有在用户名和数字用户 ID 之间转换的程序。换句话说,cd ~user 将不工作,ls -l 将显示数字 ID 而不是用户名,find . -user joe -print 将会失败,提示 No such user。要解决这个问题,请导入所有用户条目,而不允许他们登录到服务器。这可以通过添加一个额外的行来实现:

+:::::::::/usr/sbin/nologin

此行将客户端配置为导入所有条目,但将这些条目中的 shell 替换为 /usr/sbin/nologin

确保在 +@IT_EMP::::::::: 放置了多行。否则,从 NIS 导入的所有用户帐户都将使用 /usr/sbin/nologin 作为其登录 shell,并且没有人能够登录到系统。

要配置不太重要的服务器,请将服务器上的 +::::::::: 替换为以下行:

+@IT_EMP:::::::::
+@IT_APP:::::::::
+:::::::::/usr/sbin/nologin

工作站的相应行是:

+@IT_EMP:::::::::
+@USERS:::::::::
+:::::::::/usr/sbin/nologin

NIS 支持从其他网组创建网组,这在有关用户访问的政策发生变化时很有用。一种可能性是创建基于角色的网组。例如,我们可以创建一个叫做 BIGSRV 的网组来定义重要服务器的登录限制,另一个叫做 SMALLSRV 的网组用于不太重要的服务器,第三个网组叫做 USERBOX 用于工作站。这些网组中的每一个都包含允许登录到这些机器上的网组。NIS netgroup 映射的新条目看起来是这样的。

BIGSRV    IT_EMP  IT_APP
SMALLSRV  IT_EMP  IT_APP  ITINTERN
USERBOX   IT_EMP  ITINTERN USERS

当可以定义具有相同限制的计算机组时,这种定义登录限制的方法相当有效。不幸的是,这是例外,而不是规则。大多数情况下,需要能够基于每台计算机定义登录限制。

特定于计算机的网络组定义是处理策略更改的另一种可能性。在这种情况下,每个系统的 /etc/master.passwd 包含两行以“+”开头的行。第一行添加一个网络组,其中包含允许登录到此计算机的帐户,第二行添加所有其他帐户,其中 /usr/sbin/nologin 作为 shell。建议使用主机名的“ALL-CAPS”版本作为网络组的名称:

+@BOXNAME:::::::::
+:::::::::/usr/sbin/nologin

在所有计算机上完成此任务后,不再需要再次修改 /etc/master.passwd 的本地版本。所有进一步的更改都可以通过修改 NIS 映射来处理。下面是此方案的 netgroup 映射示例:

# Define groups of users first
IT_EMP    (,alpha,test-domain)    (,beta,test-domain)
IT_APP    (,charlie,test-domain)  (,delta,test-domain)
DEPT1     (,echo,test-domain)     (,foxtrott,test-domain)
DEPT2     (,golf,test-domain)     (,hotel,test-domain)
DEPT3     (,india,test-domain)    (,juliet,test-domain)
ITINTERN  (,kilo,test-domain)     (,lima,test-domain)
D_INTERNS (,able,test-domain)     (,baker,test-domain)
#
# Now, define some groups based on roles
USERS     DEPT1   DEPT2     DEPT3
BIGSRV    IT_EMP  IT_APP
SMALLSRV  IT_EMP  IT_APP    ITINTERN
USERBOX   IT_EMP  ITINTERN  USERS
#
# And a groups for a special tasks
# Allow echo and golf to access our anti-virus-machine
SECURITY  IT_EMP  (,echo,test-domain)  (,golf,test-domain)
#
# machine-based netgroups
# Our main servers
WAR       BIGSRV
FAMINE    BIGSRV
# User india needs access to this server
POLLUTION  BIGSRV  (,india,test-domain)
#
# This one is really important and needs more access restrictions
DEATH     IT_EMP
#
# The anti-virus-machine mentioned above
ONE       SECURITY
#
# Restrict a machine to a single user
TWO       (,hotel,test-domain)
# [...more groups to follow]

使用基于计算机的网络组可能并不总是可取的。部署几十个或数百个系统时,可以使用基于角色的网络组而不是基于计算机的网络组,以将 NIS 映射的大小保持在合理的限制范围内。

32.4.9. 密码格式

NIS 要求 NIS 域中的所有主机使用相同的格式来加密密码。如果用户在 NIS 客户端上无法进行身份验证,则可能是由于密码格式不同。在异构网络中,所有操作系统都必须支持该格式,其中 DES 是最低的通用标准。

要检查服务器或客户端使用的格式,请查看 /etc/login.conf 的此部分:

default:\
    :passwd_format=des:\
    :copyright=/etc/COPYRIGHT:\
    [Further entries elided]

在这个例子中,系统使用 DES 格式进行密码散列。其他可能的值包括 blowfish 的 blf,MD5 的 md5,SHA-256 和 SHA-512 的 sha256sha512。关于更多的信息和系统上可用的最新列表,请查阅 crypt(3) 手册页。

如果需要编辑主机上的格式以匹配 NIS 域中使用的格式,则必须在保存更改后重建登录功能数据库:

# cap_mkdb /etc/login.conf

注意

在重建登录功能数据库后,每个用户在更改其密码之 ,不会更新现有用户帐户的密码格式。