32.4.网络信息系统(NIS)
网络信息系统(NIS)旨在集中管理类似 UNIX® 的系统,如 Solaris™、HP-UX、AIX®、Linux、NetBSD、OpenBSD 和 FreeBSD。NIS 最初被称为 Yellow Pages,但由于商标问题,名称发生了更改。这也是 NIS 命令以 yp
开头的原因。
NIS 是一个基于远程过程调用(RPC)的客户端/服务器系统,允许在 NIS 域内的一组机器共享一组公共的配置文件。这样,系统管理员只需通过最少的配置数据即可设置 NIS 客户端系统,并能从一个位置添加、删除或修改配置数据。
FreeBSD 使用 NIS 协议的版本 2。
32.4.1. NIS 术语与进程
表 28.1 总结了 NIS 使用的术语和重要进程:
表1 NIS 术语
术语
描述
NIS 域名
NIS 服务器和客户端共享一个 NIS 域名。通常,这个名称与 DNS 无关。
该服务启用 RPC,必须运行才能启动 NIS 服务器或作为 NIS 客户端运行。
该服务将 NIS 客户端绑定到其 NIS 服务器。它会使用 NIS 域名并通过 RPC 连接到服务器。它是 NIS 环境中客户端/服务器通信的核心。如果该服务在客户端机器上未运行,则无法访问 NIS 服务器。
这是 NIS 服务器的进程。如果此服务停止运行,服务器将无法响应 NIS 请求,因此希望有一个从服务器接管。一些非 FreeBSD 客户端可能不会尝试使用从服务器重新连接,可能需要在这些客户端上重启 ypbind 进程。
这个进程只在 NIS 主服务器上运行。该守护进程允许 NIS 客户端更改其 NIS 密码。如果该守护进程没有运行,用户将不得不登录到 NIS 主服务器并在那里更改密码。
32.4.2. 机器类型
在 NIS 环境中有三种类型的主机:
NIS 主服务器 该服务器作为主机配置文件信息的中央存储库,维护所有 NIS 客户端使用的文件的权威副本。passwd、group 以及其他各种文件存储在主服务器上。虽然一台机器可以作为多个 NIS 域的 NIS 主服务器,但本章不涉及这种配置,假设是一个相对小规模的 NIS 环境。
NIS 从服务器 NIS 从服务器维护 NIS 主服务器数据文件的副本,以提供冗余。从服务器还帮助平衡主服务器的负载,因为 NIS 客户端始终连接到响应最快的 NIS 服务器。
NIS 客户端 NIS 客户端在登录时通过 NIS 服务器进行身份验证。
许多文件中的信息可以通过 NIS 共享。master.passwd、group 和 hosts 文件通常通过 NIS 共享。每当客户端上的进程需要在这些文件中本地找到的信息时,它会向绑定的 NIS 服务器发出查询。
32.4.3. 规划考虑
本节描述了一个示例 NIS 环境,该环境包含 15 台 FreeBSD 机器,没有集中管理点。每台机器都有自己的 /etc/passwd 和 /etc/master.passwd。这些文件仅通过手动干预保持同步。目前,当需要向实验室添加用户时,必须在所有 15 台机器上重复此过程。
实验室的配置如下:
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. 的艺术部门可能使用 "acme-art" 作为 NIS 域名。此示例将使用域名 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 主服务器可以相对直接,具体取决于环境需求。由于 FreeBSD 提供了内置的 NIS 支持,因此只需通过将以下行添加到 /etc/rc.conf 来启用它:
① 此行将 NIS 域名设置为
test-domain
。② 该行自动在系统启动时启动 NIS 服务器进程。
在多服务器域中,服务器机器也是 NIS 客户端时,需要格外小心。通常建议强制服务器绑定到自己,而不是允许它们广播绑定请求并可能彼此绑定。如果一台服务器出现故障且其他服务器依赖于它,可能会导致奇怪的故障模式。最终,所有客户端将超时并尝试绑定到其他服务器,但涉及的延迟可能相当长,且故障模式仍然存在,因为服务器可能会再次彼此绑定。
可以通过在 /etc/rc.conf 中添加以下行,强制同时作为客户端的服务器绑定到特定的服务器:
① 启用客户端相关的功能。
② 此行将 NIS 域名设置为
test-domain
并绑定到自身。
32.4.4.1. 初始化 NIS 映射
NIS 映射是从 NIS 主服务器上的 /etc 配置文件生成的,唯一的例外是 /etc/master.passwd。这样做是为了防止将密码传播到 NIS 域中的所有服务器。因此,在初始化 NIS 映射之前,先配置主密码文件:
建议删除所有系统账户条目以及不需要传播到 NIS 客户端的用户账户,如 root
和其他任何管理员账户。
注意
确保 /var/yp/master.passwd 文件对组或其他用户不可读,将其权限设置为
600
。
这将从 /var/yp/Makefile.dist 创建 /var/yp/Makefile。默认情况下,此文件假定环境只有一个 NIS 服务器,并且只有 FreeBSD 客户端。由于 test-domain
有一个从服务器,因此请在 /var/yp/Makefile 中编辑此行,将其注释掉 (#
):
32.4.4.2. 添加新用户
每当创建一个新用户时,必须将用户账户添加到主 NIS 服务器,并重建 NIS 映射。在此操作完成之前,新用户只能在 NIS 主服务器上登录。例如,要将新用户 jsmith
添加到 test-domain
域中,请在主服务器上运行以下命令:
也可以使用 adduser jsmith
来代替 pw useradd jsmith
添加用户。
32.4.5. 设置 NIS 从服务器
要设置 NIS 从服务器,请登录到从服务器并像设置主服务器一样编辑 /etc/rc.conf。不要生成任何 NIS 映射,因为这些映射已经存在于主服务器上。在从服务器上运行 ypinit
时,使用 -s
(表示从服务器)而不是 -m
(表示主服务器)。此选项需要指定 NIS 主服务器的名称,以及域名,如下例所示:
这将在从服务器上生成一个名为 /var/yp/test-domain 的目录,其中包含 NIS 主服务器的映射副本。通过在每个从服务器的 /etc/crontab 文件中添加以下条目,可以强制从服务器与主服务器同步映射:
这些条目不是强制性的,因为主服务器会自动尝试将任何映射更改推送到其从服务器。然而,由于客户端可能依赖从服务器提供正确的密码信息,因此建议强制频繁更新密码映射。这对于繁忙的网络尤其重要,因为映射更新可能无法始终完成。
配置完成后,在从服务器上运行 /etc/netstart
以启动 NIS 服务。
32.4.6. 设置 NIS 客户端
要配置 FreeBSD 机器为 NIS 客户端,请按照以下步骤操作:
要从 NIS 服务器导入所有可能的密码条目,请使用
vipw
删除 /etc/master.passwd 中的所有用户账户,除了一个。删除账户时,请记住至少保留一个本地账户,并且该账户应为wheel
组成员。如果出现 NIS 问题,可以使用此本地账户远程登录,成为超级用户并修复问题。在保存编辑之前,将以下行添加到文件末尾:
要从 NIS 服务器导入所有可能的组条目,请在 /etc/group 中添加以下行:
要立即启动 NIS 客户端,作为超级用户执行以下命令:
完成这些步骤后,在客户端运行 ypcat passwd
应显示服务器的 passwd 映射。
32.4.7. NIS 安全性
使用 securenets 的服务器可能会无法为具有古老 TCP/IP 实现的合法 NIS 客户端提供服务。这些实现中的一些会在进行广播时将所有主机位设置为零,或在计算广播地址时未遵守子网掩码。虽然一些问题可以通过更改客户端配置来修复,但其他问题可能迫使这些客户端系统退役,或者放弃使用 securenets。
使用 TCP Wrapper 会增加 NIS 服务器的延迟。额外的延迟可能足够长,以致于客户端程序在繁忙的网络上,尤其是在 NIS 服务器响应缓慢时,出现超时。如果一个或多个客户端遭遇延迟,可以将这些客户端转换为 NIS 从服务器,并强制它们绑定到自己。
32.4.7.1. 屏蔽某些用户
在这个例子中,basie
系统是 NIS 域中的一台教职工工作站。主 NIS 服务器上的 passwd 映射包含了教职工和学生的账户。本节演示了如何允许教职工在此系统上登录,同时拒绝学生的登录。
为了防止指定的用户登录系统,即使他们存在于 NIS 数据库中,可以使用 vipw
在客户端的 /etc/master.passwd 文件末尾添加 -<用户名>
,其中 用户名 是要禁止登录的用户的用户名。被屏蔽的用户行必须出现在允许 NIS 用户的 +
行之前。在这个例子中,bill
被禁止登录 basie
:
32.4.8. 使用 Netgroups
在较大的网络中,将特定用户阻止登录到单个系统变得不可扩展,并且很快就会失去 NIS 的主要优势:集中管理。
Netgroups 的开发是为了处理具有数百个用户和机器的大型复杂网络。它们的使用类似于 UNIX® 组,主要区别在于没有数字 ID,并且可以通过包括用户账户和其他 netgroups 来定义一个 netgroup。
为了扩展本章中使用的示例,NIS 域将扩展以添加表格 28.2 和 28.3 中所示的用户和系统:
表 2. 其他用户
alpha
, beta
IT 部门员工
charlie
, delta
IT 部门学徒
echo
, foxtrott
, golf
, …
员工
able
, baker
, …
实习生
表 3. 其他系统
war
, death
, famine
, pollution
只有 IT 员工可以登录这些服务器。
pride
, greed
, envy
, wrath
, lust
, sloth
所有 IT 部门成员都可以登录这些服务器。
one
, two
, three
, four
, …
员工使用的普通工作站。
trashcan
一台非常旧的机器,没有任何关键数据。甚至实习生也可以使用这台系统。
使用 netgroups 配置这个场景时,每个用户都被分配到一个或多个 netgroups,然后允许或禁止所有 netgroup 成员登录。当添加新机器时,必须为所有 netgroups 定义登录限制。当添加新用户时,必须将账户添加到一个或多个 netgroups。如果 NIS 设置计划得当,只需要修改一个中央配置文件,就可以授予或拒绝对机器的访问权限。
第一步是初始化 NIS 的 netgroup
映射。在 FreeBSD 中,默认情况下不会创建此映射。在 NIS 主服务器上,使用编辑器创建一个名为 /var/yp/netgroup 的映射。
此示例创建了四个 netgroups,分别表示 IT 员工、IT 学徒、员工和实习生:
每个条目配置一个 netgroup。条目的第一列是 netgroup 的名称。每组括号表示一个或多个用户组或另一个 netgroup 的名称。在指定用户时,每组中的三个由逗号分隔的字段表示:
该字段表示用户有效的主机名称。如果未指定主机名,则该条目对所有主机有效。
该账户所属的用户名。
该账户的 NIS 域。账户可以从其他 NIS 域导入到一个 netgroup 中。
netgroup 名称不应超过 8 个字符。名称区分大小写,使用大写字母作为 netgroup 名称是区分用户、机器和 netgroup 名称的一个简单方法。
一些非 FreeBSD 的 NIS 客户端无法处理包含超过 15 个条目的 netgroups。可以通过创建几个包含 15 个或更少用户的子 netgroups,并使用这些子 netgroups 创建一个真实的 netgroup 来绕过这一限制,如下所示:
如果一个 netgroup 中有超过 225 个用户(15 × 15),请重复此过程。
要激活并分发新的 NIS 映射:
第一个命令的输出应类似于 /var/yp/netgroup 的内容。第二个命令只有在创建了特定于主机的 netgroups 时才会产生输出。第三个命令用于获取某个用户的 netgroup 列表。
为:
这表示仅在 netgroup IT_EMP
中定义的用户将被导入该系统的密码数据库,并且仅允许这些用户登录该系统。
此配置也适用于 shell 的 ~
功能以及所有在用户名和数字用户 ID 之间转换的程序。换句话说,cd ~user
将无法工作,ls -l
将显示数字 ID 而不是用户名,find . -user joe -print
将显示“没有此用户”的消息。为了解决这个问题,可以导入所有用户条目,但不允许他们登录到服务器。这可以通过添加一行额外的配置来实现:
这一行配置客户端导入所有条目,但将这些条目的 shell 替换为 /usr/sbin/nologin。
确保这一额外的行放置在 +@IT_EMP:::::::::
之后。否则,所有从 NIS 导入的用户账户将具有 /usr/sbin/nologin 作为登录 shell,没人能够登录系统。
要配置较不重要的服务器,请将这些行替换为服务器上的旧行:
工作站的相应行应为:
NIS 支持从其他 netgroups 创建 netgroups,这在用户访问政策发生变化时非常有用。一种可能性是创建基于角色的 netgroups。例如,可以创建一个名为 BIGSRV
的 netgroup 来定义重要服务器的登录限制,另一个名为 SMALLSRV
的 netgroup 用于较不重要的服务器,再创建一个名为 USERBOX
的 netgroup 用于工作站。每个这些 netgroups 包含了允许登录这些机器的 netgroups。新的 NIS netgroup
映射条目如下所示:
这种定义登录限制的方法在能够定义具有相同限制的机器组时效果很好。不幸的是,这通常是例外而不是规则。大多数时候,需要按机器定义登录限制。
另一种可能性是基于机器的 netgroup 定义,以应对政策的变化。在这种情况下,每台系统的 /etc/master.passwd 文件中包含两行以 "+" 开头的行。第一行添加一个 netgroup,其中包含允许登录到该机器的账户;第二行添加所有其他账户,shell 为 /usr/sbin/nologin。建议使用主机名的大写版本作为 netgroup 的名称:
完成所有机器上的这一任务后,就不再需要修改本地版本的 /etc/master.passwd。所有进一步的更改可以通过修改 NIS 映射来处理。以下是此场景的可能 netgroup
映射示例:
使用基于机器的 netgroups 可能并不总是可取的。当部署几十或几百台系统时,使用基于角色的 netgroups 而不是基于机器的 netgroups 可以保持 NIS 映射的合理大小。
32.4.9. 密码格式
NIS 要求 NIS 域内的所有主机使用相同的密码加密格式。如果用户在 NIS 客户端上遇到身份验证问题,可能是由于密码格式不同。在异构网络中,所有操作系统都必须支持该格式,其中 DES 是最低的通用标准。
要检查服务器或客户端使用的是哪种格式,请查看 /etc/login.conf 文件中的以下部分:
如果需要编辑主机上的格式,以使其与 NIS 域中使用的格式匹配,则必须在保存更改后重新构建登录功能数据库:
注意
在登录功能数据库重新构建之后,现有用户账户的密码格式不会立即更新,直到每个用户更改其密码。
最后更新于