本节介绍客户机-服务器会话中使用 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 的客户机时间标记发送回来。