| ===== |
| D-Bus |
| ===== |
| |
| Introduction |
| ============ |
| |
| QEMU may be running with various helper processes involved: |
| - vhost-user* processes (gpu, virtfs, input, etc...) |
| - TPM emulation (or other devices) |
| - user networking (slirp) |
| - network services (DHCP/DNS, samba/ftp etc) |
| - background tasks (compression, streaming etc) |
| - client UI |
| - admin & cli |
| |
| Having several processes allows stricter security rules, as well as |
| greater modularity. |
| |
| While QEMU itself uses QMP as primary IPC (and Spice/VNC for remote |
| display), D-Bus is the de facto IPC of choice on Unix systems. The |
| wire format is machine friendly, good bindings exist for various |
| languages, and there are various tools available. |
| |
| Using a bus, helper processes can discover and communicate with each |
| other easily, without going through QEMU. The bus topology is also |
| easier to apprehend and debug than a mesh. However, it is wise to |
| consider the security aspects of it. |
| |
| Security |
| ======== |
| |
| A QEMU D-Bus bus should be private to a single VM. Thus, only |
| cooperative tasks are running on the same bus to serve the VM. |
| |
| D-Bus, the protocol and standard, doesn't have mechanisms to enforce |
| security between peers once the connection is established. Peers may |
| have additional mechanisms to enforce security rules, based for |
| example on UNIX credentials. |
| |
| The daemon can control which peers can send/recv messages using |
| various metadata attributes, however, this is alone is not generally |
| sufficient to make the deployment secure. The semantics of the actual |
| methods implemented using D-Bus are just as critical. Peers need to |
| carefully validate any information they received from a peer with a |
| different trust level. |
| |
| dbus-daemon policy |
| ------------------ |
| |
| dbus-daemon can enforce various policies based on the UID/GID of the |
| processes that are connected to it. It is thus a good idea to run |
| helpers as different UID from QEMU and set appropriate policies. |
| |
| Depending on the use case, you may choose different scenarios: |
| |
| - Everything the same UID |
| |
| - Convenient for developers |
| - Improved reliability - crash of one part doesn't take |
| out entire VM |
| - No security benefit over traditional QEMU, unless additional |
| unless additional controls such as SELinux or AppArmor are |
| applied |
| |
| - Two UIDs, one for QEMU, one for dbus & helpers |
| |
| - Moderately improved user based security isolation |
| |
| - Many UIDs, one for QEMU one for dbus and one for each helpers |
| |
| - Best user based security isolation |
| - Complex to manager distinct UIDs needed for each VM |
| |
| For example, to allow only ``qemu`` user to talk to ``qemu-helper`` |
| ``org.qemu.Helper1`` service, a dbus-daemon policy may contain: |
| |
| .. code:: xml |
| |
| <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 can also perform SELinux checks based on the security |
| context of the source and the target. For example, ``virtiofs_t`` |
| could be allowed to send a message to ``svirt_t``, but ``virtiofs_t`` |
| wouldn't be allowed to send a message to ``virtiofs_t``. |
| |
| See dbus-daemon man page for details. |
| |
| Guidelines |
| ========== |
| |
| When implementing new D-Bus interfaces, it is recommended to follow |
| the "D-Bus API Design Guidelines": |
| https://dbus.freedesktop.org/doc/dbus-api-design.html |
| |
| The "org.qemu.*" prefix is reserved for services implemented & |
| distributed by the QEMU project. |
| |
| QEMU Interfaces |
| =============== |
| |
| :doc:`dbus-vmstate` |