在 AIX V5.3 上使用 DES 实现安全的 RPC
2008-11-10 08:27:24 来源:WEB开发网引言
远程过程调用 (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 设置所需的一些基本步骤。
进行 DES 身份验证所需的设置
在成功地运行安全 RPC 客户端或者服务器应用程序之前,您还需要获取一个网络名称、或者网络名(独立的操作系统名称)以及公钥和私钥。如果您已经配置了 NIS 服务器,那么您可以跳过配置 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 身份验证的步骤:
生成公钥和机密密钥
每个通过 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 应用程序的代码片段。
更多精彩
赞助商链接