Paranoid Penguin - 安全远程桌面/应用程序会话

作者:Mick Bauer

通过网络控制 Linux 系统有很多不同的方法,并且您可能有许多理由想要这样做。在过去的专栏中介绍远程控制时,我倾向于关注面向服务器的用例和工具,也就是说,通过基于文本的应用程序(例如 OpenSSH)管理服务器。但是,基于 GUI 的应用程序和远程桌面呢?

远程桌面会话对于技术支持、监控和远程控制桌面应用程序非常有用。但是,并非总是需要访问整个桌面;您可能只需要运行一两个特定的图形应用程序。

在本月的专栏中,我将介绍如何使用 VNC(虚拟网络计算)进行远程桌面会话,以及如何使用带有 X 转发的 OpenSSH 来远程访问特定应用程序。当然,我们这里的重点是安全地使用这些工具,并且我包括了关于每种工具相对优点的健康剂量的观点。

远程桌面与远程应用程序

那么,您应该使用哪种方法,远程桌面还是远程应用程序?如果您是从 Microsoft 世界来到 Linux 的,您可能会倾向于认为,由于 Windows 中的终端服务非常有用,因此您必须在 Linux 中也拥有某种远程桌面访问。但这可能并非如此。

Linux 和大多数其他基于 UNIX 的操作系统都使用 X Window 系统作为其各种图形环境的基础。并且,X Window 系统的设计目的是通过网络运行。事实上,它将您的本地系统视为一个独立的网络,X Window 系统的不同部分通过该网络进行通信。

因此,不仅有可能而且容易通过 TCP/IP 网络运行单个 X Window 系统应用程序——也就是说,在您的本地系统上显示远程执行的图形应用程序的输出(窗口)。由于 X Window 系统对网络的使用不是很安全(X Window 系统本身完全不支持任何类型的加密),因此现在我们通常通过安全外壳 (SSH)(尤其是 OpenSSH)隧道传输 X Window 系统应用程序窗口。

隧道传输单个应用程序窗口的优点是,它比远程运行整个桌面更快且通常更安全。缺点是 OpenSSH 有安全漏洞的历史,并且对于许多 Linux 新手来说,通过在 shell 会话中输入的命令转发图形应用程序是违反直觉的。而且,正如我之前提到的,远程桌面控制(甚至只是查看)对于技术支持和安全监控非常有用。

使用带有 X Window 系统转发的 OpenSSH

说了这么多,通过 OpenSSH 隧道传输 X Window 系统应用程序可能比您想象的要容易得多。您只需要一个运行 X 服务器的客户端系统(例如,Linux 桌面系统或运行 Cygwin X 服务器的 Windows 系统)和一个运行 OpenSSH 守护程序 (sshd) 的目标系统。

请注意,我没有说“运行 sshd X 服务器的目标系统”。这是因为 X 服务器,奇怪的是,实际上并不运行或控制 X Window 系统应用程序;它们仅仅显示它们的输出。因此,如果您在远程系统上运行 X Window 系统应用程序,则需要在本地系统上运行 X 服务器,而不是在远程系统上。应用程序将在远程系统上执行,并将其输出发送到您的本地 X 服务器的显示器。

假设您有两个系统,mylaptop 和 remotebox,并且您想使用 GNOME 系统监视器监控 remotebox 上的系统资源。进一步假设您在 mylaptop 上运行 X Window 系统,并在 remotebox 上运行 sshd。

首先,在 mylaptop 上的终端窗口或 xterm 中,您将像这样打开一个 SSH 会话

mick@mylaptop:~$ ssh -X admin-slave@remotebox
admin-slave@remotebox's password: **********
Last login: Wed Jun 11 21:50:19 2008 from dtcla00b674986d
admin-slave@remotebox:~$

请注意我的 ssh 命令中的 -X 标志。这为 SSH 会话启用了 X Window 系统转发。为了使其工作,必须在远程系统上的 /etc/ssh/sshd.conf 文件中将 sshd 配置为 X11Forwarding 设置为 yes。在许多发行版中,yes 是默认设置,但请检查您的以确保。

接下来,要在 remotebox 上运行 GNOME 系统监视器,使其输出(窗口)显示在 mylaptop 上,只需在同一 SSH 会话中执行它

admin-slave@remotebox:~$ gnome-system-monitor &

