使用 SSL 保护 VNC 应用程序

桌面远程控制设置实例

SSL 为使用 VNC 和标准 Web 浏览器对远程桌面进行方便、安全的访问提供了一种新颖的机制。

Kyler Laird (Kyler@lairds.com), 研究分析员, Student

Kyler Laird is 是位于 Merced 的加州大学的一名研究分析员,他还有其他很多角色。他的志愿活动在很多公共资源方面都已经取得了成效,包括他在专用航空飞行和动物援救方面的努力。



2007 年 3 月 02 日

您希望使用比专有解决方案更方便并且具有比 ssh 更具安全性的方式来访问远程桌面吗?本文将介绍一种很好的方法,这是我们之前从未介绍过的一种技术。

这种想法是使用 SSL 为嵌入在 Web 页面中的一个简单 VNC 查看器提供安全性。这意味着实际上任何可以处理 Java 的 Web 浏览器都可以查看远程桌面,并与之进行交互;对于典型的情况来说这是一个功能十分强大的解决方案,包括电话协作、技术支持和供应。

计算机在这里,屏幕在那里

计算机在某个位置执行一个操作,在其他地方的人希望看到结果。符合这种描述的情况非常多,实现这种功能的方法也几乎同样多。有一种方法是将常规的单个桌面作为一个使用 HTTPS 协议进行保护的 Web URL 地址来发布,在与那些非软件专家的人一起工作时,这种方法特别方便。通过一个连接到远程桌面的超链接或仅在浏览器的地址栏输入 URL 即可进行远程访问,这对于 “平民” 用户来说非常方便。

只需要花几分钟的功夫,您就可以建立自己的远程桌面。这种方法的一个重要功能特性是它进行认证的方法:它并不基于登录级别的帐号,后者常见于基于 ssh、IPv6、OpenVPN 和大部分专有产品的远程访问机制,我们将展示如何为 SSL 设置帐号/密码对。这是一种非常 “轻量级” 的方法,可以与桌面主机上的其他用途隔离开来。同时,这种方法在 Web 上应用广泛,并且是一种关键的技术,大部分开发人员来此非常熟悉。

尽管只需要几个步骤就可以实现通过 SSL 来访问 VNC,但是这个配置的核心存在一个复杂的问题:Jva VNC 客户机不会连接到那些自己对证书进行签名的 SSL 站点上。更确切地说,流行浏览器所使用的 JVM 通常都需要经过 “受信任的第三方” 认证权威(CA)签名的证书。

这篇文章对读者进行了有效地分类。可能由于管理或开发安全 Web 站点的需要您已经开始使用 SSL,那就可以立即在 VNC-through-SSL 项目中使用相同的 Web 服务器和经过签名的证书。如果您 尚不具备 使用 SSL 的背景知识,那么这种技术则不是一个很好的入门。对您来说,更传统的 ssh 隧道或 Hamachi 以及商业解决方案可能是通向远程桌面的更简单起点。更多信息请参看侧栏的 证书和 SSL


方法

第一个步骤是设置 VNC 服务器以及相应的隧道。对于这个步骤来说,您必须具有一个允许创建有效密钥文件的证书,包括一个私钥和一个公钥。将密钥放置在 /etc/ssl/certs/stunnel.pem。这个例子使用了 TightVNC 服务器并显示:5。

清单 1. 启动 TightVNC 服务器和隧道
$ tightvncserver :5
$ stunnel -d 5705 -r 5905 -p /etc/ssl/certs/stunnel.pem

尽管大部分 Linux 主机都进行了设置以允许任何用户都可以启动 vncserver,但是您很可能会需要 root 特权来有效地使用 stunnel。根据主机的安全性模型,您最好是执行下面的命令: sudo stunnel ...

现在,服务器应该为地址 there:5905 提供了一个未加密的连接,并为 there:5705 提供了一个加密连接。使用任何方便的 VNC 查看器来验证未加密连接,重定向到 yourhost:5。要确保 stunnel 已经启动并且正在运行,请使用下面的命令来搜索系统日志:

清单 2. 检查 stunnel 是否已成功
# grep stunnel /var/log/syslog|tail -24
Aug 21 18:58:17 there stunnel[5453]: Using '5905' as 
      tcpwrapper service name
Aug 21 18:58:17 there stunnel[5453]: stunnel 3.26 on 
      i386-pc-linux-gnu PTHREAD+LIBWRAP with OpenSSL 0.9.7e 25 Oct 2004
Aug 21 18:58:17 there stunnel[5454]: FD_SETSIZE=1024, 
      file ulimit=1024 -> 500 clients allowed

