使用 Qubes 保护桌面:额外保护

作者:Kyle Rankin

本文是我关于 Qubes 操作系统的系列文章的第四篇,Qubes 操作系统是一个以安全为中心的 Linux 发行版,它将您常见的桌面任务划分为独立的虚拟机。在前几篇文章中,我对 Qubes 进行了一般性介绍,逐步介绍了安装过程,并讨论了我个人如何将自己的工作组织到不同的 appVM 中。如果您还没有阅读过之前的文章,我建议您在深入阅读本文之前先阅读它们。在本文中,我将重点介绍 Qubes 中一些更高级的安全功能,包括 split-GPG、usbVM 以及我如何控制 URL 的打开位置。

Split GPG

我一直以来对我的 Linux 桌面感到担忧的一个方面是,我的桌面上有一个 GPG 密钥副本,以便我可以将其用于我的电子邮件。当然,我的密钥是受密码保护的,但我仍然担心,如果我的计算机遭到入侵,攻击者仍然可以获取它并尝试暴力破解它。

您可以使用多种不同的技术来保护 GPG 密钥,包括将主密钥离线存储在气隙系统中的方法,同时您使用从属密钥。Qubes 提供了一种相当新颖的 GPG 密钥安全方法,其 split GPG 系统的作用类似于简易硬件安全模块。使用 split GPG,您可以将 GPG 密钥存储在高度信任的 appVM 中,例如 Qubes 默认安装的 vault VM。vault 完全没有网卡,旨在存储 GPG 密钥等敏感文件。当应用程序想要访问 GPG 密钥以加密或解密文件时,它不会直接调用 GPG,而是调用 Qubes 默认模板中包含的包装脚本。此脚本会请求访问 vault GPG 密钥的权限,并且在有限的时间内有效(这意味着您会在桌面上收到来自 vault 的不可伪造的提示),如果您授予它权限,它会将 GPG 输入(例如,要加密或解密的数据)发送到 vault。然后,vault 将执行 GPG 操作并将输出发送回 appVM。通过这种方式,密钥始终保留在 vault 内,appVM 永远不会看到它。

Split GPG 的设置相对简单,主要挑战在于因为它依赖于包装脚本,所以任何调用 GPG 的应用程序都需要更改为指向 qubes-gpg-client 或 qubes-gpg-client-wrapper 之类的脚本(前者在命令行上有效,可以保留环境变量,后者在不能很好地保留环境变量的程序(如电子邮件客户端)中效果更好)。Qubes 的网站上有关于 split GPG 的出色文档,其中包括一些图表、对其工作原理和局限性的详细解释,以及包含 Thunderbird 和 Mutt 示例配置的操作指南。

第一步是确保您的 appVM 中安装了 qubes-gpg-split 软件包(如果未安装,您应该可以使用常规软件包管理器安装它),并且 dom0 中安装了 qubes-gpg-split-dom0(如果未安装,请在 dom0 终端中运行 sudo qubes-dom0-update qubes-gpg-split-dom0)。

安装软件后,将您的 GPG 密钥环放入您想要用作 vault 的 appVM 中。我推荐默认的 vault,除非您有更高级和具体的原因想要使用另一个 appVM。从 vault 的终端执行一些 GPG 命令行命令(例如 gpg -K)以确认 GPG 密钥已正确安装。

现在要使用 split GPG,只需将 QUBES_GPG_DOMAIN 环境变量设置为具有您的 GPG 密钥的 appVM 的名称,然后您应该能够从该 appVM 运行 qubes-gpg-client,并使用您通常传递给 GPG 的相同类型的参数。对于邮件客户端等可能无法加载该环境变量的应用程序,您必须改用 qubes-gpg-client-wrapper。此脚本配置为读取 /rw/config/gpg-split-domain 文件的内容以确定要使用的 appVM,因此请确保它包含您的 vault 的名称。


$ sudo bash -c 'echo vault > /rw/config/gpg-split-domain'

基本 GPG 用法基本就是这样。它未涵盖的一个主要用例是从 appVM 将密钥导入回 vault。您希望以受信任的方式导入密钥,因此 Qubes 为此目的提供了不同的脚本,它会在导入密钥之前在 vault 中以不可伪造的窗口提示您。要导入密钥,只需使用这个


$ export QUBES_GPG_DOMAIN=vault
$ qubes-gpg-import-key somekey.asc