尾随的 & 符号 (&) 使此命令在后台运行,因此您可以从同一 shell 会话启动其他命令。如果没有它,光标将不会重新出现在您的 shell 窗口中,直到您终止刚刚启动的命令。

此时,GNOME 系统监视器窗口应出现在 mylaptop 的屏幕上,显示 remotebox 的系统性能信息。这真的是全部。

此技术适用于远程系统上安装的几乎任何 X Window 系统应用程序。唯一的缺点是您需要知道您想以这种方式运行的任何内容的名称——也就是说,可执行文件的实际名称。

如果您习惯于从桌面上的菜单启动 X Window 系统应用程序,您可能不知道其相应的可执行文件的名称。一种快速查找方法是打开桌面管理器的菜单编辑器,然后查看相关应用程序的属性屏幕。

例如,在 GNOME 桌面,您将右键单击“应用程序”菜单按钮,选择“编辑菜单”,向下滚动到“系统/管理”,右键单击“系统监视器”并选择“属性”。这将弹出一个窗口,其“命令”字段显示名称 gnome-system-monitor。

图 1 显示了启动器属性,不是 GNOME 系统监视器的启动器属性,而是 GNOME 文件浏览器的启动器属性,这是一个更好的示例,因为它的启动器条目包含一些命令行选项。显然,在通过 SSH 启动 X 应用程序时,也可以使用所有此类选项。

Paranoid Penguin - Secured Remote Desktop/Application Sessions

图 1. GNOME 文件浏览器 (Nautilus) 的启动器属性

如果这听起来太麻烦,或者您担心意外搞乱您的桌面菜单,您可以简单地运行相关的应用程序,发出命令ps auxw在终端窗口中,找到与您的应用程序对应的条目。ps 输出的每一行中的最后一个字段是可执行文件的名称以及调用它时使用的命令行选项。

完成运行远程 X Window 系统应用程序后,您可以像往常一样关闭它(从其“文件”菜单中选择“退出”,单击其窗口右上角的 x 按钮等等)。不要忘记也关闭您的 SSH 会话,方法是在您运行 SSH 的终端窗口中发出命令exit

虚拟网络计算 (VNC)

现在我已经向您展示了运行远程 X Window 系统应用程序的首选方法,让我们讨论如何控制整个远程桌面。在 Linux/UNIX 世界中,最流行的工具是虚拟网络计算,或 VNC。

VNC 最初是 Olivetti 研究实验室(后来被 Oracle 收购,然后被 AT&T 收购,最后被关闭)的一个项目,它使用一种称为远程帧缓冲 (RFB) 的协议。VNC 的原始创建者现在维护应用程序套件 RealVNC,它有免费版和商业版,但 TightVNC、UltraVNC 和 GNOME 的 vino VNC 服务器和 vinagre VNC 客户端也很受欢迎。

VNC 的优势在于其简单性、普遍性和可移植性——它可以在许多不同的操作系统上运行。因为它通过单个 TCP 端口(通常是 TCP 5900)运行,所以它也对防火墙友好并且易于隧道传输。

但是,它的安全性在某种程度上存在问题。VNC 身份验证使用基于 DES 的事务,如果被窃听,则容易受到优化的暴力破解(密码猜测)攻击。许多版本的 VNC 仅支持八字符密码这一事实加剧了这种漏洞。

此外,VNC 会话数据通常以未加密的方式传输。只有少数几种 VNC 支持 RFB 流的 TLS 加密,而且即使在那些 VNC 中,TLS 的实现有多安全也不清楚。因此,使用被轻松破解的 VNC 客户端的攻击者可能能够重建和查看被窃听的 VNC 流。

幸运的是,由于 VNC 通过单个 TCP 端口运行,因此很容易通过 SSH、虚拟专用网络 (VPN) 会话以及 TLS/SSL 包装器(例如 stunnel)进行隧道传输。让我们看一个简单的 VNC-over-SSH 示例。

但是真正的系统管理员不是坚持使用终端会话吗?

如果您读过我的书或我过去的专栏,您已经忍受了我反复劝告将 X Window 系统从面向 Internet 的服务器或任何其他不需要它的系统上移除,因为 X 的复杂性和安全漏洞历史。那么,为什么我要用整整一个专栏来介绍图形远程系统管理呢?