出现的错误 —— 密钥文件无效,没有足够的权限,或者端口已经被使用 —— 出现在同样的日志文件中。例如,如果缺少密钥,在日志中的形式如下:

Aug 21 18:58:17 there stunnel[5453]: /etc/ssl/certs/stunnel.pem: No such file or directory (2)

由于服务器可以同时处理未加密端口和已加密端口,下面让我们转到 VNC Web 客户机上来。要启用这种功能,需要从 x11vnc 项目中下载启用 SSL 的 Java VNC 查看器。在下载源 tarball 文件之后,就可以使用位于 x11vnc-X.Y.Z/classes/ssl/VncViewer.jar 和 x11vnc-X.Y.Z/classes/ssl/SignedVncViewer.jar 中的 Java 代码了。设置一个目录来存放 VNC 的内容,将 VncViewer.jar 拷贝到这个目录中,并创建一个 HTML 源文件。这个样例 HTML 文件允许通过 SSL 连接到 there:5705

清单 3. 连接到 there:5705 上
<html>
<body>
<applet code="VncViewer.class" archive="VncViewer.jar" width="800" height="600">
<param name="PORT" value="5705" />
<param name="HOST" value="there" />
<param name="Open New Window" value="no" />
<!-- the following helps in Opera:
<param name="Cursor shape updates" value="Disable" />
-->
</applet>
</body>
</html>

HTTP 和 HTTPS 都可以为该 applet 服务。假设 HTML 和 Jar 文件在端口 80 上使用了 HTTP 服务,URI 为 /vnc,那么地址 http://there/vnc 就会显示这个桌面。记住要对您的浏览器启用 Java!另外,还要注意 HOST 参数和源地址要使用相同的主机名;Java applet 的安全模型必须要求这样做。


更多使用技巧

使用标准组件和协议的一个优点是它们可以非常简单地进行替换。例如,我们的开发大部分都采用了 Xvnc 服务器,还有一些方法可以取代上面方法中的 TightVNC。注意这些替代方法使用的命令行参数可能会稍有不同;不过,在所有情况中,原理都是相同的。几乎所有的 Linux 发行版都提供了根据发行版标准进行封装的 VNC 服务器,一些开源 VNC 项目甚至很容易从源代码进行安装。任何 VNC 服务器安装中最困难的部分是需要特定的默认字体。不过,即使在这种情况下,至少提供了明确的补救措施。

在浏览器中使用启用 SSL 的 VNC 查看器至少存在一点风险。它在所有主要浏览器中都可以使用,包括 Mozilla Firefox、Internet Explorer 和 Opera,不过所有浏览器都需要使用 Java runtime 1.4 或更高版本。当用户使用旧版本的 Microsoft Windows 操作系统时就会出现问题,旧系统仍然依赖于 Microsoft JVM 1.1。在这种情况下,VNC 查看器无法在 Internet Explorer 上运行,并发送报告表示找不到 VncViewer 类。惟一的解决方案是为 VNC 服务器提供一个非 SSL 的连接,并建议将 Java 升级到任何最新的 Java 运行时上。

默认情况下,大部分 VNC 服务器都 共享桌面;即任何连接都会关闭之前的连接。要进行协作、技术支持以及类似的应用,使用一个命令行参数 -alwaysshared 或类似方法来启动服务器,按照文档规范来执行。这样允许多个用户同时连接到同一个桌面上。


重点是什么?

尽管您可能已经使用了 VNC、Web 服务、Java、SSL、浏览器等等,不过您可能从来没有将它们结合在一起使用。现在您究竟获得了什么呢?

我们前面已经提到过,如果您正在使用 SSL,那么只需要重用证书就可以了,如果还没有使用 SSL,那只需要花费很少时间就可以开始使用它,严格来说并不如此。

从开发人员的观点来看,SSH 至少扮演了两个角色:

  • 对 VNC 通信进行加密和认证,让您的远程桌面在充满敌意的 Internet 世界中可以具备基本的安全性。
  • SSL 开放了对普通浏览器的使用能力。

如果浏览器无法找到信任的证书用于 SSL 通信,那么您(或者更严重,任何使用 Web 浏览器远程访问桌面的其他人)会看到 大量 的警告对话框 —— 甚至会多到不堪忍受。

在本文中,我们通过建议您使用已购买并使用的证书解决了这个问题。这个答案说大太大,说小也太小。例如,Sun 公司的 j2re 1.4 JVM 不仅要求由认证权威签名的证书,而且要求这个证书必须是来自高端 CA,包括 Verisign 和 Thawte。使用这种 JVM 的浏览器会将那些由不太出名的 CA 所签名的证书当作是自签名的证书对待。

