远程过程调用 (RPC) 是一种用于构造分布式的、基于客户端-服务器的应用程序的技术。安全 RPC 提供了客户端和服务器之间的通信,这样一来,应用程序可以相互进行身份验证,以便在允许或者进行任何 RPC 调用之前建立通信方的标识。
下面是安全 RPC 协议出于身份验证目的所提供的一些不同的安全机制:
- UNIX® 身份验证 (AUTH_UNIX)
- 数据加密标准 (DES) 身份验证 (AUTH_DES)
- RPCSEC_GSS API
本文将介绍如何通过 AUTH_DES 身份验证安全机制来使用安全 RPC。AUTH_DES 身份验证涉及到凭据以及验证器的使用。它们都可以在基于客户端-服务器的应用程序中提供强大的安全身份验证功能。当通过 AUTH_DES 身份验证使用安全 RPC 时,所有的用户都需要拥有一对公钥和私钥,以及采用 os.uid@domainname 形式的唯一网络名(例如,unix.204@in.ibm.com)。您可以使用网络信息服务 (NIS) 来为每个用户提供公钥和私钥对以及网络名。配置 NIS 服务器部分介绍了 NIS 设置所需的一些基本步骤。更多附加的细节,请参见参考资料。
在成功地运行安全 RPC 客户端或者服务器应用程序之前,您还需要获取一个网络名称、或者网络名(独立的操作系统名称)以及公钥和私钥。如果您已经配置了 NIS 服务器,那么您可以跳过配置 NIS 服务器部分中所描述的前六个步骤。
要配置 NIS 服务器,需要进行下面的操作。配置 NIS 服务器还允许将它作为 NIS 客户端。
- 确保安装 NIS 必需的文件集。
# lslpp -l |grep nis bos.net.nis.client 5.3.0.61 COMMITTED Network Information Service bos.net.nis.server 5.3.0.61 COMMITTED Network Information Service bos.rte.filesystem 5.3.0.50 COMMITTED Filesystem Administration #
- 使用
chypdom命令设置域名。# chypdom -B in.ibm.com
- 使用
ypinit命令创建主 NIS 服务器。# ypinit -q -o -m Building /var/yp/in.ibm.com/ypservers... Running /var/yp/Makefile... updated passwd updated group 0+1 records in. 0+1 records out. updated hosts could not find /etc/ethers could not find /etc/networks updated rpc updated services updated protocols updated netgroup could not find /etc/bootparams WARNING: Group writable directory /var/spool WARNING: Group writable directory /var/spool/mqueue /var/yp/in.ibm.com/mail.aliases: 4 aliases, longest 9 bytes, 57 bytes total updated aliases updated publickey could not find /etc/netmasks Target "all" is up to date. adfsaix5.in.ibm.com has been set up as a NIS master server without any errors. If there are running slave NIS servers, run yppush now for any data bases which have been changed. If there are no running slaves, run ypinit on those hosts which are to be slave servers. #
- 为主 NIS 服务器启动
ypserv守护进程。# startsrc -s ypserv 0513-059 The ypserv Subsystem has been started. Subsystem PID is 319736. #
- 要使密码更新生效,可以启动
yppasswdd。# startsrc -s yppasswdd 0513-059 The yppasswdd Subsystem has been started. Subsystem PID is 233490. #
- 验证
inetd和portmap守护进程都在运行。如果这两个守护进程没有运行的话,则启动它们。# lssrc -s inetd Subsystem Group PID Status inetd tcpip 204900 active # lssrc -s portmap Subsystem Group PID Status portmap portmap 159886 active #
- 启动
ypbind守护进程。# startsrc -s ypbind 0513-059 The ypbind Subsystem has been started. Subsystem PID is 118826. #
- 编辑 /etc/nsswitch.conf 文件,并添加下面的内容:
publickey: nis
现在,您可以启动应用服务器程序了。
在设置 NIS 之后,为每个用户进行下面的操作:
- 添加一个新用户。
# mkuser userone # passwd userone # id useroneuid=249(userone) gid=1(staff)
- 启动
keyserv守护进程。# startsrc -s keyserv 0513-059 The keyserv Subsystem has been started. Subsystem PID is 344274 #
- 为 userone 创建公钥和机密密钥,并将它添加到 publickey 数据库中。
# newkey -u userone -s nis Updating nis publickey database. Adding new key for unix.208@in.ibm.com. Enter userone's login password: Please wait for the database to get updated ...
- 生成 netid 文件。
# mknetid -p /etc/passwd | tee /etc/netid unix.0@in.ibm.com 0:0,2,3,7,8,10,11,55001,55002 unix.1@in.ibm.com 1:1 unix.2@in.ibm.com 2:2,3,4 unix.3@in.ibm.com 3:3 unix.4@in.ibm.com 4:4 unix.5@in.ibm.com 5:5 unix.100@in.ibm.com 100:100 unix.9@in.ibm.com 9:-2 unix.11@in.ibm.com 11:11,9 unix.6@in.ibm.com 6:12 unix.200@in.ibm.com 200:13 unix.203@in.ibm.com 203:1 unix.204@in.ibm.com 204:1,201 unix.249@in.ibm.com 249:1
- 更新 NIS 数据库 netid 映射。
# cd /var/yp # make netid updated netid pushed netid Target "netid" is up to date. #
- 启动一个相同的登录会话,并以 userone 的身份进行登录。
- 运行
keylogin命令。# keylogin Password: #
现在,运行客户端应用程序。
下面的部分将概述 DES 身份验证的步骤:
- 生成公钥和机密密钥
每个通过 DES 身份验证使用安全 RPC 的用户都必须拥有一对公钥和机密密钥。这可以通过使用
newkey命令来生成,如前面所显示的。系统管理员为每个用户运行newkey命令,以便为希望使用 DES 身份验证的用户生成唯一的公钥和机密密钥。这些公钥和机密密钥存储在一个公共数据库(/etc/publickey 文件)中。机密密钥采用加密的形式存储在同一个数据库中。要更改这个密钥对,可以使用chkey命令。 - 运行
keylogin命令在创建了用户的公钥和机密密钥之后,当这些用户希望运行安全 RPC 应用程序时,他们必须登录并运行
keylogin命令。keylogin命令与 NIS 服务器进行通信,以获得用户的加密的密钥。然后,keylogin提示用户输入安全 RPC 密码,然后解密该用户的机密密钥。因为 /etc/keylogin 文件中的映射是用户网络名与公钥、机密密钥对之间的映射,所以您需要在将其与密钥对进行匹配之前找到网络名。网络名和用户的 uid (gid) 之间的映射在 /etc/netid 文件中进行维护。keylogin命令然后将经过解密的机密密钥传递给本地keyserver守护进程,该守护进程将这个解密的机密密钥存储在其中,直到用户运行安全 RPC 事务。这里提到的 /etc/publickey 和 /etc/netid 文件,都不是直接使用。它们由 NIS 在数据库映射中进行转换和维护。因为将 /etc/nsswitch.conf 文件配置为在 NIS 中查找公钥信息,并且 keylogin 将与 NIS 服务器进行通信,所以对于用户来说,这个操作是透明的。
- 获得通用密钥
每当用户登录并使用远程安全 RPC 应用服务器启动会话时,他们都会获得一个新的会话密钥,这个密钥就称为通用密钥。通用密钥是在客户端和由 Diffie-Hellman 加密方法所创建的服务器应用程序之间共享的密钥。这个过程将使用客户端和服务器的公钥和私钥对。更多关于 Diffie-Hellman 方法的信息,请参见参考资料部分。
- 生成对话密钥
在生成通用密钥之后,keyserver 程序将随机生成一个对话密钥。这个密钥用于加密客户端时间戳(以及一些其他内容)。对话密钥使用前面已经生成的通用密钥来进行加密。
- 客户端与服务器的实际通信
在客户端与服务器之间的通信和信息交换,以客户端对数据包进行格式化作为开始(如下所示),并将其发送给服务器。窗口是在客户端时钟和服务器时钟之间所允许的最大偏差。如果偏差超出了窗口时间,那么服务器将开始丢弃客户端凭据,并且需要重新进行同步。时间戳和窗口一起来确定凭据的过期时间。在凭据过期之后,服务器将请求客户端进行一次新的连接。
使用验证器以使得通信更加安全。
凭据 客户端的网络名 由通用密钥加密的对话密钥 由对话密钥加密的窗口 验证器 由对话密钥加密的时间戳和 (window-1)
- 解密对话密钥
在接收到客户端的信息传输之后,keyserver(在服务器中)将在服务器公钥数据库中查找客户端的公钥。然后,服务器使用它的机密密钥和客户端公钥,通过执行与客户端相同的过程,生成一个通用密钥。这个密钥与由客户端所生成的通用密钥相同。现在,服务器就可以解密对话密钥了。然后,服务器使用解密的对话密钥来解密客户端时间戳。
- 在服务器中存储信息
下面的信息存储在服务器的一张表中。存储前面三项以便于以后使用,而存储客户端时间戳是为了防止通信的重复进行。
客户端的网络名 对话密钥 窗口 客户端的时间戳
- 服务器的客户端身份验证
客户端根据服务器发送给该客户端的验证器,对服务器进行身份验证。这个验证器包括客户端 timestamp-1(由对话密钥进行加密)和索引 ID(位于这个客户端连接的服务器表中)。通过接收到的验证器和服务器发送的时间戳,客户端可以清楚服务器能够正确地对对话密钥进行解密,并且正确地进行身份验证。
在完成第一个事务之后,客户端在其后续的传输中将表索引 ID 发送给服务器。它还会发送由对话密钥加密的时间戳(现在服务器和客户端都清楚了对话密钥)。在应答中,服务器发送由对话密钥加密的客户端 timestamp-1。
在本文中,您了解了如何配置环境,以便使用 DES 身份验证运行安全 RPC 应用程序。您还了解了有关 DES 身份验证过程的基本内容,并研究了安全 RPC 应用程序的代码片段。
学习
- 您可以参阅本文在 developerWorks 全球站点上的 英文原文 。
-
AUTH_DES 身份验证:您可以看到一个通过 AUTH_DES 身份验证使用安全 RPC 的简单客户端和服务器程序。
-
Communications Programming Concepts :阅读这个页面,以了解 RPC 身份验证协议和身份验证类型。
-
Network Information Services (NIS and NIS+) Guide:阅读这个指南,以获取有关 NIS 的,以及如何配置简单的和比较复杂的 NIS 场景的信息。
-
Diffie-Hellman 方法:这个方法可以确保客户端和服务器具有相同的通用密钥。
-
Administrating NIS+ credentials:这个链接给出了有关 NIS+ 中各种凭据的详细说明。许多相同的内容同样适用于 NIS。
-
AIX and UNIX 专区:developerWorks 的“AIX and UNIX 专区”提供了大量与 AIX 系统管理的所有方面相关的信息,您可以利用它们来扩展自己的 UNIX 技能。
-
AIX and UNIX 新手入门:访问“AIX and UNIX 新手入门”页面可了解更多关于 AIX 和 UNIX 的内容。
-
AIX Wiki:发现 AIX 相关技术信息的协作环境。
- 按主题搜索“AIX and UNIX”库:
-
Safari 书店:访问此电子参考资料库可查找特定的技术资源。
-
developerWorks 技术事件和网络广播:了解最新的 developerWorks 技术事件和网络广播。
-
Podcasts:收听 Podcast 并与 IBM 技术专家保持同步。
获得产品和技术
-
AIX 5L Expansion Pack and Web Download Pack:现在就开始下载。
-
IBM 试用软件:从 developerWorks 可直接下载这些试用软件,您可以利用它们开发您的下一个项目。
讨论
- 参与 developerWorks Blog,从而加入到 developerWorks 社区中来。
- 参与“AIX and UNIX”论坛:

Mehul Joshi 是位于印度 Pune 的 IBM Systems and Technology Labs 的一位软件工程师。他从 2004 年 3 月起就开始为 IBM 工作。他目前正工作于 General Parallel File System 开发团队。他先前主要从事存储区域网络文件系统 (Storage Area Network Filesystem) 和 SPKM 方面的工作。您可以通过 mehjoshi@in.ibm.com 与他联系。

Sagar Dixit 是位于印度 Pune 的 IBM Systems and Technology Labs 的一位软件工程师。他正参与 NFSv4 安全新特性的开发和部署。他拥有计算机科学与工程学士学位。您可以通过 sagar.dixit@in.ibm.com 与他联系。