这应该足以让您开始使用 split GPG,但如果您需要 Thunderbird、Mutt 和 Git 等应用程序的特定 split GPG 配置示例,我建议您查看 Qubes split GPG 文档页面

USB VM

个人计算机面临的主要风险之一是 USB 端口。您可以在互联网上找到大量关于组织(包括政府)因某人插入不受信任的 USB 密钥而遭到入侵的故事。甚至有一些有趣的硬件项目,例如 USB Rubber Ducky,它提供看起来像无辜的 USB 拇指驱动器,但当您插入它时,它可以像 USB 输入设备一样工作,并且通过其脚本语言,您可以对其进行编程,使其输入您想要对受害者进行的任何有损按键操作(包括等待一段时间后再释放您的有效负载)。

鉴于现在几乎任何人都可以创建恶意 USB 设备,您绝对需要小心插入的 USB 设备。即使是 Qubes 安装也可能面临相同的风险,因为默认情况下,dom0 VM 被分配了 USB PCI 控制器,因此如果您错误地插入了受感染的 USB 密钥,它可能会危害您的整台机器。值得庆幸的是,Qubes 提供了一种对策,可以选择创建一个特殊的 USB VM,该 VM 被分配了您的所有 USB PCI 设备。有了 USB VM,如果攻击者在您离开时将恶意 USB 设备插入您的计算机(或者您自己插入),则损害仅限于 USB VM。

当然,如果您的所有 USB 设备现在都严格分配给一个 VM,您如何在其他 appVM 上使用它们?对于鼠标和键盘等输入设备,Qubes 提供了一个输入代理服务,该服务会将输入设备代理到其余的 appVM,前提是用户在插入设备时接受提示。当您插入 USB 存储设备时,它首先仅显示在 USB VM 中,然后您可以在 Qubes VM 管理器中通过右键单击 appVM 并从附加/分离块设备菜单中选择设备来将其分配给其他 appVM(请务必在拔下它之前分离它,否则 Xen 已知会混淆块设备的状态)。

如果您确实想要启用 USB VM,则 sys-usb USB VM 会在安装过程中显示为一个选项,在您选择要加载的默认 appVM 的屏幕上。否则,如果您想在安装后试用它,您可以从 dom0 VM 运行以下命令(Qubes 3.1 或更高版本)


$ qubesctl top.enable qvm.sys-usb
$ qubesctl state.highstate

这些命令将运行 Qubes 团队放在一起的自动化 Salt 脚本,该脚本将适当地配置 sys-usb VM。当然,如果您想手动完成所有这些操作,您也可以只创建自己的 sysVM(我建议尽可能不要给它配备网卡),然后在 Qubes VM 管理器中,进入该 VM 的设置,并识别并将您的 PCI USB 控制器分配给它。

现在,sys-usb 在安装程序中默认禁用是有原因的。虽然台式计算机仍然提供 PS/2 端口,并且许多笔记本电脑使用 PS/2 作为其主键盘和鼠标的接口,但一些笔记本电脑(例如当前的 MacBook)将 USB 接口用于主键盘。如果是这种情况,您最终可能会被锁定在计算机之外,因为您的 USB 键盘将在启动时分配给您的 USB VM,并且您将无法登录。另一个缺点是,虽然有服务可以与其他 appVM 共享输入设备和存储设备,但任何其他 USB 设备(例如网络摄像头或网卡)都无法共享,并且只能从 USB VM 中的应用程序使用。最后,USB VM 在某些类型的硬件上不稳定,具体取决于它对 Qubes 的支持程度。

默认情况下,只有鼠标可以通过 Qubes 输入代理(并且仅当您接受提示时)。默认情况下不允许键盘通过,因为恶意键盘输入设备可能会对系统造成额外的风险,包括 USB VM 可以读取您在其他 appVM 上键入的任何内容(例如密码)或可以输入自己的按键。如果您愿意接受这种风险,您仍然可以通过确保在任意 USB 键盘与环境的其余部分共享之前提示您来提供一定程度的保护。在 dom0 终端中,将以下行添加到 /etc/qubes-rpc/policy/qubes.InputKeyboard


sys-usb dom0 ask

在这种情况下,我指定了 sys-usb,但如果您使用不同的 appVM 作为您的 USB VM,请在此处使用其名称。