别担心。我并没有变得心软(尽管可能有点头脑发昏);我坚持这个建议。但是,除了面向 Internet 的 DMZ 网络中的强化服务器之外,在许多情况下,您可能需要远程管理或查看事物。

而且,并非所有需要在这些非 Internet-DMZ 场景中运行远程应用程序的人都是高级 Linux 用户。难道应该禁止他们在掌握 vi 编辑器和编写 bash 脚本之前做他们需要做的事情吗?特别是考虑到确实有可能减轻与 X Window 系统和 VNC 相关的一些风险?

当然不应该!虽然我确实鼓励所有 Linux 新手拥抱命令行。Linux 可能会有一天成为像 Mac OS 那样真正图形化的操作系统,但就目前而言,几乎整个操作系统都是由 /etc(和用户的主目录中)的配置文件驱动的,这种情况不太可能很快改变。

通过 SSH 隧道传输 VNC

要通过 SSH 隧道传输 VNC,您的远程系统必须运行 SSH 守护程序 (sshd) 和 VNC 服务器应用程序。您的本地系统必须具有 SSH 客户端 (ssh) 和 VNC 客户端应用程序。

我们的示例远程系统 remotebox 已经在运行 sshd。假设它也有 vino,vino 也被称为 GNOME 远程桌面首选项小程序(在 Ubuntu 系统上,它位于“系统”菜单的“首选项”部分)。首先,可能从 remotebox 的本地控制台,您需要打开该小程序并启用远程桌面共享。图 2 显示了 vino 的“常规”设置。

Paranoid Penguin - Secured Remote Desktop/Application Sessions

图 2. GNOME 远程桌面首选项 (vino) 中的常规设置

如果您只想查看此系统的远程桌面而不控制它,请取消选中“允许其他用户控制您的桌面”。如果您不想显式确认远程连接(例如,因为您想在系统无人值守时连接到该系统),您可以取消选中“请求您确认”框。任何时候您将自己登录到无人值守的系统时,请务必使用密码保护的屏幕保护程序!

vino 在这方面是有限的。由于 vino 仅在您登录后加载,因此您只能使用它连接到正在进行的完全登录的 GNOME 会话——例如,而不是 gdm(GNOME 登录)提示。与 vino 不同,其他版本的 VNC 可以根据需要从 xinetd 或 inetd 调用。该技术超出了本文的范围,但请参阅“资源”以获取有关如何在 Ubuntu 中执行此操作的链接,或者只需 Google 字符串“vnc xinetd”。

继续我们的 vino 示例,暂时不要关闭“远程桌面首选项”小程序。务必选中“要求用户输入此密码”框并选择一个难以猜测的密码。请记住,vino 在已登录的桌面会话中运行,因此除非您在此处设置密码,否则您将面临允许完全未经身份验证的会话的风险(取决于是否正在运行密码保护的屏幕保护程序)。

如果您的远程系统将在登录状态下无人值守运行,您可能需要取消选中“请求您确认”。同样,不要忘记锁定屏幕保护程序。

我们尚未完成在 remotebox 上设置 vino。图 3 显示了“高级设置”选项卡。

Paranoid Penguin - Secured Remote Desktop/Application Sessions

图 3. GNOME 远程桌面首选项 (vino) 中的高级设置

几个高级设置尤其值得注意。首先,您应该选中“仅允许本地连接”,之后远程连接仍然是可能的,但只能通过端口转发器(如 SSH 或 stunnel)。其次,您可能希望通过“使用备用端口”选项为 vino 设置自定义 TCP 端口以进行侦听。在本例中,我选择了 20226。这是有用的安全混淆的一个实例;如果我们其他的(更有意义的)安全控制失败,至少我们不会在明显的默认端口上运行 VNC。

此外,您应该选中“断开连接时锁定屏幕”旁边的框,但您可能不应选中“要求加密”,因为 SSH 将提供我们的会话加密,并且添加冗余(且不一定已知良好的)加密只会增加 vino 已经非常明显的延迟。如果您认为在您想要使用 vino 的环境中,窃听风险仅为中等水平——例如,在无法从 Internet 访问的小型、私有局域网上——vino 的 TLS 实现可能对您来说足够好。在这种情况下,您可以选择选中“要求加密”框并跳过 SSH 隧道。

