| ===== | 
 | 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` | 
 |  | 
 | :doc:`dbus-display` |