在隔离环境中运行应用的几种方案
在隔离环境中运行应用有诸多好处。在开发时,我们可以通过这种方法防止环境冲突、保证在不同设备上运行时环境一致;在生活中使用软件时,我们可以通过这种方法防止软件对计算机造成破坏。本文讨论了在 Windows 上在隔离环境中运行应用的四种方案:WSL+Docker, Windows Sandbox, Sandboxie 和虚拟机。
WSL+Docker
Docker 是我非常喜欢的一种隔离方案,也是我进行开发的常用环境。对于如何在 WSL 中安装 Docker,可以参考我之前的文章。
通过 VSCode 的插件 Remote-Containers 可以方便地启动一个开发用容器。需要注意的是,对于 WSL 中安装的 Docker,创建容器时你需要先用 Remote-WSL 连接到 WSL,再在 WSL 中进行连接。GitHub Codespaces 就是一种基于开发容器的服务。现在它已经成为我日常开发的重要组成一环。相比于本地的容器,它的一大好处是不需要忍受国内奇怪的网络环境。
尽管有很大局限性,WSL+Docker+wine 的方案也可以用来隔离地运行 Windows 应用。例如你可以在 WSL Docker 中通过 wine 运行 QQ ,防止它在你的物理机上安装驱动或者像以前那样扫描你的浏览器历史记录。关于 WSL 上的 GUI 应用,可以参考微软的文档。
Windows Sandbox
Windows Sandbox 是微软开发的一种沙盒。它会创造一个高度隔离的环境,理论上在里面运行的应用程序不会对外部造成破坏。之所以说理论上,是因为它仍然连接着各种 IO 设备,包括网络,这可能导致内网受到攻击。已经被修复的 CVE-2020-17087 也会导致沙盒逃逸。
它还有一些奇怪的问题,比如说:
- 缺少中文输入法。但是它的系统语言继承于宿主机,所以我不理解为什么输入法不会继承。这导致它不适合用于日常软件的隔离(需要在每次启动时安装输入法)
- 代理设置继承于宿主机且不可修改。这非常离谱,如果我在宿主机上有本地代理,沙盒内就无法上网,而且这也会把宿主机的信息暴露给沙盒内的软件。
我认为这可能时因为它还不成熟,不过偶尔用来运行一些只会运行一次,又不被信任的软件还挺好用。
这一功能需要至少专业版 Windows,且需要手动开启:
你可以通过编写 .wsb
文件来配置沙盒。下面是我的一个配置文件,曾经用于运行(需要管理员权限才能安装的)starwindconverter
。
1 |
|
Sandboxie-plus
Sandboxie-plus 是一个开源的基于沙盒的隔离软件。相比于 Windows Sandbox,它免费、更加轻量、可以持久化,但是在隔离水平上更低。
如果你希望在日常生活(而非开发)中使用有风险的软件,Sandboxie-plus 似乎是目前较为主流的解决方案。例如在 QQ 被曝光读取用户浏览历史记录后,网络上出现了不少使用 Sandboxie 运行 QQ 的教程。
但是我个人不建议这么做,Sandboxie-plus 其实仍然会向沙盒中的应用泄露不少信息,尤其是当沙盒的应用访问范围配置不当时。
虚拟机
虚拟机(包括 Hyper-V、VMWare、VirtualBox 等)是最为完整的隔离方案。除了极为罕见的虚拟机逃逸以外,它提供了完美的隔离,如果网络被良好地配置,在其内运行的软件几乎不可能对外部造成损害。但是它比较重,即启动慢、占用资源高。我在自己的电脑上就使用 Hyper-V 运行 Windows Server 2016 以容纳 QQ 等不信任但又不得不用的软件,Hyper-V 可以解决启动慢的问题(开机即启动),但无法解决占用资源高的问题。
与 Windows Sandbox 类似,Hyper-V 也需要手动开启。
比较
本节比较四种方案并给出推荐的使用场景。如有错误欢迎批评指正。
解决方案 | 优点 | 缺点 | 推荐使用场景 |
---|---|---|---|
WSL+Docker | 免费、启动快、轻量、方便打包 | 运行 Windows 应用极不方便 | 开发依赖复杂的应用,但开发时资源消耗不高 |
Windows Sandbox | 启动快、轻量 | 家庭版没有、持久化困难、配置选项少、前面讲的奇怪问题 | 临时运行需要管理员权限的应用 |
Sandboxie | 免费、启动快、轻量 | 隔离不彻底、配置困难 | 隔离不信任的软件,但需要良好的配置 |
虚拟机 | 完全隔离、配置灵活 | 启动慢、占用资源高 | 安全测试;消耗资源高的 Linux 开发;需要高度隔离的不信任软件 |