mirror of
https://github.com/QubesOS/qubes-doc.git
synced 2024-12-18 20:24:42 -05:00
442 lines
15 KiB
ReStructuredText
442 lines
15 KiB
ReStructuredText
============================
|
||
Qube configuration interface
|
||
============================
|
||
|
||
|
||
Qubes VM have some settings set by dom0 based on VM settings. There are
|
||
multiple configuration channels, which includes:
|
||
|
||
- QubesDB
|
||
|
||
- XenStore (in Qubes 2, data the same as in QubesDB, keys without
|
||
leading ``/``)
|
||
|
||
- Qubes RPC (called at VM startup, or when configuration changed)
|
||
|
||
- GUI protocol
|
||
|
||
|
||
|
||
QubesDB
|
||
-------
|
||
|
||
|
||
Keys exposed by dom0 to VM
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
|
||
|
||
- ``/qubes-vm-type`` - VM type, the same as ``type`` field in
|
||
``qvm-prefs``. One of ``AppVM``, ``ProxyVM``, ``NetVM``,
|
||
``TemplateVM``, ``HVM``, ``TemplateHVM``
|
||
|
||
- ``/qubes-vm-updatable`` - flag whether VM is updatable (whether
|
||
changes in root.img will survive VM restart). One of ``True``,
|
||
``False``
|
||
|
||
- ``/qubes-vm-persistence`` - what data do persist between VM restarts:
|
||
|
||
- ``full`` - all disks
|
||
|
||
- ``rw-only`` - only ``/rw`` disk
|
||
|
||
- ``none`` - none
|
||
|
||
|
||
|
||
- ``/qubes-timezone`` - name of timezone based on dom0 timezone. For
|
||
example ``Europe/Warsaw``
|
||
|
||
- ``/qubes-keyboard`` (deprecated in R4.1) - keyboard layout based on
|
||
dom0 layout. Its syntax is suitable for ``xkbcomp`` command (after
|
||
expanding escape sequences like ``\n`` or ``\t``). This is meant only
|
||
as some default value, VM can ignore this option and choose its own
|
||
keyboard layout (this is what keyboard setting from Qubes Manager
|
||
does). This entry is created as part of gui-daemon initialization (so
|
||
not available when gui-daemon disabled, or not started yet).
|
||
|
||
- ``/keyboard-layout`` - keyboard layout based on GuiVM layout. Its
|
||
syntax can be ``layout+variant+options``, ``layout+variant``,
|
||
``layout++options`` or simply ``layout``. For example, ``fr+oss``,
|
||
``pl++compose:caps`` or ``fr``. This is meant only as some default
|
||
value, VM can ignore this option and choose its own keyboard layout
|
||
(this is what keyboard setting from Qubes Manager does).
|
||
|
||
- ``/qubes-debug-mode`` - flag whether VM has debug mode enabled
|
||
(qvm-prefs setting). One of ``1``, ``0``
|
||
|
||
- ``/qubes-service/SERVICE_NAME`` - subtree for VM services controlled
|
||
from dom0 (using the ``qvm-service`` command or Qubes Manager). One
|
||
of ``1``, ``0``. Note that not every service will be listed here, if
|
||
entry is missing, it means “use VM default”. A list of currently
|
||
supported services is in the ``qvm-service`` man page.
|
||
|
||
- ``/qubes-netmask`` - network mask (only when VM has netvm set);
|
||
currently hardcoded “255.255.255.0”
|
||
|
||
- ``/qubes-ip`` - IP address for this VM (only when VM has netvm set)
|
||
|
||
- ``/qubes-gateway`` - default gateway IP (only when VM has netvm set);
|
||
VM should add host route to this address directly via eth0 (or
|
||
whatever default interface name is)
|
||
|
||
- ``/qubes-primary-dns`` - primary DNS address (only when VM has netvm
|
||
set)
|
||
|
||
- ``/qubes-secondary-dns`` - secondary DNS address (only when VM has
|
||
netvm set)
|
||
|
||
- ``/qubes-netvm-gateway`` - same as ``qubes-gateway`` in connected VMs
|
||
(only when VM serves as network backend - ProxyVM and NetVM)
|
||
|
||
- ``/qubes-netvm-netmask`` - same as ``qubes-netmask`` in connected VMs
|
||
(only when VM serves as network backend - ProxyVM and NetVM)
|
||
|
||
- ``/qubes-netvm-network`` - network address (only when VM serves as
|
||
network backend - ProxyVM and NetVM); can be also calculated from
|
||
qubes-netvm-gateway and qubes-netvm-netmask
|
||
|
||
- ``/qubes-netvm-primary-dns`` - same as ``qubes-primary-dns`` in
|
||
connected VMs (only when VM serves as network backend - ProxyVM and
|
||
NetVM); traffic sent to this IP on port 53 should be redirected to
|
||
primary DNS server
|
||
|
||
- ``/qubes-netvm-secondary-dns`` - same as ``qubes-secondary-dns`` in
|
||
connected VMs (only when VM serves as network backend - ProxyVM and
|
||
NetVM); traffic sent to this IP on port 53 should be redirected to
|
||
secondary DNS server
|
||
|
||
- ``/guivm-windows-prefix`` - title prefix for any window not
|
||
originating from another qube. This means windows of applications
|
||
running in GuiVM itself
|
||
|
||
|
||
|
||
Firewall rules in 3.x
|
||
^^^^^^^^^^^^^^^^^^^^^
|
||
|
||
|
||
QubesDB is also used to configure firewall in ProxyVMs. Rules are stored
|
||
in separate key for each target VM. Entries:
|
||
|
||
- ``/qubes-iptables`` - control entry - dom0 writing ``reload`` here
|
||
signals ``qubes-firewall`` service to reload rules
|
||
|
||
- ``/qubes-iptables-header`` - rules not related to any particular VM,
|
||
should be applied before domains rules
|
||
|
||
- ``/qubes-iptables-domainrules/NNN`` - rules for domain ``NNN``
|
||
(arbitrary number) in ``iptables-save`` format. Rules are
|
||
self-contained - fill ``FORWARD`` iptables chain and contains all
|
||
required matches (source IP address etc), as well as final default
|
||
action (``DROP``/``ACCEPT``)
|
||
|
||
|
||
|
||
VM after applying rules may signal some error, writing a message to
|
||
``/qubes-iptables-error`` key. This does not exclude any other way of
|
||
communicating problems - like a popup.
|
||
|
||
Firewall rules in 4.x
|
||
^^^^^^^^^^^^^^^^^^^^^
|
||
|
||
|
||
QubesDB is also used to configure firewall in ProxyVMs. Each rule is
|
||
stored as a separate entry, grouped on target VM:
|
||
|
||
- ``/qubes-firewall/SOURCE_IP`` - base tree under which rules are
|
||
placed. All rules there should be applied to filter traffic coming
|
||
from ``SOURCE_IP``. This can be either IPv4 or IPv6 address. Dom0
|
||
will do an empty write to this top level entry after finishing rules
|
||
update, so VM can setup a watch here to trigger rules reload.
|
||
|
||
- ``/qubes-firewall/SOURCE_IP/policy`` - default action if no rule
|
||
matches: ``drop`` or ``accept``.
|
||
|
||
- ``/qubes-firewall/SOURCE_IP/NNNN`` - rule number ``NNNN`` - decimal
|
||
number, padded with zeros. Se below for rule format. All the rules
|
||
should be applied in order of rules implied by those numbers. Note
|
||
that QubesDB itself does not impose any ordering (you need to sort
|
||
the rules after retrieving them). The first rule has number ``0000``.
|
||
|
||
|
||
|
||
Each rule is a single QubesDB entry, consisting of pairs ``key=value``
|
||
separated by space. QubesDB enforces limit on a single entry length -
|
||
3072 bytes. Possible options for a single rule:
|
||
|
||
- ``action``, values: ``accept``, ``drop``; this is present in every
|
||
rule
|
||
|
||
- ``dst4``, value: destination IPv4 address with a mask; for example:
|
||
``192.168.0.0/24``
|
||
|
||
- ``dst6``, value: destination IPv6 address with a mask; for example:
|
||
``2000::/3``
|
||
|
||
- ``dsthost``, value: DNS hostname of destination host
|
||
|
||
- ``proto``, values: ``tcp``, ``udp``, ``icmp``
|
||
|
||
- ``specialtarget``, value: One of predefined target, currently defined
|
||
values:
|
||
|
||
- ``dns`` - such option should match DNS traffic to default DNS
|
||
server (but not any DNS server), on both TCP and UDP
|
||
|
||
|
||
|
||
- ``dstports``, value: destination ports range separated with ``-``,
|
||
valid only together with ``proto=tcp`` or ``proto=udp``; for example
|
||
``1-1024``, ``80-80``
|
||
|
||
- ``icmptype``, value: numeric (decimal) icmp message type, for example
|
||
``8`` for echo request, valid only together with ``proto=icmp``
|
||
|
||
- ``dpi``, value: Deep Packet Inspection protocol (like: HTTP, SSL,
|
||
SMB, SSH, SMTP) or the default ‘NO’ as no DPI, only packet filtering
|
||
|
||
|
||
|
||
Options must appear in the rule in the order listed above. Duplicated
|
||
options are forbidden.
|
||
|
||
A rule matches only when all predicates match. Only one of ``dst4``,
|
||
``dst6`` or ``dsthost`` can be used in a single rule.
|
||
|
||
If tool applying firewall encounters any parse error (unknown option,
|
||
invalid value, duplicated option, etc), it should drop all the traffic
|
||
coming from that ``SOURCE_IP``, regardless of properly parsed rules.
|
||
|
||
Example valid rules:
|
||
|
||
- ``action=accept dst4=8.8.8.8 proto=udp dstports=53-53``
|
||
|
||
- ``action=drop dst6=2a00:1450:4000::/37 proto=tcp``
|
||
|
||
- ``action=accept specialtarget=dns``
|
||
|
||
- ``action=drop proto=tcp specialtarget=dns`` - drop DNS queries sent
|
||
using TCP
|
||
|
||
- ``action=drop``
|
||
|
||
|
||
|
||
Keys set by VM for passing info to dom0
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
|
||
|
||
- ``memory/meminfo`` (**xenstore**) - used memory (updated by
|
||
qubes-meminfo-writer), input information for qmemman;
|
||
|
||
- Qubes 3.x format: 6 lines (EOL encoded as ``\n``), each in format
|
||
“FIELD: VALUE kB”; fields: ``MemTotal``, ``MemFree``, ``Buffers``,
|
||
``Cached``, ``SwapTotal``, ``SwapFree``; meaning the same as in
|
||
``/proc/meminfo`` in Linux.
|
||
|
||
- Qubes 4.0+ format: used memory size in the VM, in kbytes
|
||
|
||
|
||
|
||
- ``/qubes-block-devices`` - list of block devices exposed by this VM,
|
||
each device (subdirectory) should be named in a way that VM can
|
||
attach the device based on it. Each should contain these entries:
|
||
|
||
- ``desc`` - device description (ASCII text)
|
||
|
||
- ``size`` - device size in bytes
|
||
|
||
- ``mode`` - default connection mode; ``r`` for read-only, ``w`` for
|
||
read-write
|
||
|
||
|
||
|
||
- ``/qubes-usb-devices`` - list of USB devices exposed by this VM, each
|
||
device (subdirectory) should contain:
|
||
|
||
- ``desc`` - device description (ASCII text)
|
||
|
||
- ``usb-ver`` - USB version (1, 2 or 3)
|
||
|
||
|
||
|
||
|
||
|
||
Qubes RPC
|
||
---------
|
||
|
||
|
||
Services called by dom0 to provide some VM configuration:
|
||
|
||
- ``qubes.SetMonitorLayout`` - provide list of monitors, one per line.
|
||
Each line contains four numbers:
|
||
``width height X Y width_mm height_mm`` (physical dimensions -
|
||
``width_mm`` and ``height_mm`` - are optional)
|
||
|
||
- ``qubes.WaitForSession`` - called to wait for full VM startup
|
||
|
||
- ``qubes.GetAppmenus`` - receive appmenus from given VM (template);
|
||
TODO: describe format here
|
||
|
||
- ``qubes.GetImageRGBA`` - receive image/application icon. Protocol:
|
||
|
||
1. Caller sends name of requested icon. This can be one of:
|
||
|
||
|
||
|
||
- ``xdgicon:NAME`` - search for NAME in standard icons theme
|
||
|
||
- ``-`` - get icon data from stdin (the caller), can be prefixed
|
||
with format name, for example ``png:-``
|
||
|
||
- file name
|
||
|
||
|
||
|
||
2. The service responds with image dimensions: width and height as
|
||
decimal numbers, separated with space and with EOL marker at the
|
||
and; then image data in RGBA format (32 bits per pixel)
|
||
|
||
|
||
|
||
|
||
|
||
- ``qubes.SetDateTime`` - set VM time, called periodically by dom0 (can
|
||
be triggered manually from dom0 by calling ``qvm-sync-clock``). The
|
||
service receives one line at stdin - time in format of
|
||
``date -u -Iseconds``, for example ``2015-07-31T16:10:43+0000``.
|
||
|
||
- ``qubes.SetGuiMode`` - called in HVM to switch between fullscreen and
|
||
seamless GUI mode. The service receives a single word on stdin -
|
||
either ``FULLSCREEN`` or ``SEAMLESS``
|
||
|
||
- ``qubes.ResizeDisk`` - called to inform that underlying disk was
|
||
resized. Name of disk image is passed on standard input (``root``,
|
||
``private``, ``volatile``, or other). This is used starting with
|
||
Qubes 4.0.
|
||
|
||
|
||
|
||
Other Qrexec services installed by default:
|
||
|
||
- ``qubes.Backup`` - store Qubes backup. The service receives location
|
||
chosen by the user (one line, terminated by ``\n``), the backup
|
||
archive (:doc:`description of backup format </user/how-to-guides/backup-emergency-restore-v2>`)
|
||
|
||
- ``qubes.DetachPciDevice`` - service called in reaction to
|
||
``qvm-pci -d`` call on running VM. The service receives one word -
|
||
BDF of device to detach. When the service call ends, the device will
|
||
be detached
|
||
|
||
- ``qubes.Filecopy`` - receive some files from other VM. Files sent in
|
||
:doc:`qfile format </developer/services/qfilecopy>`
|
||
|
||
- ``qubes.OpenInVM`` - open a file in called VM. Service receives a
|
||
single file on stdin (in :doc:`qfile format </developer/services/qfilecopy>`. After a
|
||
file viewer/editor is terminated, if the file was modified, can be
|
||
sent back (just raw content, without any headers); otherwise service
|
||
should just terminate without sending anything. This service is used
|
||
by both ``qvm-open-in-vm`` and ``qvm-open-in-dvm`` tools. When called
|
||
in DispVM, service termination will trigger DispVM cleanup.
|
||
|
||
- ``qubes.Restore`` - retrieve Qubes backup. The service receives
|
||
backup location entered by the user (one line, terminated by ``\n``),
|
||
then should output backup archive in :doc:`qfile format </developer/services/qfilecopy>` (core-agent-linux component contains
|
||
``tar2qfile`` utility to do the conversion)
|
||
|
||
- ``qubes.SelectDirectory``, ``qubes.SelectFile`` - services which
|
||
should show file/directory selection dialog and return (to stdout) a
|
||
single line containing selected path, or nothing in the case of
|
||
cancellation
|
||
|
||
- ``qubes.SuspendPre`` - service called in every VM with PCI device
|
||
attached just before system suspend
|
||
|
||
- ``qubes.SuspendPost`` - service called in every VM with PCI device
|
||
attached just after system resume
|
||
|
||
- ``qubes.SyncNtpClock`` - service called to trigger network time
|
||
synchronization. Service should synchronize local VM time and
|
||
terminate when done.
|
||
|
||
- ``qubes.WindowIconUpdater`` - service called by VM to send icons of
|
||
individual windows. The protocol there is simple one direction
|
||
stream: VM sends window ID followed by icon in ``qubes.GetImageRGBA``
|
||
format, then next window ID etc. VM can send icon for the same window
|
||
multiple times to replace previous one (for example for animated
|
||
icons)
|
||
|
||
- ``qubes.VMShell`` - call any command in the VM; the command(s) is
|
||
passed one per line
|
||
|
||
- ``qubes.VMShell+WaitForSession`` waits for full VM startup first
|
||
|
||
|
||
|
||
- ``qubes.VMExec`` - call any command in the VM, without using shell,
|
||
the command needs to be passed as argument and encoded as follows:
|
||
|
||
- the executable name and arguments are separated by ``+``
|
||
|
||
- everything except alphanumeric characters, ``.`` and ``_`` needs
|
||
to be escaped
|
||
|
||
- bytes are escaped as ``-HH`` (where ``HH`` is hex code, capital
|
||
letters only)
|
||
|
||
- ``-`` itself can be escaped as ``--``
|
||
|
||
- example: to run ``ls -a /home/user``, use
|
||
``qubes.VMExec+ls+--a+-2Fhome-2Fuser``
|
||
|
||
|
||
|
||
- ``qubes.VMExecGUI`` - a variant of ``qubes.VMExec`` that waits for
|
||
full VM startup first
|
||
|
||
|
||
|
||
Services called in GuiVM:
|
||
|
||
- ``policy.Ask``, ``policy.Notify`` - confirmation prompt and
|
||
notifications for Qubes RPC calls, see :ref:`qrexec-policy implementation <developer/services/qrexec-internals:\`\`qrexec-policy\`\` implementation>`
|
||
for a detailed description.
|
||
|
||
|
||
|
||
Currently Qubes still calls few tools in VM directly, not using service
|
||
abstraction. This will change in the future. Those tools are:
|
||
|
||
- ``/usr/lib/qubes/qubes-download-dom0-updates.sh`` - script to
|
||
download updates (or new packages to be installed) for dom0
|
||
(``qubes-dom0-update`` tool)
|
||
|
||
- ``date -u -Iseconds`` - called directly to retrieve time after
|
||
calling ``qubes.SyncNtpClock`` service (``qvm-sync-clock`` tool)
|
||
|
||
- ``nm-online -x`` - called before ``qubes.SyncNtpClock`` service call
|
||
by ``qvm-sync-clock`` tool
|
||
|
||
- ``resize2fs`` - called to resize filesystem on /rw partition by
|
||
``qvm-grow-private`` tool
|
||
|
||
- ``gpk-update-viewer`` - called by Qubes Manager to display available
|
||
updates in a TemplateVM
|
||
|
||
- ``systemctl start qubes-update-check.timer`` (and similarly stop) -
|
||
called when enabling/disabling updates checking in given VM
|
||
(``qubes-update-check`` :doc:`qvm-service </user/advanced-topics/qubes-service>`)
|
||
|
||
|
||
|
||
Additionally, automatic tests extensively run various commands directly
|
||
in VMs. We do not plan to change that.
|
||
|
||
GUI protocol
|
||
------------
|
||
|
||
|
||
GUI initialization includes passing the whole screen dimensions from
|
||
dom0 to VM. This will most likely be overwritten by
|
||
qubes.SetMonitorLayout Qubes RPC call.
|