集中授权使用目录服务,第二部分

作者:Alf Wachsmann

授权是决定实体 X 是否被允许访问资源 Y 的过程。确定 X 的身份是身份验证过程的工作。计算机网络中授权的一项任务是定义和确定哪个用户有权访问网络中的哪些计算机。一个简单的例子是计算机的 /etc/passwd 文件中的一行,joe:X:1234:56:/home/joe:/bin/bash,允许用户 joe 访问这台计算机。如果您想让用户 joe 访问多台计算机,您必须将此行添加到每台计算机的 /etc/passwd 文件中。

在 Linux 上,存在为每个应该被允许登录计算机的单个用户创建本地帐户的趋势。通常情况下是这样的,因为用户不仅需要登录权限,还需要访问额外的资源,例如执行某些工作的主目录。在每台计算机上创建一个本地帐户可以解决所有这些问题。

这种本地帐户方法的问题在于,这些帐户可能彼此不一致。相同的用户名在不同的计算机上可能具有不同的用户 ID 和/或组 ID。更成问题的是,当两个不同的帐户在不同的计算机上共享相同的用户 ID 和组 ID 时。computer1 上的用户 joe 可能具有用户 ID 1234 和组 ID 56,而 computer2 上的用户 jane 可能具有相同的用户 ID 1234 和组 ID 56。这在使用共享资源的情况下是一个很大的安全风险。对于 NFS 服务器来说,这两个不同的帐户是相同的,因此这些用户可以互相擦除对方的文件。

解决这种不一致问题的方案是只有一个集中的、权威的数据源来提供此类信息,并提供一种方法让您的所有计算机都可以访问此中心源。这就是目录服务的作用。用于集中授权数据的两种最广泛使用的目录服务是网络信息服务(NIS,以前称为黄页或 YP)和轻型目录访问协议(LDAP)。

NIS 与 LDAP

在决定使用哪个目录服务,NIS 还是 LDAP 时,需要考虑一些事项。如果您的公司已经维护了一个 LDAP 服务器,那么将授权数据添加到其中似乎很简单。但是,通常公司 LDAP 服务器用于白页和类似的相当轻量级的任务。添加授权任务会给 LDAP 服务器带来很大的负载,因为程序对用户名、UID、GID 等的每一次查找都需要由它来应答。通常,添加一个专门用于授权的额外 LDAP 服务器是有意义的。此外,由于目录查询的种类繁多,很难正确进行性能调优。您需要在 slapd.conf 文件中添加所有必要的 LDAP 索引定义,以加快常见查找速度,但您不希望添加过多的索引定义。这样做会使 LDAP 后端数据库文件变得很大,并且一切都会再次变慢。

LDAP 是网络中 UDP 数据包丢失问题较多的更好选择,因为它使用 TCP/IP,其中重传内置在网络协议层中。另一方面,NIS 使用基于 UDP 的远程过程调用 (RPC)。每个丢失的数据包都会导致 NIS 查询未应答,并且 NIS 客户端需要重复查询。使用命令netstat -s -u在网络中不同机器上的不同时间执行,以查看您的网络是否受到此问题的影响。您应该看到此命令报告的错误非常少。

我在本文中专注于 NIS,因为它更容易上手,并且在您遇到问题时,有一个相当简单的迁移到 LDAP 的路径。PADL Software Pty, Ltd. 提供了一套开源工具来帮助您将所有 NIS 数据文件转换为 LDAP(请参阅在线资源)。但是,您仍然必须完成性能调优部分。如果您想从 LDAP 迁移到 NIS,则必须自己编写迁移工具。

配置 NIS 服务器

NIS 服务器不需要大量的硬件资源。您周围的任何机器都应该可以完成这项工作。不过,您可能希望将此新功能放在专用机器上。在斯坦福线性加速器中心 (SLAC),我们使用一台旧的 Sun Netra T1 服务器为多达 500 个 Linux 和 Solaris 客户端提供服务,没有任何问题。我们有四台这样的 NIS 服务器用于大约 700 台 Solaris 和 Linux 桌面计算机,另外六台 NIS 服务器用于大约 2,500 台 Solaris 和 Linux 计算服务器。我们的客户端在服务器上的分布有些不均匀。

主服务器配置

