安全 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 的客户机时间标记发送回来。