系统管理指南:安全性服务

Diffie-Hellman 验证

入侵者很难破解用于验证用户的 Diffie-Hellman (DH) 方法。客户机和服务器都有自己的私钥,它们将此私钥与公钥一起使用以设计公用密钥。私钥也称为密钥。客户机和服务器使用公用密钥来相互通信。公用密钥使用公认的加密功能(例如 DES)进行加密。

验证基于发送系统使用公用密钥加密当前时间的能力。然后,接收系统可以进行解密,并根据其当前时间进行检查。客户机和服务器上的时间必须同步。有关更多信息,请参见《系统管理指南:网络服务》中的“管理网络时间协议(任务)”

公钥和私钥存储在 NIS 或 NIS+ 数据库中。NIS 将密钥存储在 publickey 映射中。NIS+ 将密钥存储在 cred 表中。这些文件包含所有潜在用户的公钥和私钥。

系统管理员负责设置 NIS 映射或 NIS+ 表,以及为每个用户生成公钥和私钥。将使用用户口令以加密格式存储私钥。此过程使得私钥只对此用户公开。

Diffie-Hellman 验证的实现

本节介绍客户机-服务器会话中使用 Diffie-Hellman 验证 (AUTH_DH) 的系列事务。

生成公钥和密钥

执行事务之前,管理员会运行 newkeynisaddcred 命令来生成公钥和密钥。每个用户都拥有唯一的公钥和密钥。公钥存储在公共数据库中。密钥以加密格式存储在同一数据库中。chkey 命令可更改密钥对。

运行 keylogin 命令

通常,登录口令与安全 RPC 口令相同。在这种情况下,不需要 keylogin 命令。但是,如果口令不同,则用户必须登录,然后运行 keylogin 命令。

keylogin 命令提示用户键入安全 RPC 口令。此命令然后使用口令对密钥进行解密。随后,keylogin 命令将解密的密钥传递到 keyserver 程序。keyserver 是一种在每台计算机上都有本地实例的 RPC 服务。keyserver 会保存解密的密钥,并等待用户使用服务器启动安全 RPC 事务。

如果登录口令与 RPC 口令相同,则登录进程会将密钥传递到 keyserver。如果要求不同的口令,则用户必须始终运行 keylogin 命令。如果 keylogin 命令包括在用户的环境配置文件(例如 ~/.login~/.cshrc ~/.profile 文件)中,则用户登录时便会自动运行 keylogin 命令。

生成对话密钥

用户使用服务器启动事务时,将发生以下情况:

  1. keyserver 随机生成一个对话密钥。

  2. 内核使用此对话密钥以及其他材料对客户机的时间标记进行加密。

  3. keyserver 在公钥数据库中查找服务器的公钥。有关更多信息,请参见 publickey(4) 手册页。

  4. keyserver 使用客户机的密钥以及服务器的公钥来创建一个公用密钥。

  5. keyserver 使用此公用密钥对此对话密钥进行加密。

初始联系服务器

然后,会将包含加密的时间标记和对话密钥的传输内容发送到服务器。此传输内容包括凭证和检验器。此凭证包含三个组件:

此窗口显示客户机允许服务器时钟与客户机时间标记之间存在的时间差异。如果服务器时钟与时间标记之间的差异大于此窗口显示的值,则服务器会拒绝客户机的请求。正常情况下,不会出现这种拒绝,因为客户机在启动 RPC 会话之前会先与服务器进行同步。

客户机的检验器包含以下内容:

如果某人要模拟用户,则会需要窗口检验器。模拟者可以编写一个程序,从而只需插入随机位,而无需填写凭证和检验器的已加密字段。服务器将对话密钥解密为某一随机密钥。然后,服务器使用此密钥尝试对窗口和时间标记进行解密。结果是随机数字。但是,经过几千次尝试之后,随机窗口/时间标记对可能会通过验证系统。窗口检验器可降低假凭证通过验证的可能性。

解密对话密钥

服务器从客户机接收传输内容时,将发生以下情况:

  1. 服务器的本地 keyserver 在公钥数据库中查找客户机的公钥。

  2. keyserver 使用客户机的公钥以及服务器的密钥来推导公用密钥。此公用密钥与客户机计算所得的公用密钥相同。只有服务器和客户机才能计算公用密钥,因为此计算过程需要知道其中一个密钥。

  3. 内核使用公用密钥对此对话密钥进行解密。

  4. 内核调用 keyserver 以使用解密的对话密钥对客户机的时间标记进行解密。

在服务器上存储信息

服务器对客户机的时间标记进行解密之后,将在凭证表中存储四个信息项:

服务器存储前三项供将来使用,存储客户机的时间标记以防止重放。服务器只接受时间上晚于最新时间标记的时间标记。因此,可保证拒绝任何重放的事务。


注 –

调用方的名称将隐含在这些事务中,此调用方必须通过某种方式进行验证。keyserver 不能使用 DES 验证来验证调用方,因为 keyserver 使用 DES 时会导致死锁。为了避免死锁,keyserver 将通过用户 ID (user ID, UID) 来存储密钥,并且只将请求授予本地 root 进程。


将检验器返回到客户机

服务器将检验器返回到客户机,其中包括以下内容:

从客户机的时间标记中减 1 的原因是确保此时间标记已过时。过时的时间标记不能再用作客户机检验器。

验证服务器

客户机将接收检验器并验证服务器。客户机知道只有服务器才能发送检验器,因为只有服务器知道客户机发送的时间标记。

处理事务

对于第一个事务之后的每一个事务,客户机都在其下一个事务中将索引 ID 返回到服务器。客户机还发送另一个加密的时间标记。服务器会将使用对话密钥加密的减 1 的客户机时间标记发送回来。