跳过导航链接 | |
退出打印视图 | |
Oracle Solaris 11.1 管理:安全服务 Oracle Solaris 11.1 Information Library (简体中文) |
10. Oracle Solaris 中的安全属性(参考信息)
如何为 NIS 主机设置 Diffie-Hellman 密钥
如何为 NIS 用户设置 Diffie-Hellman 密钥
安全 RPC(Remote Procedure Call,远程过程调用)通过一种验证机制保护远程过程。Diffie-Hellman 验证机制可验证发出服务请求的主机和用户。此验证机制使用数据加密标准 (Data Encryption Standard, DES) 加密。使用安全 RPC 的应用程序包括 NFS 和 NIS 命名服务。
NFS 支持多个主机通过网络共享文件。在 NFS 服务中,一个服务器可为多个客户机保存数据和资源。这些客户机具有服务器与客户机共享文件系统的访问权限。登录到客户机系统的用户可以通过从服务器挂载文件系统来访问这些文件系统。对于客户机系统上的用户,就好像这些文件是客户机的本地文件。NFS 的最常见用途之一是允许将系统安装在办公室中,同时将所有用户文件存储在中心位置。NFS 服务的某些功能(例如 mount 命令的 -nosuid 选项)可用于禁止未经授权的用户打开设备和文件系统。
NFS 服务使用安全 RPC 来验证通过网络发出请求的用户。此过程称为安全 NFS。Diffie-Hellman 验证机制 AUTH_DH 使用 DES 加密以确保授权访问。AUTH_DH 机制也称为 AUTH_DES。有关更多信息,请参见以下内容:
要设置和管理安全 NFS,请参见《在 Oracle Solaris 11.1 中管理网络文件系统》中的"管理安全 NFS 系统"。
有关涉及 RPC 验证的事务的概述,请参见Diffie-Hellman 验证的实现。
Kerberos 是 MIT 开发的一种验证系统。Kerberos 中的部分加密基于 DES。安全 RPC 中不再提供 Kerberos V4 支持。但是,此发行版中包括使用 RPCSEC_GSS 的 Kerberos V5 客户端和服务器端实现。有关更多信息,请参见如何配置 Kerberos NFS 服务器。
数据加密标准 (Data Encryption Standard, DES) 加密功能使用 56 位密钥进行数据加密。如果两个凭证用户或主体知道同一 DES 密钥,他们就可以通过使用此密钥加密和解密文本进行秘密通信。DES 是一种相对快速的加密机制。
仅使用 DES 密钥的风险是入侵者可以收集足够的使用相同密钥加密的密文消息,从而能够发现密钥并对这些消息进行解密。因此,安全系统(例如安全 NFS)需要经常更改密钥。
入侵者很难破解用于验证用户的 Diffie-Hellman (DH) 方法。客户机和服务器都有自己的私钥,它们将其与公钥一起使用以设计公用密钥。私钥也称为密钥 (secret key)。客户机和服务器使用公用密钥相互通信。公用密钥使用公认的加密功能(例如 DES)进行加密。
验证成功的基础是发送系统能够使用公用密钥来加密当前时间。然后,接收系统可以进行解密,并根据其当前时间进行检查。客户机和服务器上的时间必须同步。有关更多信息,请参见《Oracle Solaris 11 网络服务介绍》中的"管理网络时间协议(任务)"。
公钥和私钥存储在 NIS 数据库中。NIS 将密钥存储在 publickey 映射中。此文件包含所有潜在用户的公钥和私钥。
系统管理员负责设置 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 值发送回来。