登录到您要安装主 NIS 服务器的机器,并确保安装了最新的 portmap、ypserv 和 yp-tools RPM。如果未安装,请立即下载并安装它们。所有以下命令都必须以 root 用户身份发出。使用以下命令启动 portmapper 守护进程:

# service portmap start

下一步是定义您的新 NIS 域的名称。此名称可以是您喜欢的任何名称,但选择一个代表您公司内部部门的名称可能更有意义;对于 Example.Com 的所有 NIS 域,nis.example.com 或对于 Example.Com 内部工程部门,eng.example.com 将是不错的选择。

使用命令在您的主服务器上设置 NIS 域名

# domainname nis.example.com

您还必须添加行

NISDOMAIN=nis.example.com

到文件 /etc/sysconfig/network。

通过创建文件 /var/yp/securenets 并包含以下内容来限制对您的新 NIS 服务器的访问

# netmask       # network
255.255.255.0   192.168.0.0

这是一个至关重要的安全步骤。如果您没有此文件,全世界都可以查询您的 NIS 服务器。

下一步是定义您想要放入 NIS 的内容。为了授权的目的,/etc/group 和 /etc/passwd 文件以及称为 netgroup 的东西就足够了。但是,还有更多可能。要了解一些想法,请查看您的 NIS 服务器上的文件 /var/yp/Makefile。

下面,我展示了如何配置我提到的三个文件,以便通过 NIS 进行分发。

调整生成 NIS 映射数据库文件的 Makefile

# cp /var/yp/Makefile /var/yp/Makefile.save
# vi /var/yp/Makefile

将以下两个条目从 true 更改为 false,以防止合并 passwd 和 shadow 文件以及 group 和 gshadow 文件

MERGE_PASSWD=false
MERGE_GROUP=false

更改 NIS 应该查找其数据源的目录名称

YPSRCDIR = /etc/NIS
YPPWDDIR = /etc/NIS

注释掉所有不应从中构建 NIS 数据库的文件。我只保留了这三个文件

GROUP       = $(YPPWDDIR)/group
PASSWD      = $(YPPWDDIR)/passwd
NETGROUP    = $(YPSRCDIR)/netgroup

注释掉以 开头的行all其中包含所有潜在 NIS 映射的列表。添加新行

all:	passwd group netgroup

注意 TAB 字符。在 Makefile 中,您必须仅使用 TAB 字符,而不是空格,来缩进命令。

现在,创建 Makefile 中定义的数据源目录

# mkdir /etc/NIS/
# chmod 700 /etc/NIS

并在其中放入一个 passwd 文件

# grep -v '^root' /etc/passwd > /etc/NIS/passwd

您应该不仅删除 root 帐户,还删除此文件中的所有系统帐户,只留下真正的用户帐户。

如果您仍然使用带有加密密码的 /etc/passwd,那么现在是时候将它们转换为 Kerberos 5 了,如上一篇文章 [LJ,2005 年 2 月] 中所述。如果您不这样做,当 passwd 文件分发到从属 NIS 服务器或 NIS 客户端时,您的加密密码将在网络上暴露。

现在,收集所有将成为您的新 NIS 域成员的机器的本地 /etc/passwd 文件。删除所有系统帐户,然后将它们与

% cat passwd_1 passwd_2 passwd_3 ... > passwd_merge

使用此命令删除所有重复条目

% sort passwd_merge | uniq > passwd_uniq

使用

% cut -d':' -f1 passwd_uniq | sort | uniq -c | \
egrep -v "\s*1"

如果这产生任何输出,则您有两个具有相同帐户名称的不同条目。如果差异不在 UID 或 GID 字段中,只需决定使用其中一个条目并删除另一个。如果差异是 UID 或 GID 字段,则您需要解决此冲突,这可能相当复杂。

另一个一致性检查是查看是否有任何两个不同的帐户具有相同的 UID,如果此命令

% cut -d':' -f3 passwd_uniq | sort | uniq -c | \
egrep -v "\s*1"

产生任何输出,则表示存在这种情况;输出中的第二个数字是重复的 UID。再次解决此冲突可能相当复杂。对您的所有 /etc/group 文件执行相同的合并和检查。

将结果文件复制到 /etc/NIS/passwd 和 /etc/NIS/group。稍后我将回到 netgroup 文件。现在先将其排除在外。

现在,使用

# service ypserv start

使用命令初始化 NIS 映射

