对于很多的微软系统的管理员来说,都面临着一个以怎样的安全方式管理远程系统的问题!在Unix系统中,这个答案十分简单:使用SSH 协议,这是足够安全和有效的。在SSH方式下,我们不仅能在命令行下管理远程系统,我们也能通过使用隧 道技术(Tunnlling)运行远程X-Window。在传输过程中通过使用强壮的加密算法,以防止传送的数据被未经授权的访问。
令人遗憾的是,如果把远程安全访问应用于微软操作系统就不是一件非常容易的事了。首先,仅仅NT 终端服务器,2000服务器和XP安装有远程管理服务( 终端服务)。第二,一些第三方公司提供给微软远程管理服务的实施方案中,一般都需要很大的成本支出。且随着方案的进一步实施,成本也越来越高。而一些免费的远程管理软件如(vnc)又无法提供加密传输功能,安全性能大打折扣。
这篇文章提出的一种能用来远程管理从Win 95 到Windows XP几乎所有版本的微软操作系统的方案。这种方案的特点不仅表现在最小费用支出上,而且还具有较高的安全性。
解决方案
一个理想的远程管理方案应该有什么特征?首先,这个解决办法一定是高效的。虽然在Unix 系统情况下,模拟终端命令行模式进行管理还是比较满意的.但是使用这种方式来管理Windows远程服务是远远不够的, 因为Windows 是一个基于图形环境的操作系统,远程管理也应该使用一种图形方式实现。除了高效,远程管理还必须建立在安全的基础上。这个解决办法必须不仅为用户提供鉴定,而且也必须保证被传送的数据的机密性和完整性。
在这篇文章中讨论的远程管理方案中,通过使用以下开放源代码软件,来达到以上要求!
1.VNC-(Virtual Network Computing)提供图形界面方式管理远程系统。在我们的方案里,VNC软件将是这个整个的解决办法的" 核心"。它将提供图形界面来连接远程操作系统。
2.Stunnel –的主要目的是建立能用来以安全的方式传送其他非加密协议传输的数据的SSL 隧道。 在本文的解决办法中,这个工具将用来加密VNC协议。在Stunnel下,不仅可以保证被传送的数据的机密性和完整性,也可以利用证书签别VNC客户端和服务器。
3.OpenSSL- OpenSSL 能提供一个加密函数库,它能用来为应用程序提供数据加密功能。通过使用OpenSSL 我们能产生,签署或者撤销基于公共密钥基础结构( PKI) 的证书。在下面提出的这种方案中将用来产生并且签署需要证实VNC 客户端和服务器的证书。
下图显示了使用以上软件来提供一个安全的远程管理方案!
此方案实际执行方案如下:
安装软件
实现此安全管理远程microsoft系统的第一步是安装以上软件.
安装VNC
我们可以在这里http://www.uk.research.att.com/vnc/下载vnc,然后安装在我们希望能够被远程管理的桌面操作系统,这即是VNC服务端.接下来所做的是需要注册VNC服务,注册方法:依次打开”开始”,”RealVNC”,”VNC server”,”Register VNC Server Service”,然后系统将会要求重启。
重启系统之后,我们必须设置VNC 服务的基本参数。 最重要的事情设置一个有效的口令,以防止VNC 服务被未经授权的访问。下一步关闭" enable jave viewer" 选项 (此选择要求两条单独的SSL 隧道,我们将不使用它),如下图显示:
在完成使VNC服务端设置之后,我们应该下载VNC客户软件(vncviewer.exe) 并且将它放于VNC客户端。
接着应该检查VNC客户端是否能与VNC服务端建立起一个连接,如果双方能够建立起连接,我们便完成了初步的设置。
由于VNC服务端只能够被本地安装的Stunnel软件所访问,所以我们需要往注册表中添加一个键值:
Key:HKEY_LOCAL_MACHINE\Software\ORL\WinVNC3Name:LoopbackOnly
Type: REG_DWORD
Value: 1
以上键值的作用是使之能够使用loopback连接,即回送连接,并且限制监听端口5900的连接只能是本地ip(127.0.0.1),这样VNC服务器不会被网络上的机器直接访问,这样大大的提高了安全性.另外如果我们不希望用户关闭VNC服务的话,服务器的注册表应该增加一项:
Key:HKEY_LOCAL_MACHINE\Software\ORL\WinVNC3\Default
Name: AllowShutdown
Type: REG_DWORD
Value: 0
为了使以上设置生效,我们应该重启VNC服务。
安装Stunnel
接下来安装Stunnel软件,下载地址 http://www.stunnel.org/download/binaries.html,客户端和服务端均需要下载,在本例中放置在C:\Program Files\Stunnel.另外还需要下载2个必须的dll库文件,libeay32.dll, libssl32.dll。
如果希望开机时自动启动Stunnel进程,应该在注册表中添加如下键值:
Key: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
Name: Stunnel
Type: REG_SZ
Value: "C:\Program Files\Stunnel\stunnel-4.04.exe"
安装OpenSSL
大家都知道,在现在大多数linux版本中,典型安装就已经包括了openssl库,这主要是因为openssl库是安装openSSH所必须的组件.其实还有另外一种版本的openssl,是适合使用于微软操作系统上的,和linux下的具有相同的功能.在本文所提到的这个方案中,我们需要的就是这种在Windows平台下的openssl。
下面我们来安装和设置openSSL服务:
1. 信任主机(Win 2000,NT,XP)-如果可能,最好不要连接到网上-需要安装openssl软件,openssl.exe可以在Stunnel的官方站点下载http://www.stunnel.org/download/binaries.html,同样,我们还需要下载libeay32.dll 和 libssl32.dll.2个文件,下载文件必须放到C:\Program Files\OpenSSL.文件夹。
2. 另外,还需要下载2个文件,一个配置文件, openssl.conf,可以从http://www.securityfocus.com/data/tools/openssl.conf下载
ca.bat 脚本文件,用来生成证书,下载地址: http://www.securityfocus.com/data/tools/ca.bat
这2个文件也必须放置到C:\Program Files\OpenSSL.文件夹,如下图所示:
接下来应该生成证书,用来鉴别VNC的服务器和客户端。
生成密匙和证书
CA认证
这个过程首先应该产生一个私人/公共密钥对,同时产生一个第三方信任的证书.在随后的过程中私人密匙将用来签发VNC服务端和客户端的证书,CA证书将被分配给所有的VNC服务端和客户端.因为CA私人密匙是PKI执行过程中最重要的基础之一,所以密匙应该被赋予一个通行码(pass phrase)。 通行码也可以被称做为口令,是用来保护私匙的密码,用户可以自由选择。不用口令是不能使用私匙的,因此口令和私匙同样重要。需要选取一个安全的口令。
我们通过ca.bat这个批处理文件来产生密匙对和证书:
C:\progra~1\OpenSSL\ca genca
完成以上步骤之后,CA证书将存储在c:\ca\cacert.pem文件中,私人/公共密匙对存储在C:\CA\private\CAkey.pem文件中。
VNC服务端
接下来产生服务端的密匙对和证书。
C:\progra~1\OpenSSL\ca server
于是,在C:\CA\temp\vnc_server生成如下文件:
server.key – 私人/公共密匙对
server.crt – 服务器端的证书
server.pem - server.key + server.crt (在使用Stunnel时将用到)
应该强调的是,服务端的私匙并没有通行码来加密,使用通行码来加密私匙的方法并没有在这里派上用场,主要是因为Stunnel尚不支持通行码,其次,是用通行码加密后的私匙将不能被用于Stunnel软件。
VNC客户端
最后一步是产生客户端的密匙对和证书。
C:\progra~1\OpenSSL\ca client
跟服务端类似,在C:\CA\temp\vnc_client文件夹中将产生如下文件:
client.key –私人/公共密匙对r
client.crt – 客户端证书
client.pem – client.key + client.crt (在使用Stunnel时将用到)
Stunnel 设置
VNC服务端
在建立起服务段和客户端的一种安全传输模式前,我们必须设置好Stunnel软件,并且安装必需的密匙和证书。
在C:\Program Files\Stunnel文件夹中新建一个stunnel.conf文件,文件内容为:
CAfile = CAcert.pem
CApath = certificates
cert = server.pem
client = no
verify = 3
[vnc]
accept = 443
connect = 127.0.0.1:5900
通过以上设置,使得所有连接tcp443端口的连接转向到本地tcp5900端口,当然有个前提,那就是客户端必须提供有效的证书。
接下来,将ca证书(C:\CA\CAcert.pem)和VNC服务端的密匙,证书(C:\CA\temp\vnc_server\server.pem)放到C:\Program Files\Stunnel
最后我们也必须安装VNC客户端证书,要想使隧道程序在鉴定过程中找到证书,我们必须按照以下方法来更改证书名称。(以下命令必须在产生证书的服务器上运行,其中value为运行openssl x509命令之后的输出结果,在使用copy命令时,value必须要用这个实际的输出结果代替。)
cd C:\CA\temp\vnc_client
C:\progra~1\openssl\openssl x509 -hash -noout -in client.crt
value
copy client.crt value.0
然后这个value.0文件应该被放到C:\Program Files\Stunnel\certificates
如图所示:
VNC客户端
在客户端配置的情况和以上的步骤类似
首先C:\Program Files\Stunnel\新建一个stunnel.conf文件
内容:
CAfile = CAcert.pem
CApath = certificates
cert = client.pem
client = yes
verify = 3
[vnc]
accept = 127.0.0.1:5900
connect = VNC_server_IP_address:443
接下来,将ca证书(C:\CA\CAcert.pem)和VNC服务端的密匙,证书(C:\CA\temp\vnc_server\server.pem)放到C:\Program Files\Stunnel
同样我们需要按照以下方法来更改证书名称。
cd C:\CA\temp\vnc_server
C:\progra~1\openssl\openssl x509 -hash -noout -in server.crt
value
copy server.crt value.0
然后这个value.0文件应该被放到C:\Program Files\Stunnel\certificates
最后C:\Program Files\Stunnel这个文件夹应该是如下图所示:
测试连接
到此时为止所以的设置都已完成,为了测试,我们必须在客户端和服务段同时开启网络隧道,同时开启VNC服务端。
在服务端
在客户端
如果由于某种原因,没有能够成功的建立起连接,我们应该提高Stunnel的登陆级别,并且找出出错的原因,这时我们需要在stunnel.conf文件中添加一行:
debug = 7
然后重启stunel服务,并再次测试连接。
反向连接
在上面的设置中,只有当VNC服务器具有独立的公网IP,或者与VNC客户端同处在一个局域网中,才能够进行成功的连接。如果VNC服务端处于NAT(network address translation)后面或者试图连接服务器的信息包被防火墙丢弃,那么以上连接更本无法实现,那该怎么办?
由于VNC服务器具有"/listen"选项,所以有可能突破以上的限制,在传统的c-s模式传输中是由客户端发起连接的,但是现在不仅是客户端可以发起连接,服务端本身可以反向连接,唯一的要求就是服务端和客户端能够进行连接.当然,这个要求客户端不能在NAT反向代理之后,也不能被防火墙截住了信息包.
如前所述,VNC具有反向连接功能,要想使用这个功能,VNC服务器上的stunnel.conf文件应该做少量改动:
CAfile = CAcert.pem
CApath = certificates
cert = server.pem
client = yes
verify = 3
[vnc]
accept = 127.0.0.1:5500
connect = VNC_client_IP_address:443
同样,VNC客户端的stunnel.conf也应该做一下改动:
CAfile = CAcert.pem
CApath = certificates
cert = client.pem
client = no
verify = 3
[vnc]
accept = 443
connect = 127.0.0.1:5500
此时,服务端的stunnel软件变成了ssl的客户端,而客户端的stunnel则变成了ssl服务端。
当然服务端和客户端建立连接的方法也将改变,首先客户端打开vncviewer.exe,进入监听模式(依次打开开始菜单, RealVNC, VNC Viewer,Run Listening VNC Viewer).同时,在服务端,我们使用添加客户端选项,如图所示:
以上对于在NAT代理下的服务器非常有效,但是同时它也有个弊端,那就是必须要在服务器段进行手动操作,是否有一种方法可以不需要人为操作的建立上述连接了?
这个方案是可行的,它可以使用微软操作系统中的计划任务来实现,下图显示了如何通过计划任务来设置VNC服务端在每天的上午9点到下午9点每隔10分钟进行自动反向连接,当我们想在客户端进行连接的话,所要做的只是将vncviewer.exe设置为监听模式,最多10分钟就将等到来自服务端的主动连接.
相关名词解释:
SSH :(Secure Shell)用于提供安全的远程登录和其他安全网络服务。
SSL :(Secure socket Layer) 安全套接层协议
Tunnel:网络隧道,指的是利用一种网络协议来传输另一种网络协议。
VNC:(Virtual Network Computing)跨平台,免费,开放源代码的一款远程管理软件。由两部分部件组成:服务端(Server)和客户端(Viewer)。
Stunnel:一种程序,可以使用 OpenSSL 库对任意 TCP 会话进行加密。
OpenSSL:一个非常优秀的SSL/TLS开放源码软件包,它包括SSL库、加密算法库以及应用程序三大部分。