[SPICE-0003] 杂谈:完全在虚拟机中进行各种操作是否可行?
TL;DR: 在各种技术的帮助下,把自己在电脑上的大部分动作都放在各个虚拟机中似乎是可行的。接下来就该对付各种检测虚拟机的手段了……
在 QQ 和火绒安全的共同努力下(大误)(链接指向的是知乎上的讨论),中国产软件读取其他软件的文件的问题(例如浏览器历史记录,其它软件的配置文件什么的)被揭开了冰山一角。(嘛,“中国人喜欢用隐私换取便利”是呗……)之后其他各种软件也不甘落后的被扒了出来……
- 似乎 Windows 10 的 QQ 桌面版也没有幸免的样子。
- 如果并不想那么麻烦的话,像上面那样利用好安全软件的限制访问功能似乎也可行。(当然保护效果有多少也有待验证)
- 还有隔壁微信一边说保护用户隐私要做输入法,一边读取用户浏览器,哈哈哈哈哈.jpg
虚拟机前来搭救……是吗?
也许吧,至少应对上面那个问题虚拟机应该是没问题。把需要特别关注的软件单独装进一个虚拟机里,它就轻易读取不到汝主机(或者其他虚拟机)上的文件了。除非汝用共享文件夹之类的方法显式地让它看,或者它用到了可能性略小的虚拟机逃逸漏洞穿出来了。
理论和实践的区别
在理论上是没有的,在实践上却是有的(笑),就咱目前的经历(?)来说,想要把所有的操作都装进一个个虚拟机里的话,还要解决的问题有三个:
- 虚拟设备的性能问题,其实基本上都是虚拟显卡的性能在某些场合可能不够用(例如玩最近的新游戏)。
- 像 VMware VirtualBox 之类的虚拟机软件可以共享主机的 USB 设备,那别的呢?(嗯……例如 PCI-E 接口上的声卡、网卡或者别的扩展卡什么的)
- 有些软件会通过像是列举驱动或者软件列表、查询CPU等硬件的型号等等形式检测自己是不是在虚拟机里,然后做出不同的反应(例如某些监考软件拒绝在虚拟机中运行)。
幸运的是在某些条件下,这些问题能部分被解决。
IOMMU - 为虚拟机和主机架起一座桥
在计算机领域,输入输出内存管理单元(英语:input–output memory management unit,缩写IOMMU)是一种内存管理单元(MMU),它将具有直接存储器访问能力(可以DMA)的I/O总线连接至主内存。如传统的MMU(将CPU可见的虚拟地址转换为物理地址)一样,IOMMU将设备可见的虚拟地址(在此上下文中也称设备地址或I/O地址)映射到物理地址。部分单元还提供内存保护功能,防止故障或恶意的设备。
在虚拟机中的“物理地址”对于主机来说其实也是虚拟的,它不一定总是和主机的物理地址相同。为了防止虚拟机直接拿自己的物理地址操作主机设备把主机的内存搞得天翻地覆(?),IOMMU 便会介入其中,把主机的物理地址“翻译“成虚拟机的物理地址。
早期的虚拟化 IOMMU 是由虚拟机软件或操作系统来负责的,这就带来了延迟问题。后来 Intel 和 AMD 都在自己的 CPU 上集成了相应的技术来解决延迟问题。Intel 的叫做 Intel® Virtualization Technology for Directed I/O (定向 I/O 虚拟化技术,简称 VT-d),而 AMD 的叫做 AMD-Vi 。
有了 VT-d 和 AMD-Vi 以后,就有机会搞一些神奇的操作了。例如把显卡等设备直接整个让给虚拟机使用等等。能够一定程度上提升虚拟机的图形性能。
最简单的规划 - Qubes OS
当然不只有咱这么想过,于是就有那么一群人把这种想法付诸实践做出来了 Qubes OS。
Qubes OS 的核心思想便是 security by compartmentalization (实在想不出哪个翻译比较贴切的样子),汝可以把汝自己的线上身份划分成不同的范围,例如工作、生活、财务和秘密等等。接下来汝可以给不同的范围进行不同的设定(例如安装不同的软件,连接不同的网络等等),因为它们分别在不同的虚拟机上运行,所以即使某一个被入侵,汝剩下的部分应该还是安全的。
当然,作为以安全性为目标的 GNU/Linux 发行版(虽然它们更愿意称自己作“Xen 发行版”)。并不是所有人都能适应它的某些特性,例如肯定有谁其实只是想运行一把 Windows 的虚拟机什么的。以及……
如果汝对这样的方法有兴趣的话,可以到它们的网站 https://www.qubes-os.org/doc/ 阅读相关的文档。
Plan B - 自行规划
如果汝想自己策划一套比 Qubes 稍微轻松一点的方案的话,有这么几点需要考虑。
- 虚拟机里运行啥操作系统?
例如汝是要用 Windows 玩游戏还是某种 GNU/Linux 发行版上进行 GPGPU(图形处理器通用计算) 啥的。
- 想以啥方式连接到虚拟机?
如果是在电脑前操作的话,那还是要一个 Host OS 搭配虚拟机软件。例如各种 GNU/Linux 发行版搭配 QEMU/KVM 或者 Windows 搭配 Hyper-V 这样的。
以某种 GNU/Linux 发行版作为 Host OS 的话还可以考虑为运行虚拟机进行各种调整,像是安装轻量化的桌面环境或者窗口管理器,裁剪内核等等。
如果只打算远程访问(VNC、SSH 和 RDP 等等),那可以考虑某个 Type 1 Hypervisor。例如 Proxmox PVE ,VMware ESXi 等等。
- 规划硬件
因为绝大多数的 Passthrough 都是独占访问,就是除了那台正在使用的虚拟机以外其它的虚拟机和主机都没法使用。(Hyper-V 那个离散设备分配可能不是独占的?)于是最好给主机留下可以备用的硬件,例如双显卡的笔记本可以把独立显卡独占给虚拟机使用,台式机就多插几块显卡这样?
咱觉得大概就这样了吧,如果汝有啥想法的话也欢迎和咱一起讨论。