另外一方面,本文强调了使用自签名的证书来实现通过 SSL 使用 VNC 是不可能的。如果您可以容忍不断弹出的浏览器警告,至少 可以 使用自己的证书做实验。

有关创建自签名证书的教程出人意料的多,它们都承诺将整个过程变得 “非常简单”。在某个层次上,它们所做的事情就是执行下面的命令行:

清单 4. 创建自签名的证书

openssl genrsa -des3 -out server.key 1024
openssl rsa -in server.key -out server.pem
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 3560 -in server.csr \
-signkey server.key -out server.crt
cat server.pem server.crt > combined.pem

其中一些步骤要求该命令行具有交互作用。最关键问题是第 3 行中有关 “Common Name” 的;这个值要使用共享桌面所在主机的完全限定域名。通常,这个值就是 `hostname`

如何获得证书是通过 SSL 使用 VNC 过程中最困难的部分;使用目前具备的证书,您应该可以非常简单地完成所有其他步骤。

实际上,您现在获得的东西非常多。首先,这是一个非常类似于 GUI 的 screen;也就是说,您可以在工作时启动 GUI 会话,并结合使用您具有的所有功能和性能,离开会话并通过任何一个具有 Java 功能的 Web 浏览器重新连接到相同的会话。这是一个功能非常强大的工具。

不过,您还获得了更多内容。VNC 对于电话会议来说非常方便。例如,我们使用它来为非技术用户建立一个复杂图形应用程序的展示。原则上来说,远程 X 服务器也可以执行相同的功能,但是 VNC 提供了很多优点:

  • 安全性更具有可管理性。
  • 与 X 相比,VNC 通常更容易通过防火墙。
  • VNC 查看器比 X 服务器更容易安装 —— 尤其是那些免于安装的基于浏览器的查看器。
  • 很容易通过 VNC 为多个查看器提供一个桌面。
  • VNC 通常较少受到网络延迟的影响。
  • X 认证(和 ssh 隧道)通常都是基于 /etc/passwd 级的帐号的,而基于 Web 的访问使用的则是 HTTP(S) 认证。创建并维护这种帐号需要很多经验,即使对于临时使用(例如电话会议演示)也是如此。
  • 与 X 服务器相比,VNC 查看器需要更少的内存和相关硬件。
  • VNC 服务器通常为只读访问提供了非常有用的配置。

另外使用该技术的例子的一个关键点是最繁重的加密计算负载是由 “本地” 代码非 Java 运行时来执行的。尽管假设网络延时是决定性能的第一个因素是非常安全的,但是加密和解密的代价太高,使得无法使用其他替代技术(除非使用具有极高性能的计算机)。通过 SSL 使用 VNC 的一个令人愉悦的优点是,在旧硬件甚至非常简单的硬件上使用标准软件就可以快速产生可以接受的响应能力。

您可能还有一些不同的需求和资源。您需要自己确定 VNC 与 Citrix、Windows Terminal services、 WebEx、Hamachi 以及其他 “远程” 解决方案所提供的商业软件相比到底如何。不过,我们已经看到通过 SSL 使用 VNC 已经解决了相当多的问题。

在后续文章中,我们将展示如何将 VNC 与其他虚拟化技术组合在一起实现功能强大的资源共享技术。不过在结束本文之前,有一点重要的问题需要提醒读者:VNC 存在非常严重的安全问题。由于 VNC 只使用一个会话密码进行保护,如果对标准 VNC 服务进行几个小时或几天的蛮力攻击,很可能就会破解。对 VNC 感兴趣的 “坏家伙们” 的数量正在迅速增加;请 确保 您对 VNC 使用了一个非常强壮的密码,至少有 8 个字母,最好是数字、字母和其他符号的组合。SSL 提供了很多保护机制,如果每次会话时间要持续几个小时,就应该考虑使用这些保护机制。在后续文章中我们将更详细地介绍安全性问题。

上面的方法利用了几个功能强大的开源示例,但是它本身几乎没有实现独创的编程。居然没有人编写文档来论述将这些组件组合起来,而这种组合非常的方便,这实在令人惊讶。有关 VNC、SSL 和其他内容的更详细介绍请参看 参考资料 一节的内容。


结束语

在下一篇文章中,我们将更详细介绍两个通过 SSL 使用 VNC 可以大展宏图的特定工作场所,以及如何在自己的环境中采用这种技术,包括如何与防火墙和代理协作使用。我们还将介绍使用 “本地” VNC 查看器与本文提到的承载浏览器的客户机协同工作何时能够成为一个优点。

