本章介绍有关如何使用安全 RPC 通过 NFS 挂载来验证主机和用户的信息。以下是本章中的主题列表:
安全 RPC(Remote Procedure Call,远程过程调用)使用验证机制保护远程过程。Diffie-Hellman 验证机制可验证发出服务请求的主机和用户。此验证机制使用数据加密标准 (Data Encryption Standard, DES) 加密。使用安全 RPC 的应用程序包括 NFS 和名称服务(NIS 和 NIS+)。
NFS 可使多台主机通过网络共享文件。在 NFS 服务中,一台服务器可为多台客户机保存数据和资源。这些客户机具有访问服务器与客户机共享的文件系统的权限。登录到客户机系统的用户可以通过从服务器挂载文件系统来访问文件系统。对于客户机系统上的用户,就好像这些文件是客户机的本地文件。NFS 的一种最常见的用途是允许将系统安装在办公室中,同时将所有用户文件存储在中心位置。NFS 服务的某些功能(例如 mount 命令的 -nosuid 选项)可用于禁止未经授权的用户打开设备和文件系统。
NFS 服务使用安全 RPC 来验证通过网络发出请求的用户。此过程称为安全 NFS。Diffie-Hellman 验证机制 AUTH_DH 使用 DES 加密来确保授权访问。 AUTH_DH 机制也称为 AUTH_DES。 详细信息,请参见以下内容:
要设置和管理安全 NFS,请参见《系统管理指南:网络服务》中的“管理安全 NFS 系统”。
要设置 NIS+ 表以及在 cred 表中输入名称,请参见《System Administration Guide: Naming and Directory Services (NIS+)》。
有关涉及 RPC 验证的事务的概述,请参见Diffie-Hellman 验证的实现。
数据加密标准 (Data Encryption Standard, DES) 加密功能使用 56 位密钥来加密数据。如果两个凭证用户或主体知道同一 DES 密钥,则他们可以通过使用此密钥加密和解密文本来进行秘密通信。DES 是一种相对迅速的加密机制。DES 芯片可使加密更迅速。但是,如果不存在此芯片,则将替换软件实现。
仅使用 DES 密钥的风险是入侵者可以收集足够的使用相同密钥加密的加密文本消息,从而能够获取密钥并对这些消息进行解密。因此,安全系统(例如安全 NFS)需要经常更改密钥。
Kerberos 是 MIT(麻省理工学院)开发的验证系统。Kerberos 中的某些加密基于 DES。Kerberos V4 支持不再作为安全 RPC 的一部分提供。但是,此发行版中包括使用 RPCSEC_GSS 的 Kerberos V5 客户端和服务器端实现。有关更多信息,请参见第 20 章,Kerberos 服务介绍。
入侵者很难破解用于验证用户的 Diffie-Hellman (DH) 方法。客户机和服务器都有自己的私钥,它们将此私钥与公钥一起使用以设计公用密钥。私钥也称为密钥。客户机和服务器使用公用密钥来相互通信。公用密钥使用公认的加密功能(例如 DES)进行加密。
验证基于发送系统使用公用密钥加密当前时间的能力。然后,接收系统可以进行解密,并根据其当前时间进行检查。客户机和服务器上的时间必须同步。有关更多信息,请参见《系统管理指南:网络服务》中的“管理网络时间协议(任务)”。
公钥和私钥存储在 NIS 或 NIS+ 数据库中。NIS 将密钥存储在 publickey 映射中。NIS+ 将密钥存储在 cred 表中。这些文件包含所有潜在用户的公钥和私钥。
系统管理员负责设置 NIS 映射或 NIS+ 表,以及为每个用户生成公钥和私钥。将使用用户口令以加密格式存储私钥。此过程使得私钥只对此用户公开。
本节介绍客户机-服务器会话中使用 Diffie-Hellman 验证 (AUTH_DH) 的系列事务。
执行事务之前,管理员会运行 newkey 或 nisaddcred 命令来生成公钥和密钥。每个用户都拥有唯一的公钥和密钥。公钥存储在公共数据库中。密钥以加密格式存储在同一数据库中。chkey 命令可更改密钥对。
通常,登录口令与安全 RPC 口令相同。在这种情况下,不需要 keylogin 命令。但是,如果口令不同,则用户必须登录,然后运行 keylogin 命令。
keylogin 命令提示用户键入安全 RPC 口令。此命令然后使用口令对密钥进行解密。随后,keylogin 命令将解密的密钥传递到 keyserver 程序。keyserver 是一种在每台计算机上都有本地实例的 RPC 服务。keyserver 会保存解密的密钥,并等待用户使用服务器启动安全 RPC 事务。
如果登录口令与 RPC 口令相同,则登录进程会将密钥传递到 keyserver。如果要求不同的口令,则用户必须始终运行 keylogin 命令。如果 keylogin 命令包括在用户的环境配置文件(例如 ~/.login、~/.cshrc 或 ~/.profile 文件)中,则用户登录时便会自动运行 keylogin 命令。
keyserver 随机生成一个对话密钥。
内核使用此对话密钥以及其他材料对客户机的时间标记进行加密。
keyserver 在公钥数据库中查找服务器的公钥。有关更多信息,请参见 publickey(4) 手册页。
keyserver 使用客户机的密钥以及服务器的公钥来创建一个公用密钥。
keyserver 使用此公用密钥对此对话密钥进行加密。
然后,会将包含加密的时间标记和对话密钥的传输内容发送到服务器。此传输内容包括凭证和检验器。此凭证包含三个组件:
客户机的网络名称
使用公用密钥加密的对话密钥
使用对话密钥加密的“窗口”
此窗口显示客户机允许服务器时钟与客户机时间标记之间存在的时间差异。如果服务器时钟与时间标记之间的差异大于此窗口显示的值,则服务器会拒绝客户机的请求。正常情况下,不会出现这种拒绝,因为客户机在启动 RPC 会话之前会先与服务器进行同步。
加密的时间标记
按 1 递减的指定窗口的已加密检验器
如果某人要模拟用户,则会需要窗口检验器。模拟者可以编写一个程序,从而只需插入随机位,而无需填写凭证和检验器的已加密字段。服务器将对话密钥解密为某一随机密钥。然后,服务器使用此密钥尝试对窗口和时间标记进行解密。结果是随机数字。但是,经过几千次尝试之后,随机窗口/时间标记对可能会通过验证系统。窗口检验器可降低假凭证通过验证的可能性。
服务器从客户机接收传输内容时,将发生以下情况:
服务器的本地 keyserver 在公钥数据库中查找客户机的公钥。
keyserver 使用客户机的公钥以及服务器的密钥来推导公用密钥。此公用密钥与客户机计算所得的公用密钥相同。只有服务器和客户机才能计算公用密钥,因为此计算过程需要知道其中一个密钥。
内核使用公用密钥对此对话密钥进行解密。
内核调用 keyserver 以使用解密的对话密钥对客户机的时间标记进行解密。
服务器对客户机的时间标记进行解密之后,将在凭证表中存储四个信息项:
客户机的计算机名称
对话密钥
窗口
客户机的时间标记
服务器存储前三项供将来使用,存储客户机的时间标记以防止重放。服务器只接受时间上晚于最新时间标记的时间标记。因此,可保证拒绝任何重放的事务。
调用方的名称将隐含在这些事务中,此调用方必须通过某种方式进行验证。keyserver 不能使用 DES 验证来验证调用方,因为 keyserver 使用 DES 时会导致死锁。为了避免死锁,keyserver 将通过用户 ID (user ID, UID) 来存储密钥,并且只将请求授予本地 root 进程。
服务器在其凭证高速缓存中记录的索引 ID
减 1 的客户机时间标记(由对话密钥加密)
从客户机的时间标记中减 1 的原因是确保此时间标记已过时。过时的时间标记不能再用作客户机检验器。
客户机将接收检验器并验证服务器。客户机知道只有服务器才能发送检验器,因为只有服务器知道客户机发送的时间标记。
对于第一个事务之后的每一个事务,客户机都在其下一个事务中将索引 ID 返回到服务器。客户机还发送另一个加密的时间标记。服务器会将使用对话密钥加密的减 1 的客户机时间标记发送回来。
以下任务列表说明为 NIS、NIS+ 和 NFS 配置安全 RPC 的过程。
任务 |
说明 |
参考 |
---|---|---|
1. 启动 keyserver。 |
确保可以创建密钥以对用户进行验证。 | |
2. 在 NIS+ 主机上设置凭证。 |
确保主机上的 root 用户可以在 NIS+ 环境中进行验证。 | |
3. 为 NIS+ 用户提供密钥。 |
使用户可以在 NIS+ 环境中进行验证。 | |
4. 在 NIS 主机上设置凭证。 |
确保主机上的 root 用户可以在 NIS 环境中进行验证。 | |
5. 为 NIS 用户提供密钥。 |
使用户可以在 NIS 环境中进行验证。 | |
6. 通过验证共享 NFS 文件。 |
使 NFS 服务器可以使用验证来安全地保护共享的文件系统。 |
通过要求对已挂载 NFS 文件系统的使用进行验证,可以增强网络的安全性。
承担主管理员角色,或成为超级用户。
主管理员角色拥有主管理员配置文件。要创建角色并将角色指定给用户,请参见《系统管理指南:基本管理》中的第 2 章 “使用 Solaris Management Console(任务)”。
# svcs \*keyserv\* STATE STIME FMRI disabled Dec_14 svc:/network/rpc/keyserv |
# svcadm enable network/rpc/keyserv |
应该针对 NIS+ 域中的每个主机执行此过程。以 root 身份运行 keylogin 命令之后,服务器便会具有 mech_dh 的 GSS-API 接收器凭证,而客户机具有 GSS-API 启动器凭证。
有关 NIS+ 安全性的详细说明,请参见《System Administration Guide: Naming and Directory Services (NIS+)》。
承担主管理员角色,或成为超级用户。
主管理员角色拥有主管理员配置文件。要创建角色并将角色指定给用户,请参见《系统管理指南:基本管理》中的第 2 章 “使用 Solaris Management Console(任务)”。
在名称服务中启用 publickey 表。
将以下行添加到 /etc/nsswitch.conf 文件中:
publickey: nisplus |
初始化 NIS+ 客户机。
# nisinit -cH hostname |
其中,hostname 是其表中包含客户机系统项的受信任 NIS+ 服务器的名称。
键入以下命令:
# nisaddcred local # nisaddcred des |
使用 keylogin 命令检验此设置。
# keylogin Password: |
以下示例使用主机 pluto 将 earth 设置为 NIS+ 客户机。您可以忽略警告。系统将接受 keylogin 命令,检验 earth 是否已正确设置为安全 NIS+ 客户机。
# nisinit -cH pluto NIS Server/Client setup utility. This system is in the example.com. directory. Setting up NIS+ client ... All done. # nisaddcred local # nisaddcred des DES principal name : unix.earth@example.com Adding new key for unix.earth@example.com (earth.example.com.) Network password:<键入口令> Warning, password differs from login password. Retype password: <重新键入口令> # keylogin Password: <键入口令> # |
应该针对 NIS+ 域中的每个用户执行此过程。
承担主管理员角色,或成为超级用户。
主管理员角色拥有主管理员配置文件。要创建角色并将角色指定给用户,请参见《系统管理指南:基本管理》中的第 2 章 “使用 Solaris Management Console(任务)”。
键入以下命令:
# nisaddcred -p unix.UID@domain-name -P username.domain-name. des |
请注意,在这种情况下,username.domain-name 必须以点 (.) 结束。
通过以客户身份登录并键入 keylogin 命令来检验此设置。
在以下示例中,将为用户 jdoe 提供 Diffie-Hellman 验证密钥。
# nisaddcred -p unix.1234@example.com -P jdoe.example.com. des DES principal name : unix.1234@example.com Adding new key for unix.1234@example.com (jdoe.example.com.) Password: <键入口令> Retype password:<重新键入口令> # rlogin rootmaster -l jdoe % keylogin Password: <键入口令> % |
应该针对 NIS 域中的每个主机执行此过程。
承担主管理员角色,或成为超级用户。
主管理员角色拥有主管理员配置文件。要创建角色并将角色指定给用户,请参见《系统管理指南:基本管理》中的第 2 章 “使用 Solaris Management Console(任务)”。
在名称服务中启用 publickey 映射。
将以下行添加到 /etc/nsswitch.conf 文件中:
publickey: nis |
# newkey -h hostname |
其中,hostname 是客户机的名称。
在以下示例中,会将 earth 设置为安全 NIS 客户机。
# newkey -h earth Adding new key for unix.earth@example.com New Password: <键入口令> Retype password:<重新键入口令> Please wait for the database to get updated... Your new key has been successfully stored away. # |
应该针对 NIS 域中的每个用户执行此过程。
只有系统管理员在登录到 NIS 主服务器时才能为用户生成新密钥。
承担主管理员角色,或成为超级用户。
主管理员角色拥有主管理员配置文件。要创建角色并将角色指定给用户,请参见《系统管理指南:基本管理》中的第 2 章 “使用 Solaris Management Console(任务)”。
为用户创建新密钥。
# newkey -u username |
其中,username 是用户的名称。系统将提示键入口令。您可以键入通用口令。将使用此通用口令以加密格式存储私钥。
此命令允许用户使用只有其自己知道的口令重新加密其私钥。
可以使用 chkey 命令为用户创建新密钥对。
在此示例中,超级用户将设置密钥。
# newkey -u jdoe Adding new key for unix.12345@example.com New Password: <键入口令> Retype password:<重新键入口令> Please wait for the database to get updated... Your new key has been successfully stored away. # |
% chkey -p Updating nis publickey database. Reencrypting key for unix.12345@example.com Please enter the Secure-RPC password for jdoe:<键入口令> Please enter the login password for jdoe: <键入口令> Sending key change request to centralexample... |
此过程通过要求访问验证来保护 NFS 服务器上的共享文件系统。
必须在网络中启用 Diffie-Hellman 公钥验证。要在网络中启用验证,请执行以下操作之一:
成为超级用户或承担拥有系统管理配置文件的角色。
系统管理员角色拥有系统管理配置文件。要创建该角色并将其指定给用户,请参见配置 RBAC(任务列表)。
在 NFS 服务器上,通过 Diffie-Hellman 验证共享文件系统。
# share -F nfs -o sec=dh /filesystem |
其中,filesystem 是要共享的文件系统。
-o sec=dh 选项意味着现在需要通过 AUTH_DH 验证来访问文件系统。
在 NFS 客户机上,通过 Diffie-Hellman 验证挂载文件系统。
# mount -F nfs -o sec=dh server:filesystem mount-point |
共享 filesystem 的系统的名称
共享的文件系统的名称,例如 opt
挂载点的名称,例如 /opt
-o sec=dh 选项通过 AUTH_DH 验证挂载文件系统。