安全 RPC 是安全 NFS 系统的基础。 安全 RPC 的目标是建立至少与分时系统一样安全的系统。 在分时系统中,所有用户共享单个计算机。分时系统通过登录口令验证用户。使用数据加密标准 (Data Encryption Standard, DES) 验证,可以完成相同的验证过程。用户可以登录任何远程计算机,就像登录本地终端一样。用户的登录口令是其网络安全的保证。在时间共享环境中,系统管理员在道义上不会更改口令以模仿某人。在安全 RPC 中,网络管理员是受信任的,不会更改存储公钥的数据库中的项。
为了解 RPC 验证系统,您需要熟悉两个术语:凭证和检验器。以 ID 证件为例,凭证就是标识用户的具体内容:姓名、地址和生日。检验器就是附加到证件上的照片。通过对照携带该证件的人员检查该证件上的照片,可以确定该证件未被盗用。在 RPC 中,客户机进程会使用每个 RPC 请求将凭证和检验器发送到服务器。服务器仅发回检验器,因为客户机已经“知晓”服务器的凭证。
RPC 验证是开放式的,这表示可以在其中插入各种验证系统,如 UNIX、DH 和 KERB。
当 UNIX 验证由网络服务使用时,凭证包含客户机的主机名、UID、GID 和组访问列表。但是,检验器不包含任何内容。由于不存在检验器,因此超级用户可以使用如 su 等命令来伪造相应的凭证。UNIX 验证的另一个问题是 UNIX 验证将假设网络中的所有计算机都是 UNIX 计算机。UNIX 验证在应用于异构网络中的其他操作系统时将会中断。
为克服 UNIX 验证问题,安全 RPC 使用 DH 验证。
DH 验证使用数据加密标准 (Data Encryption Standard, DES) 和 Diffie-Hellman 公钥密码学来验证网络中的用户和计算机。DES 是标准加密机制。Diffie-Hellman 公钥密码学是包含两个密钥的密码系统:一个公钥和一个私钥。公钥和私钥存储在名称空间中。NIS 将密钥存储在公钥映射中。这些映射包含所有潜在用户的公钥和私钥。有关如何设置映射的更多信息,请参见《系统管理指南:名称和目录服务(DNS、NIS 和 LDAP)》。
DH 验证的安全性依赖于发件人加密当前时间的能力,随后收件人可以对该时间进行解密,并对照自己的时钟进行检查。时间标记是使用 DES 进行加密的。使此方案正常工作的要求如下所示:
两个代理必须就当前时间达成一致。
发件人和收件人必须使用相同的加密密钥。
如果网络运行时间同步程序,则系统将自动同步客户机和服务器上的时间。如果时间同步程序不可用,则可以使用服务器的时间(而不是网络时间)来计算时间标记。启动 RPC 会话之前,客户机将询问服务器时间,然后计算其自己的时钟与服务器时钟之间的时间差值。计算时间标记时会使用该差值来调整客户机的时钟。如果客户机与服务器的时钟未同步,则服务器将开始拒绝客户机的请求。客户机上的 DH 验证系统将与服务器重新进行同步。
客户机和服务器使用同一个加密密钥,具体方法是:生成一个随机的对话密钥(也称为会话密钥)并使用公钥密码学推导公用密钥。公用密钥是只有客户机和服务器才能推导的密钥。对话密钥用于加密和解密客户机的时间标记。公用密钥用于加密和解密对话密钥。
Kerberos 是 MIT 开发的验证系统。Kerberos 提供各种加密类型,包括 DES。Kerberos 支持不再作为安全 RPC 的一部分来提供,但是从 Solaris 9 发行版开始,包括服务器端和客户端实现。有关 Kerberos 验证实现的更多信息,请参见《系统管理指南:安全性服务》中的第 20 章 “Kerberos 服务介绍”。
如果在周围无人的情况下服务器崩溃(例如,在断电后),则存储在系统中的所有私钥都将被删除。此时,没有进程可以访问安全网络服务或挂载 NFS 文件系统。重新引导期间的重要进程通常以 root 身份运行。因此,如果已妥善存储了超级用户的私钥,但没有人可以键入该私钥的解密口令,则这些进程可以正常工作。keylogin -r 允许 root 在 keyserv 读取的 /etc/.rootkey 中存储明文形式的私钥。
某些系统以单用户模式引导,届时控制台上会显示超级用户登录 shell,但不显示口令提示。在这类情况下,物理安全性是非常必要的。
无盘计算机引导并不是绝对安全的。他人可以模拟引导服务器并引导不正当的内核,例如,在远程计算机上记录您的私钥。安全 NFS 系统仅在内核和密钥服务器都处于运行状态之后,才会提供保护。否则,无法验证引导服务器提供的回复。此限制可能是严重问题,不过,只有使用内核源代码的复杂攻击才能利用此限制。此外,犯罪行为会留下证据。如果轮询网络查找引导服务器,则会发现不正当引导服务器的位置。
大多数 setuid 程序都归 root 所有。如果 root 的私钥存储在 /etc/.rootkey 中,则这些程序会正常工作。但是,如果用户拥有 setuid 程序,则 setuid 程序可能始终无法正常工作。例如,假设 setuid 程序归 dave 所有,并且在引导计算机之后 dave 未登录计算机。在这种情况下,该程序无法访问安全网络服务。
如果登录远程计算机(使用 login、rlogin 或 telnet)并且使用 keylogin 获取访问权限,则可以访问您的帐户。原因是您的私钥会被传递给该计算机的密钥服务器,该服务器随后会存储您的私钥。只有在不信任远程计算机的情况下才考虑使用此过程。但是,如果存在疑问,请勿在远程计算机要求口令时登录远程计算机。请使用 NFS 环境挂载与远程计算机共享的文件系统。此外,也可以使用 keylogout 从密钥服务器中删除私钥。
如果使用 -o sec=dh 选项共享起始目录,则远程登录可能是个问题。如果未将 /etc/hosts.equiv 或 ~/.rhosts 文件设置为提示输入口令,则将成功登录。但是,用户不能访问其起始目录,因为没有在本地进行验证。如果系统提示用户输入口令,则当该口令与网络口令匹配时,用户有权访问其起始目录。