# /usr/lib/yp/ypinit -m

并按照打印的说明进行操作。

为了让您的 NIS 主服务器可以使用所有 NIS 映射,您可能还希望将此机器设置为 NIS 客户端。确保此 NIS 客户端只能绑定到 NIS 主服务器作为服务器,以防止在启动所有机器时出现循环依赖,例如在断电后。

从服务器配置

NIS 从服务器是 NIS 客户端,它们将从 NIS 主服务器接收的映射重新分发给其他 NIS 客户端。确保在您的所有从服务器机器上安装了最新的 portmap、ypserv、ypbind 和 yp-tools RPM。配置 NIS 从服务器的第一步是将其配置为 NIS 客户端。请参阅下一节了解如何执行此操作。

一旦配置了 NIS 客户端,使用以下命令启动它

# service ypbind start

在您的 NIS 主服务器上,将新的 NIS 从服务器的名称添加到文件 /var/yp/ypservers,并运行以下命令

# cd /var/yp
# /usr/lib/yp/makedbm ypservers
/var/yp/nis.example.com/ypservers

您还需要将 NIS 主服务器上文件 /etc/YP/Makefile 中 NOPUSH 的定义从 true 更改为 false,以便从您的主服务器将更新的 NIS 映射推送到您的从服务器。

回到您的新 NIS 从服务器,使用以下命令初始化从服务器

# /usr/lib/yp/ypinit -s nismaster

其中nismaster是您的 NIS 主服务器的名称。如果您的 DNS 返回名称查找的 FQDN,则这需要是完全限定域名 (FQDN)。将文件 /var/yp/securenets 从您的 NIS 主服务器复制到新的从服务器,并使用以下命令启动新的 NIS 从服务器

# service ypserv start

请记住更新您的灾难恢复计划,以反映您的 NIS 从服务器对您的 NIS 主服务器的新依赖关系。

客户端配置

在您的所有客户端上安装最新的 ypbind、yp-tools 和 portmap RPM。编辑文件 /etc/yp.conf 以告知客户端您的 NIS 服务器

ypserver nismaster.example.com

如果您有一些从服务器,也为每个从服务器添加一行。在您的客户端上为这些服务器使用随机顺序,以便在所有可用服务器上获得某种程度的负载均衡。

在 /etc/sysconfig/network 中添加一行以定义客户端的 NIS 域

NISDOMAIN=nis.example.com

并使用命令设置 NIS 域名

# domainname nis.example.com

启动 portmapper,使用

# service portmap start

并在每个客户端上启动 NIS 客户端,使用

# service ypbind start

在每个客户端上。

命令ypwhich现在应该输出此客户端已绑定的 NIS 服务器。

使用ypcat命令来检查您的 NIS 映射的内容。例如

% ypcat passwd

接下来,您必须告诉您的客户端上的所有查找都使用 NIS。这在名称服务切换配置文件 /etc/nsswitch.conf(5) 中完成。将 passwd、group 和 netgroup 条目更改为

passwd:       compat
group:        files nis
netgroup:     nis

这定义了组查找的搜索顺序:首先从本地 /etc/group 文件开始,然后尝试 NIS 查找。Netgroups 仅来自 NIS。稍后我将回到 passwd 的 compat 条目。

名称服务缓存守护进程 nscd(8) 有时在更新其内部缓存时会出现问题。效果是 NIS 映射中的更改在特定客户端上不可见。在该机器上重新启动 nscd 是解决此问题的唯一方法。

典型用法

您应该熟悉的两个从 NIS 查询信息的命令是 ypcat(1) 和 ypmatch(1)。ypcat打印 NIS 映射中所有键的值。命令ypcat passwd打印您的 NIS passwd 映射中的所有条目。ypmatch打印 NIS 映射中一个或多个键的值;ypmatch jane passwd输出帐户 jane 的 passwd 条目。

NIS 组映射

NIS 组映射的典型用途是允许多个用户之间共享文件。这适用于本地文件以及 NFS 中的文件。以下是如何设置它。假设您有两个用户(此技术适用于任意数量的用户),其 passwd 映射条目如下

jane:*:1234:42:Jane:/home/jane:/bin/bash
joe:*:5678:57:Joe:/home/joe:/bin/bash

这定义了 jane 的主要组 ID 为 42,joe 的为 57。