如果您使用 USB VM,您可能会发现的一个大挑战是在视频会议中。由于基本上每个网络摄像头都显示为 USB 设备,并且目前无法与其他 VM 共享该 USB 设备,因此您只能在 USB VM 中使用网络摄像头应用程序。另一个挑战是,默认情况下,sys-usb VM 没有网络访问权限,并且由于它是系统 VM 类型,您不能只是将其指向您的 sys-net VM 以授予其网络访问权限。相反,如果您想使用 USB VM 进行视频会议,则不幸的是您必须将现有的 sys-usb VM 替换为一个新的 VM,该 VM 要么是 appVM,要么是 proxyVM,以便它可以获得网络访问权限。然后,您将必须在该 VM 中安装和运行您的视频会议软件。

这种方法的主要缺点是,USB VM 传统上被认为是不受信任的 VM,就像 sys-net 一样,但视频会议在某种程度上是受信任的应用程序,因为您必须提供登录凭据。安全风险是否值得收益是您必须根据您的威胁模型自行决定的。幸运的是,在未来,一旦新的 USB 虚拟化功能进入 Xen(和 Qubes),您或许可以将网络摄像头视为 Qubes 内的输入或存储设备。

URL 处理程序

您可以对 Qubes 桌面进行的最后一项增强功能不仅有助于安全性,而且还有助于易用性,那就是 Qubes CLI 工具,用于在不同的 appVM 中打开 URL。一个常见的用例是将您的电子邮件客户端配置为在一次性 VM 中打开附件(Qubes 在其主要文档页面上涵盖了 Mutt 等邮件客户端)。除此之外,我喜欢将不打算运行 Web 浏览器的 appVM 的默认 URL 处理程序设置为我的通用不受信任的 appVM。不受信任的 appVM 上没有任何个人文件或任何对我真正有价值的东西,并且我不会在该 appVM 中输入任何登录凭据。因此,我可以随时销毁并重新创建它。

默认 URL 处理程序是您必须在每个 appVM 中进行的设置。我设置它的方式是转到该 appVM 的快捷方式编辑器(通过单击该 appVM 的桌面菜单中的“添加更多快捷方式...”选项),并将首选应用程序程序添加到该 appVM 的快捷方式中。这与您在常规桌面上用于选择 Firefox 或 Chrome 作为默认 Web 浏览器的程序相同。添加快捷方式后,我启动该程序,并在我可以设置 Web 浏览器的部分(图 1)中,我选择“其他”,以便我可以输入自己的自定义命令,并在该字段中,我输入


qvm-open-in-vm untrusted "%s"

图 1. 更改默认 URL 处理程序

保存后,下次我单击该 appVM 中的 URL(例如,在聊天会话中)时,我将收到来自不受信任的 appVM 的提示,允许此 appVM 在那里打开 URL。您可以每次都允许,也可以选择“全部允许”,以永久允许此 appVM 在不受信任的环境中打开 URL,而无需提示。我使用类似的方法在我的个人 Web appVM 而不是不受信任的 appVM 中打开来自我的 KeePassX 密码管理器的 URL,方法是转到 KeePassX 设置并在那里配置自定义 URL 处理程序。如果您宁愿在一次性 VM 中打开 URL,只需将此命令更改为


qvm-open-in-dvm "%s"

虽然 Qubes 默认情况下非常安全,但这些额外的设置将帮助您进一步锁定它,并且每个设置都提供了一个很好的例子,说明分区的原则如何帮助您隔离和保护您的计算机。这是我目前打算在 Qubes 系列中撰写的最后一篇文章;但是,将来我可能会回来撰写更具体的 Qubes 操作指南。

Kyle Rankin 是 Linux Journal 的技术编辑和专栏作家,也是 Purism 的首席安全官。他是 Linux Hardening in Hostile NetworksDevOps TroubleshootingThe Official Ubuntu Server BookKnoppix HacksKnoppix Pocket ReferenceLinux Multimedia HacksUbuntu Hacks 的作者,也是许多其他 O'Reilly 书籍的撰稿人。Rankin 经常就安全和开源软件发表演讲,包括在 BsidesLV、O'Reilly Security Conference、OSCON、SCALE、CactusCon、Linux World Expo 和 Penguicon 上。您可以在 @kylerankin 上关注他。

加载 Disqus 评论