这里要特别感谢 Matt Kennel,他和我们一样担心安全性问题,并对如何实际应用通过 SSL 使用 VNC 的技术与我们进行了讨论。

参考资料

学习

  • 您可以参阅本文在 developerWorks 全球网站上的 英文原文
  • 请回顾 Wikipedia 上 远程计算的优点和特性
  • 利用 tclRFB 创建 VNC 系统”(developerWorks,2003 年 3 月)简要介绍了 VNC 技术,并展示了如何简单地对其进行定制。对于远程桌面来说,您可以使用标准的 VNC,不过 VNC 的灵活性意味着它很容易通过 VNC 层的调整来对远程系统进行增强。
  • TightVNC 是一个 GPL 的 VNC 跨平台实现,它具有很多 高级特性,包括丰富的压缩选项,完全控制和只读控制的区别,自动 ssh 隧道。基于 TightVNC 的文档项目包括 Xvnc Terminal Server
  • Xvnc 是一个 VNC 参考实现(请不要与 xVNC 混淆,它是 VNC 到基于 Windows 的 Visual Basic 6 的一个绑定)。
  • stunnel 是一个 GNU 程序,可以在 “Secure Sockets Layer 内对任何 TCP 连接进行加密……”。这个项目对 VNC 与 stunnel 进行了组合,从而可以通过 SSL 加密来访问桌面。注意 stunnel 需要由 stunnel.pem 的所有者运行,通常是 root
  • x11vnc 是 “a VNC for real X displays”,作者找到了 OpenGL 工作中不可缺少的一些东西。另外,x11vnc 还包括了一个 增强的 Viewer 包,它可以满足本文中介绍的项目的需求。
  • 根据 Hamachi 主页上的说法,“Hamachi 是一个零配置的虚拟专有网络应用程序”。其 “核心版本” 是免费的,不过 Linux 发行版 目前只能作为一个控制台应用程序使用。
  • SSL client authentication: It's a matter of trust”(developerWorks,1998 年 3 月)对 Secure Sockets Layer 和客户机认证使用的技术进行了简介。对于本文的目标来说,SSL 可以认为是一个 “附件”,它对底层 IP 协议进行加密、验证和认证。作者使用它为服务于桌面交互拷贝的进程和一个启用 Java 的 Web 浏览器之间建立安全连接。
  • 根据 SSL-Explorer 在 SourceForge 主页上的说法, “SSL-Explorer 是一个功能完备的基于 Web 的 SSL VPN 服务器”。它具有和本文介绍的通过 SSL 使用 VNC 技术相同的特性和优点。
  • 再谈客户端的 Java 技术”(developerWorks,2001 年 3 月)从 Java 的角度认为远程查看器就是一个客户端应用程序。本文中的代码需要使用 JVM 1.2 或更高版本。尽管 Win98 和 Win2000 上广泛使用的浏览器只提供了 1.1 版本 —— 一些联机银行应用程序依然需要使用它 —— 大部分现代浏览器操作系统组合现在都使用 1.4 或更新版本。
  • “The X Window System” 是图形工具包的正式名字,它构成了几乎所有 Linux 和 UNIX 桌面的基础。"An Introduction to X11 User Interfaces" 是 Grant Edwards 在 10 年前撰写的,目前依然非常适用,而且几乎完全正确。其中介绍的远程技术在 VNC 层上完全可以工作,并不直接依赖于 X;然而,X 是几种实现远程访问并彼此竞争的方法的基础,因此对它有一个明确地了解将非常有用。
  • 服务器诊所: 使用 ssh 进行安全的连接”(developerWorks,2003 年 9 月)回顾了进行远程连接的可能性。ssh 是一种非常灵活的协议,通常用来构建 “安全隧道”。通过 ssh 隧道使用的 VNC 可能是 Linux 上唯一的最常用远程技术。
  • 根据 2003 年文章 “Power Sessions with Screen” 的说法,“Screen 是一个允许您通过一个物理终端管理多个进程的终端复用器”。 对于那些关注命令行的用户来说,Screen 非常 有用。从 1991 年开始就可以使用 Screen 了。
  • developerWorks 中国网站 Linux 专区 为 Linux 开发人员提供了更多资源。
  • 随时关注 developerWorks 技术活动网络广播

获得产品和技术

  • 订购 SEK for Linux,共包含两张 DVD,其中有用于 Linux 的最新 IBM 试用软件,包括 DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere®。
  • 利用 IBM 试用版软件 在 Linux 上构建您的下一个开发项目,可直接从 developerWorks 下载。

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Linux, Open source
ArticleID=199623
ArticleTitle=使用 SSL 保护 VNC 应用程序
publish-date=03022007