D-Bus
简介
QEMU 可能同时使用多种辅助进程:
vhost-user*,如 GPU、virtfs、输入等。
TPM 或其他设备仿真。
用户网络 slirp。
DHCP/DNS、samba/ftp 等网络服务。
压缩、流式传输等后台任务。
客户端界面。
管理与命令行工具。
多进程可采用更严格的安全规则,也提高模块化程度。
QEMU 自身主要使用 QMP 进行进程间通信,并用 Spice/VNC 远程显示, 而 D-Bus 是 Unix 系统事实上的常用 IPC。 其线路格式适合机器处理,有多语言绑定和多种工具。
总线让辅助进程无需经 QEMU 中转即可相互发现和通信, 拓扑也比网状连接更易理解和调试,但仍须考虑安全。
安全
QEMU 的 D-Bus 总线应为单个虚拟机私有, 这样同一总线上仅运行共同服务于该虚拟机的协作任务。
D-Bus 协议和标准本身不提供连接建立后强制隔离对等端的机制。 各端可以另外实施基于 UNIX 凭据等的安全规则。
守护进程可按多种元数据属性控制谁能收发消息,但单靠这一点通常不足以保证安全。 D-Bus 方法本身的语义同样关键,各端必须仔细验证来自不同信任级别对等端的信息。
dbus-daemon 策略
dbus-daemon 可根据连接进程的 UID/GID 实施策略。 因此建议辅助程序使用不同于 QEMU 的 UID,并设置相应规则。
可按使用场景选择:
全部使用相同 UID。
便于开发。
可靠性更好,一部分崩溃不会导致整个虚拟机退出。
除非另加 SELinux 或 AppArmor 等控制,否则不比传统 QEMU 更安全。
两个 UID:QEMU 一个,D-Bus 与辅助程序共用另一个。
基于用户的隔离得到适度改善。
多个 UID:QEMU、D-Bus 和每个辅助程序各用一个。
基于用户的隔离最强。
管理每个虚拟机所需的独立 UID 更复杂。
例如,只允许 qemu 用户与 qemu-helper 的 org.qemu.Helper1 服务通信,策略可包含:
<policy user="qemu">
<allow send_destination="org.qemu.Helper1"/>
<allow receive_sender="org.qemu.Helper1"/>
</policy>
<policy user="qemu-helper">
<allow own="org.qemu.Helper1"/>
</policy>
dbus-daemon 也能根据来源和目标安全上下文执行 SELinux 检查。 例如,允许 virtiofs_t 向 svirt_t 发消息,却不允许 virtiofs_t 向 virtiofs_t 发消息。
详情见 dbus-daemon 手册页。
指南
实现新接口时,建议遵循 D-Bus API 设计指南: https://dbus.freedesktop.org/doc/dbus-api-design.html
org.qemu.* 前缀保留给 QEMU 项目实现和分发的服务。