使用 NIS 组映射,您可以为帐户添加额外的辅助组成员资格。组条目

projectX:*:127:jane,joe

定义了一个新的组 projectX,没有密码 (*),组 ID 为 127,并且有两个成员。组文件中不允许注释。

如果您现在为组 projectX 设置一个具有读/写/执行权限的目录

# mkdir /projects/X/
# chgrp projectX /projects/X/
# chmod g+wrx /projects/X/

projectX 组中的每个成员都有权读取/写入/执行该文件空间内的文件。用户可能需要先执行newgrp projectX

每当您需要添加帐户或从组映射中删除帐户时,请在您的 NIS 主服务器上通过编辑 /etc/NIS/group 文件并执行命令

% cd /var/yp
% sudo make group

这些命令生成一个新的组映射,使更改在所有客户端上立即可见。无需触摸任何客户端即可进行这些更改。现在一切都集中在您的 NIS 主服务器上的一个位置。

NIS 网络组

网络组与组非常不同。网络组有两种类型,用户网络组和主机网络组。两种类型的网络组都可以包含作为成员的网络组,因此网络组定义可以是分层的。两种类型的网络组都在同一个网络组文件中定义。网络组文件中允许注释。

/etc/NIS/netgroup 中的主机网络组定义如下所示

# Group of project groups:
projects \
      projectA \
      projectB \
      projectX

# Group of hosts for Project X
projectX \
        (host1.example.com,-,) \
        (host2.example.com,-,) \
        (host3.example.com,-,)

这些主机网络组定义现在允许您,例如,仅将 NFS 空间导出到您的机器子集。在您的 NFS 服务器的 /etc/exports 文件中,您可以使用如下结构

# export the /projects directory to all machines
# in the "projects" netgroup
/projects    @projects(rw,root_squash)

# export Project X' space only to machines
# in the "projectX" netgroup
/projects/X           @projectX(rw,root_squash)

同样,添加或删除主机或添加/删除网络组只是简单地编辑您的 NIS 主服务器上的 /etc/NIS/netgroup 文件。执行cd /var/yp; sudo make netgroup以更新 NIS 映射,更改将立即在任何地方可见。

用户网络组

用户网络组是具有帐户作为成员的网络组,通常用于限制登录到计算机。用户网络组定义与主机网络组定义略有不同

# Group of project user groups
u-projects \
        u-projectA \
        u-projectB \
        u-projectX

# Group of users in Project X
u-projectX \
        (-,jane,) \
        (-,joe,) \
        (-,nick,)

名称中的前缀 u- 是一种约定,用于区分用户网络组和主机网络组。

有了这些定义,您现在可以使用机器的本地 /etc/passwd 文件中的这些类型的条目来授予或限制对您的计算机的登录访问权限。如果存在,请删除 passwd 文件末尾的 +

  • 允许 u-projects 网络组中的所有帐户访问,不允许其他任何人访问

    +@u-projects
    
  • 仅允许 u-projectX 网络组成员访问,不允许其他任何人访问

    +@u-projectX
    
  • 允许 u-projects 中的所有人访问,但不允许 u-projectX 中的人访问

    -@u-projectX
    +@u-projects
    

    这里的顺序很重要。第一个匹配项决定会发生什么。

  • 允许 u-projectA 中的所有人访问,也允许帐户 nick 访问

    +@u-projectA
    +nick
    

有关 nick 的信息(主目录、登录 shell 等)来自 NIS passwd 映射。最好避免在此处放置显式帐户名称,因为这些条目的管理不是集中的。

为了使此 +/- 语法起作用,您的客户端需要在其 /etc/nsswitch.conf 文件中具有条目

passwd:         compat

在其 /etc/nsswitch.conf 文件中。

结论

一旦您克服了安装 NIS 服务器并使您的授权数据一致的最初障碍,您就可以开始享受集中化的优势。网络组允许从一个中心位置进行复杂和细粒度的访问控制。

本文资源: www.linuxjournal.com/article/7967

Alf Wachsmann 博士自 1999 年以来一直在斯坦福线性加速器中心 (SLAC) 工作。他负责 Linux 自动安装的所有领域,包括农场节点、服务器和桌面。他的工作重点是 AFS 支持、迁移到 Kerberos 5、用户注册项目和用户顾问。

加载 Disqus 评论