(如果您们中的任何人比我从 Internet 上了解的更多关于 vino 中的 TLS 的信息,请写信告诉我。在我为本文进行研究期间,我没有找到任何关于 vino 的 TLS 设计细节的文档或在线讨论——除了人们评论说 vino 中 TLS 的可靠性是未知的。)

这个月,在我的示例中,我似乎为您提供了比平时更多的“退出”机会。也许随着年龄的增长,我变得不那么教条了。无论如何,让我们假设您已听从我的建议,放弃 vino 的加密而支持 SSH。

至此,您已完成服务器端设置。您不必再次更改这些设置。如果您在 remotebox 上重新启动 GNOME 会话,vino 也会使用您刚刚设置的选项重新启动。但是,以下步骤是每次您想要启动 VNC/SSH 会话时都必须执行的。

在 mylaptop(您要从中连接到 remotebox 的系统)上,打开一个终端窗口,然后键入此命令

mick@mylaptop:~$ ssh -L 20226:remotebox:20226 admin-slave@remotebox

OpenSSH 的 -L 选项设置了一个本地端口转发器。在本例中,到 mylaptop 的 TCP 端口 20226 的连接将被转发到 remotebox 上的同一端口。此选项的语法为“-L [本地端口]:[远程 IP 或主机名]:[远程端口]”。您可以使用您喜欢的任何可用本地 TCP 端口(高于 1024,除非您以 root 身份运行 SSH),但远程端口必须与您设置为 vino 侦听的备用端口(在本例中为 20226)相对应,或者如果您没有设置备用端口,则应为 VNC 的默认端口 5900。

SSH 会话就到此为止。系统将提示您输入密码,然后为您提供 remotebox 上的 bash 提示符。但是,除了输入以下内容外,您不需要它exit当您的 VNC 会话结束时。现在是启动您的 VNC 客户端的时候了。

vino 的配套客户端 vinagre(也称为 GNOME 远程桌面查看器)对于我们这里的目的来说已经足够好了。在 Ubuntu 系统上,它位于“应用程序”菜单的“Internet”部分。在图 4 中,我打开了“远程桌面查看器”并单击了“连接”按钮。如您所见,我输入了 localhost 而不是 remotebox 作为主机名。我还输入了端口号 20226。

Paranoid Penguin - Secured Remote Desktop/Application Sessions

图 4. 使用 vinagre 连接到 SSH 转发的本地端口

当我单击“连接”按钮时,vinagre 连接到 mylaptop 的本地 TCP 端口 20226,该端口实际上正在被我的本地 SSH 进程监听。SSH 通过其加密连接将此连接尝试转发到 remotebox 上的 TCP 20226,该端口正在被 remotebox 的 vino 进程监听。

此时,系统会提示我输入 remotebox 的 vino 密码(如图 2 所示)。身份验证成功后,我将完全访问我在 remotebox 上的活动桌面会话。

要结束会话,我关闭“远程桌面查看器”的会话,然后在我的 SSH 会话中输入exit到 remotebox——这就是全部。

此技术很容易适应其他版本的 VNC 服务器和客户端,也可能适应其他版本的 SSH——OpenSSH 有商业替代品,包括 Windows 版本。我提到 VNC 客户端应用程序可用于各种平台;在任何此类平台上,只要您也拥有支持端口转发的 SSH 客户端,就可以使用此技术。

结论

到此为止,我关于如何通过网络控制图形应用程序的速成课程结束了。我希望我关于这两种技术(带有 X 转发的 SSH 和通过 SSH 的 VNC)的示例可以帮助您开始使用您喜欢的任何特定发行版和软件包。注意安全!

资源

Cygwin/X(关于 Cygwin 的适用于 Microsoft Windows 的免费 X 服务器的信息): x.cygwin.com

Tichondrius 的 HOWTO,用于设置具有可恢复会话的 VNC——以 Ubuntu 为中心,但主要适用于其他发行版: ubuntuforums.org/showthread.php?t=122402

维基百科的 VNC 文章,可能有助于理解不同类型的 VNC: en.wikipedia.org/wiki/Vnc

Mick Bauer (darth.elmo@wiremonkeys.org) 是美国最大的银行之一的网络安全架构师。他是 O'Reilly 图书 Linux 服务器安全(第 2 版)(以前称为 使用 Linux 构建安全服务器)的作者,信息安全会议的偶尔演讲者,以及“网络工程波尔卡舞曲”的作曲家。

加载 Disqus 评论