2014-07-30 02:16:37 -04:00
|
|
|
|
---
|
2021-03-13 13:06:18 -05:00
|
|
|
|
lang: en
|
2015-04-10 16:17:45 -04:00
|
|
|
|
layout: doc
|
2021-06-16 22:56:25 -04:00
|
|
|
|
permalink: /doc/templates/
|
2015-10-11 03:04:59 -04:00
|
|
|
|
redirect_from:
|
2018-05-23 20:58:13 -04:00
|
|
|
|
- /doc/template/
|
2015-10-28 18:14:40 -04:00
|
|
|
|
- /en/doc/templates/
|
2015-10-11 03:04:59 -04:00
|
|
|
|
- /doc/Templates/
|
|
|
|
|
- /wiki/Templates/
|
2021-03-13 13:06:18 -05:00
|
|
|
|
ref: 131
|
2021-06-17 07:23:57 -04:00
|
|
|
|
title: Templates
|
2014-07-30 02:16:37 -04:00
|
|
|
|
---
|
|
|
|
|
|
2021-07-03 06:46:27 -04:00
|
|
|
|
In [Getting Started](/doc/getting-started/), we covered the distinction
|
2021-06-20 23:03:48 -04:00
|
|
|
|
in Qubes OS between where you *install* your software and where you *run* your
|
|
|
|
|
software. Your software is installed in [templates](/doc/glossary/#template).
|
|
|
|
|
Each template shares its root filesystem (i.e., all of its programs and system
|
|
|
|
|
files) with all the qubes based on it. [App qubes](/doc/glossary/#app-qube) are
|
|
|
|
|
where you run your software and store your data.
|
2019-09-02 05:34:26 -04:00
|
|
|
|
|
2021-06-18 04:22:23 -04:00
|
|
|
|
The template system has significant benefits:
|
2019-09-02 05:34:26 -04:00
|
|
|
|
|
2021-06-20 23:03:48 -04:00
|
|
|
|
* **Security:** Each qube has read-only access to the template on which it's
|
|
|
|
|
based, so if a qube is compromised, it cannot infect its template or any of
|
|
|
|
|
the other qubes based on that template.
|
|
|
|
|
|
|
|
|
|
* **Storage:** Each qube based on a template uses only the disk space required
|
|
|
|
|
to store its own data (i.e., your files in its home directory), which
|
|
|
|
|
dramatically saves on disk space.
|
|
|
|
|
|
|
|
|
|
* **Speed:** It is extremely fast to create new app qubes, since the root
|
|
|
|
|
filesystem already exists in the template.
|
2019-09-02 05:34:26 -04:00
|
|
|
|
|
2021-06-20 23:03:48 -04:00
|
|
|
|
* **Updates:** Updates are naturally centralized, since updating a template
|
|
|
|
|
means that all qubes based on it will automatically use those updates after
|
|
|
|
|
they're restarted.
|
2019-09-02 05:34:26 -04:00
|
|
|
|
|
2021-06-20 23:03:48 -04:00
|
|
|
|
An important side effect of this system is that any software installed in an
|
|
|
|
|
app qube (rather than in the template on which it is based) will disappear
|
|
|
|
|
after the app qube reboots (see [Inheritance and
|
|
|
|
|
Persistence](#inheritance-and-persistence)). For this reason, we recommend
|
|
|
|
|
installing most of your software in templates, not app qubes.
|
|
|
|
|
|
|
|
|
|
The default template in Qubes is based on Fedora, but there are additional
|
|
|
|
|
templates based on other Linux distributions. There are also templates
|
|
|
|
|
available with or without certain software preinstalled. You may find it useful
|
|
|
|
|
to have multiple templates installed in order to provide:
|
2017-04-17 12:14:19 -04:00
|
|
|
|
|
2021-03-13 12:03:23 -05:00
|
|
|
|
* Different security levels (e.g., more or less trusted software installed)
|
|
|
|
|
* Different environments (e.g., Fedora, Debian, Whonix)
|
|
|
|
|
* Different tools (e.g., office, media, development, hardware drivers)
|
2018-06-12 22:50:03 -04:00
|
|
|
|
|
2019-09-02 05:34:26 -04:00
|
|
|
|
## Official
|
2019-04-06 19:44:36 -04:00
|
|
|
|
|
2021-06-20 23:03:48 -04:00
|
|
|
|
These are the official Qubes OS Project templates. We build and release updates
|
|
|
|
|
for these templates. We guarantee that the binary updates are compiled from
|
|
|
|
|
exactly the same source code as we publish.
|
2019-04-06 19:44:36 -04:00
|
|
|
|
|
2021-04-10 18:09:05 -04:00
|
|
|
|
* [Fedora](/doc/templates/fedora/) (default)
|
|
|
|
|
* [Fedora Minimal](/doc/templates/minimal/)
|
|
|
|
|
* [Fedora Xfce](/doc/templates/xfce)
|
|
|
|
|
* [Debian](/doc/templates/debian/)
|
|
|
|
|
* [Debian Minimal](/doc/templates/minimal/)
|
2019-04-06 19:44:36 -04:00
|
|
|
|
|
2019-09-02 05:34:26 -04:00
|
|
|
|
## Community
|
2019-04-06 19:44:36 -04:00
|
|
|
|
|
2021-06-20 23:03:48 -04:00
|
|
|
|
These templates are supported by the Qubes community. Some of them are
|
|
|
|
|
available in ready-to-use binary package form (built by the Qubes developers),
|
|
|
|
|
while others are available only in source code form. In all cases, the Qubes OS
|
|
|
|
|
Project does not provide updates for these templates. However, such updates may
|
|
|
|
|
be provided by the template maintainer.
|
2019-04-06 19:44:36 -04:00
|
|
|
|
|
2021-06-20 23:03:48 -04:00
|
|
|
|
By installing these templates, you are trusting not only the Qubes developers
|
|
|
|
|
and the distribution maintainers, but also the template maintainer. In
|
|
|
|
|
addition, these templates may be somewhat less stable, since the Qubes
|
|
|
|
|
developers do not test them.
|
2019-04-06 19:44:36 -04:00
|
|
|
|
|
2021-04-10 18:09:05 -04:00
|
|
|
|
* [Whonix](/doc/templates/whonix/)
|
|
|
|
|
* [Ubuntu](/doc/templates/ubuntu/)
|
|
|
|
|
* [Arch Linux](/doc/building-archlinux-template/)
|
|
|
|
|
* [CentOS](/doc/templates/centos/)
|
|
|
|
|
* [CentOS Minimal](/doc/templates/minimal/)
|
|
|
|
|
* [Gentoo](/doc/templates/gentoo/)
|
|
|
|
|
* [Gentoo Minimal](/doc/templates/minimal/)
|
2019-04-06 19:44:36 -04:00
|
|
|
|
|
2019-09-02 05:34:26 -04:00
|
|
|
|
## Installing
|
2019-04-06 19:44:36 -04:00
|
|
|
|
|
2021-06-20 23:03:48 -04:00
|
|
|
|
Certain templates come preinstalled with Qubes OS. However, there may be times
|
|
|
|
|
when you wish to install a fresh template from the Qubes repositories, e.g.:
|
2019-04-06 19:44:36 -04:00
|
|
|
|
|
2021-06-20 23:03:48 -04:00
|
|
|
|
* When a template version you're using reaches
|
2021-07-05 09:09:42 -04:00
|
|
|
|
[end-of-life](/doc/how-to-update/#upgrading-to-avoid-eol).
|
2021-06-20 23:03:48 -04:00
|
|
|
|
* When a new version of a template that you wish to use becomes
|
2021-07-10 17:25:29 -04:00
|
|
|
|
[supported](/doc/supported-releases/).
|
2021-06-18 04:22:23 -04:00
|
|
|
|
* When you suspect your template has been compromised.
|
|
|
|
|
* When you have made modifications to your template that you no longer want.
|
2018-06-12 22:50:03 -04:00
|
|
|
|
|
2023-06-06 11:09:23 -04:00
|
|
|
|
You can use a command line tool - `qvm-template` - or a GUI - `qvm-template-gui`.
|
2018-06-12 22:50:03 -04:00
|
|
|
|
|
2023-06-06 11:09:23 -04:00
|
|
|
|
At the command line in dom0, `qvm-template list --available` will show available templates. To install a template, use:
|
2021-03-13 12:03:23 -05:00
|
|
|
|
```
|
2023-06-06 11:09:23 -04:00
|
|
|
|
$ qvm-template install <template_name>
|
2021-03-13 12:03:23 -05:00
|
|
|
|
```
|
2018-06-12 22:50:03 -04:00
|
|
|
|
|
2023-06-06 11:09:23 -04:00
|
|
|
|
You can also use `qvm-template` to upgrade or reinstall templates.
|
2020-09-27 17:32:02 -04:00
|
|
|
|
|
2023-06-06 11:09:23 -04:00
|
|
|
|
Repo definitions are stored in `/etc/qubes/repo-templates` and associated keys in `/etc/qubes/repo-templates/keys`.
|
|
|
|
|
There are additional repos for testing releases and community templates.
|
|
|
|
|
To temporarily enable any of these repos, use the `--enablerepo=<repo-name>` option. E.g. :
|
2021-03-13 12:03:23 -05:00
|
|
|
|
```
|
2023-06-06 11:09:23 -04:00
|
|
|
|
$ qvm-template --enablerepo qubes-templates-community install <template_name>
|
2021-03-13 12:03:23 -05:00
|
|
|
|
```
|
2023-06-06 11:09:23 -04:00
|
|
|
|
To permanently enable a repo, set the line `enabled = 1` in the repo definition in `/etc/qubes/repo-templates`.
|
|
|
|
|
To permanently disable, set the line to `enabled = 0`.
|
2019-04-06 19:44:36 -04:00
|
|
|
|
|
2021-07-05 09:09:42 -04:00
|
|
|
|
If you wish to install a template that is in testing, please see
|
|
|
|
|
[here](/doc/testing/#templates).
|
|
|
|
|
|
2019-09-02 05:34:26 -04:00
|
|
|
|
## After Installing
|
|
|
|
|
|
2021-06-18 04:22:23 -04:00
|
|
|
|
After installing a fresh template, we recommend performing the following steps:
|
2019-09-02 05:34:26 -04:00
|
|
|
|
|
2021-06-18 04:22:23 -04:00
|
|
|
|
1. [Update the template](#updating).
|
2019-09-02 05:34:26 -04:00
|
|
|
|
|
2021-06-20 23:03:48 -04:00
|
|
|
|
2. [Switch any app qubes that are based on the old template to the new
|
|
|
|
|
one](#switching).
|
2019-09-02 05:34:26 -04:00
|
|
|
|
|
2021-06-18 04:22:23 -04:00
|
|
|
|
3. If desired, [uninstall the old template](#uninstalling).
|
2019-09-02 05:34:26 -04:00
|
|
|
|
|
2022-10-14 02:19:15 -04:00
|
|
|
|
## Network access
|
|
|
|
|
|
|
|
|
|
For information about how templates access the network, please see [Why don’t
|
|
|
|
|
templates have network
|
|
|
|
|
access?](/doc/how-to-install-software/#why-dont-templates-have-network-access)
|
|
|
|
|
and the [Updates proxy](/doc/how-to-install-software/#updates-proxy).
|
|
|
|
|
|
2019-09-02 05:34:26 -04:00
|
|
|
|
## Updating
|
|
|
|
|
|
2021-06-18 04:22:23 -04:00
|
|
|
|
Please see [How to Update](/doc/how-to-update/).
|
|
|
|
|
|
|
|
|
|
## Installing Software
|
|
|
|
|
|
|
|
|
|
Please see [How to Install Software](/doc/how-to-install-software).
|
2019-09-02 05:34:26 -04:00
|
|
|
|
|
|
|
|
|
## Uninstalling
|
2018-06-12 22:50:03 -04:00
|
|
|
|
|
2021-11-16 10:12:33 -05:00
|
|
|
|
If you want to remove a template you must make sure that it is not being used.
|
|
|
|
|
You should check that the template is not being used by any qubes,
|
|
|
|
|
and also that it is not set as the default template.
|
|
|
|
|
|
2021-06-18 04:22:23 -04:00
|
|
|
|
The procedure for uninstalling a template depends on how it was created.
|
2021-05-13 09:38:07 -04:00
|
|
|
|
|
2021-06-20 23:03:48 -04:00
|
|
|
|
If the template was originaly created by cloning another template, then you can
|
|
|
|
|
delete it the same way as you would any other qube. In the Qube Manager,
|
|
|
|
|
right-click on the template and select **Delete qube**. (If you're not sure,
|
|
|
|
|
you can safely try this method first to see if it works.)
|
2021-05-13 09:38:07 -04:00
|
|
|
|
|
2021-06-20 23:03:48 -04:00
|
|
|
|
If, on the other hand, the template came pre-installed or was installed by
|
|
|
|
|
installing a template package in dom0, per the instructions
|
|
|
|
|
[above](#installing), then you must execute the following type of command in
|
|
|
|
|
dom0 in order to uninstall it:
|
2018-06-12 22:50:03 -04:00
|
|
|
|
|
2021-06-20 23:03:48 -04:00
|
|
|
|
```
|
|
|
|
|
$ sudo dnf remove qubes-template-<DISTRO_NAME>-<RELEASE_NUMBER>
|
|
|
|
|
```
|
2018-06-12 22:50:03 -04:00
|
|
|
|
|
2021-06-20 23:03:48 -04:00
|
|
|
|
`qubes-template-<DISTRO_NAME>-<RELEASE_NUMBER>` is the name of the desired
|
|
|
|
|
template package.
|
2018-06-12 22:50:03 -04:00
|
|
|
|
|
2021-03-03 02:37:14 -05:00
|
|
|
|
You may see warning messages like the following:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
warning: file /var/lib/qubes/vm-templates/fedora-XX/whitelisted-appmenus.list: remove failed: No such file or directory
|
|
|
|
|
warning: file /var/lib/qubes/vm-templates/fedora-XX/vm-whitelisted-appmenus.list: remove failed: No such file or directory
|
|
|
|
|
warning: file /var/lib/qubes/vm-templates/fedora-XX/root.img.part.04: remove failed: No such file or directory
|
|
|
|
|
warning: file /var/lib/qubes/vm-templates/fedora-XX/root.img.part.03: remove failed: No such file or directory
|
|
|
|
|
warning: file /var/lib/qubes/vm-templates/fedora-XX/root.img.part.02: remove failed: No such file or directory
|
|
|
|
|
warning: file /var/lib/qubes/vm-templates/fedora-XX/root.img.part.01: remove failed: No such file or directory
|
|
|
|
|
warning: file /var/lib/qubes/vm-templates/fedora-XX/root.img.part.00: remove failed: No such file or directory
|
|
|
|
|
warning: file /var/lib/qubes/vm-templates/fedora-XX/netvm-whitelisted-appmenus.list: remove failed: No such file or directory
|
|
|
|
|
warning: file /var/lib/qubes/vm-templates/fedora-XX/icon.png: remove failed: No such file or directory
|
|
|
|
|
warning: file /var/lib/qubes/vm-templates/fedora-XX/clean-volatile.img.tar: remove failed: No such file or directory
|
|
|
|
|
warning: file /var/lib/qubes/vm-templates/fedora-XX/apps.templates: remove failed: No such file or directory
|
|
|
|
|
warning: file /var/lib/qubes/vm-templates/fedora-XX/apps.tempicons: remove failed: No such file or directory
|
|
|
|
|
warning: file /var/lib/qubes/vm-templates/fedora-XX/apps: remove failed: No such file or directory
|
|
|
|
|
warning: file /var/lib/qubes/vm-templates/fedora-XX: remove failed: No such file or directory
|
|
|
|
|
```
|
|
|
|
|
|
2021-06-20 23:03:48 -04:00
|
|
|
|
These are normal and expected. Nothing is wrong, and no action is required to
|
|
|
|
|
address these warnings.
|
2021-03-03 02:37:14 -05:00
|
|
|
|
|
2021-11-16 10:12:33 -05:00
|
|
|
|
If the uninstallation command doesn't work, pay close attention to
|
|
|
|
|
any error message: it may tell you what qube is using the template,
|
|
|
|
|
or if the template is default. In other cases, please see [VM Troubleshooting](/doc/vm-troubleshooting/).
|
2018-06-12 22:50:03 -04:00
|
|
|
|
|
2021-06-20 23:03:48 -04:00
|
|
|
|
If the Applications Menu entry doesn't go away after you uninstall a template,
|
|
|
|
|
execute the following type of command in dom0:
|
2018-08-25 00:59:25 -04:00
|
|
|
|
|
2021-03-13 12:03:23 -05:00
|
|
|
|
```
|
2021-06-20 23:03:48 -04:00
|
|
|
|
$ rm ~/.local/share/applications/<TEMPLATE_NAME>
|
2021-03-13 12:03:23 -05:00
|
|
|
|
```
|
2018-08-25 00:59:25 -04:00
|
|
|
|
|
2021-06-20 23:03:48 -04:00
|
|
|
|
Applications Menu entries for backups of removed qubes can also be found in
|
|
|
|
|
`/usr/local/share/applications/` of dom0.
|
2020-09-15 12:04:17 -04:00
|
|
|
|
|
2021-03-13 12:03:23 -05:00
|
|
|
|
```
|
2021-06-20 23:03:48 -04:00
|
|
|
|
$ rm /usr/local/share/applications/<TEMPLATE_NAME>
|
2021-03-13 12:03:23 -05:00
|
|
|
|
```
|
2018-08-25 00:59:25 -04:00
|
|
|
|
|
2019-09-02 05:34:26 -04:00
|
|
|
|
## Reinstalling
|
2018-08-25 00:59:25 -04:00
|
|
|
|
|
2021-06-18 04:22:23 -04:00
|
|
|
|
Please see [How to Reinstall a Template](/doc/reinstall-template/).
|
2018-08-25 00:59:25 -04:00
|
|
|
|
|
2019-09-02 05:34:26 -04:00
|
|
|
|
## Switching
|
2018-08-25 00:59:25 -04:00
|
|
|
|
|
2023-02-26 15:10:27 -05:00
|
|
|
|
When you install a new template or
|
|
|
|
|
[upgrade](/doc/how-to-update/#upgrading-to-avoid-eol) a template, it is
|
|
|
|
|
recommended that you switch everything that was using the old template to the
|
2021-06-20 23:03:48 -04:00
|
|
|
|
new template:
|
2018-08-25 00:59:25 -04:00
|
|
|
|
|
2023-03-05 15:50:18 -05:00
|
|
|
|
1. **Make the new template the default template.** In the App Menu, go
|
2023-02-26 15:10:27 -05:00
|
|
|
|
to Qubes Tools, then click on Qubes Global Settings. In the Qube Defaults
|
2023-03-05 15:50:18 -05:00
|
|
|
|
section, next to Template, select the new template from the
|
2023-02-26 15:10:27 -05:00
|
|
|
|
drop-down list. Press OK.
|
|
|
|
|
|
2023-03-05 15:50:18 -05:00
|
|
|
|
2. **Base your [disposable templates](/doc/glossary/#disposable-template) on
|
|
|
|
|
the new template.**
|
2023-02-26 15:10:27 -05:00
|
|
|
|
|
2023-03-05 15:50:18 -05:00
|
|
|
|
- If your only keyboard and mouse are *not* connected through a [USB
|
|
|
|
|
qube](/doc/usb-qubes/), or that USB qube is *not* a disposable, then shut
|
|
|
|
|
down all disposables. In the App Menu, go to Qubes Tools, then click on
|
|
|
|
|
Qube Manager. In the Qube Manager, find your disposable template(s). (By
|
|
|
|
|
default, they end in `-dvm`.) Right click, hover over Template, then click
|
|
|
|
|
on the new template. Repeat for each disposable template.
|
2023-02-26 15:10:27 -05:00
|
|
|
|
|
|
|
|
|
- If your only keyboard or mouse *are* connected through a USB qube, and
|
|
|
|
|
that USB qube *is* a disposable, then you will have to enter a special
|
|
|
|
|
command that shuts down all of your qubes, switches the USB qube's
|
|
|
|
|
disposable template to the new template, then starts the USB qube again.
|
|
|
|
|
In order to avoid being locked out of your system, you must be very
|
|
|
|
|
careful to enter this command without typos and with the correct
|
|
|
|
|
substitutions.
|
|
|
|
|
|
|
|
|
|
In the App Menu, click on Terminal Emulator. Type the command below,
|
|
|
|
|
substituting `<SYS_USB_DISPOSABLE_TEMPLATE>` with the name of the
|
|
|
|
|
disposable template on which `sys-usb` is based, `<NEW_TEMPLATE>` with the
|
2023-03-05 15:50:18 -05:00
|
|
|
|
name of the new template, and `<USB_QUBE>` with the name of your USB qube.
|
|
|
|
|
Other than these substitutions, make sure to enter the command exactly as
|
|
|
|
|
written.
|
2023-02-26 15:10:27 -05:00
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
qvm-shutdown --wait --all; qvm-prefs <SYS_USB_DISPOSABLE_TEMPLATE> template <NEW_TEMPLATE>; qvm-start <USB_QUBE>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
With substitutions, your command should look similar to this example.
|
|
|
|
|
(Warning: This is just an example. Do not attempt to use it.)
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
qvm-shutdown --wait --all; qvm-prefs fedora-01-dvm template fedora-02; qvm-start sys-usb
|
|
|
|
|
```
|
|
|
|
|
|
2023-03-05 15:50:18 -05:00
|
|
|
|
3. **Base your app qubes on the new template.** In the Qube Manager, click on
|
|
|
|
|
the Template heading to sort by template. Select all the qubes based on the
|
|
|
|
|
old template by clicking on the first one, holding shift, then clicking on
|
|
|
|
|
the last one. With multiple qubes selected, right-click on any of them,
|
|
|
|
|
hover your cursor over Template, then click on the new template.
|
2020-05-09 14:27:02 -04:00
|
|
|
|
|
2019-09-02 05:34:26 -04:00
|
|
|
|
## Advanced
|
2018-06-12 22:50:03 -04:00
|
|
|
|
|
2021-06-18 04:22:23 -04:00
|
|
|
|
The following sections cover advanced topics pertaining to templates.
|
2018-06-12 22:50:03 -04:00
|
|
|
|
|
2021-07-05 09:09:42 -04:00
|
|
|
|
### Inheritance and persistence
|
2015-10-16 21:29:33 -04:00
|
|
|
|
|
2021-06-20 23:03:48 -04:00
|
|
|
|
Whenever an app qube is created, the contents of the `/home` directory of its
|
|
|
|
|
parent template are *not* copied to the child app qube's `/home`. The child app
|
|
|
|
|
qube's `/home` is always independent from its parent template's `/home`, which
|
|
|
|
|
means that any subsequent changes to the parent template's `/home` will not
|
|
|
|
|
affect the child app qube's `/home`.
|
|
|
|
|
|
|
|
|
|
Once an app qube has been created, any changes in its `/home`, `/usr/local`, or
|
|
|
|
|
`/rw/config` directories will be persistent across reboots, which means that
|
|
|
|
|
any files stored there will still be available after restarting the app qube.
|
|
|
|
|
No changes in any other directories in app qubes persist in this manner. If you
|
|
|
|
|
would like to make changes in other directories which *do* persist in this
|
|
|
|
|
manner, you must make those changes in the parent template.
|
|
|
|
|
|
|
|
|
|
| Qube Type | Inheritance<sup>1</sup> | Persistence<sup>2</sup> |
|
|
|
|
|
|-------------------------------------------------|-----------------------------------------------------------|---------------------------------------------------------|
|
|
|
|
|
| [template](/doc/glossary/#template) | N/A (templates cannot be based on templates) | everything |
|
|
|
|
|
| [app qube](/doc/glossary/#app-qube)<sup>3</sup> | `/etc/skel` to `/home`; `/usr/local.orig` to `/usr/local` | `/rw` (includes `/home`, `/usr/local`, and `bind-dirs`) |
|
|
|
|
|
| [disposable](/doc/glossary/#disposable) | `/rw` (includes `/home`, `/usr/local`, and `bind-dirs`) | nothing |
|
|
|
|
|
|
|
|
|
|
<sup>1</sup>Upon creation
|
|
|
|
|
<sup>2</sup>Following shutdown
|
|
|
|
|
<sup>3</sup>Includes [disposable templates](/doc/glossary/#disposable-template)
|
2019-09-02 05:34:26 -04:00
|
|
|
|
|
2021-06-18 04:22:23 -04:00
|
|
|
|
### Trusting your templates
|
2019-09-02 05:34:26 -04:00
|
|
|
|
|
2021-06-20 23:03:48 -04:00
|
|
|
|
As the template is used for creating filesystems for other app qubes where you
|
|
|
|
|
actually do the work, it means that the template is as trusted as the most
|
|
|
|
|
trusted app qube based on this template. In other words, if your template gets
|
|
|
|
|
compromised, e.g. because you installed an application, whose *installer's
|
|
|
|
|
scripts* were malicious, then *all* your app qubes (based on this template)
|
|
|
|
|
will inherit this compromise.
|
2019-09-02 05:34:26 -04:00
|
|
|
|
|
|
|
|
|
There are several ways to deal with this problem:
|
|
|
|
|
|
2021-06-20 23:03:48 -04:00
|
|
|
|
* Only install packages from trusted sources -- e.g. from the pre-configured
|
|
|
|
|
Fedora repositories. All those packages are signed by Fedora, and we expect
|
|
|
|
|
that at least the package's installation scripts are not malicious. This is
|
|
|
|
|
enforced by default (at the [firewall qube level](/doc/firewall/)), by not
|
|
|
|
|
allowing any networking connectivity in the default template, except for
|
|
|
|
|
access to the Fedora repos.
|
2019-09-02 05:34:26 -04:00
|
|
|
|
|
2021-06-20 23:03:48 -04:00
|
|
|
|
* Use [standalones](/doc/glossary/#standalone) (see below) for installation of
|
|
|
|
|
untrusted software packages.
|
2019-09-02 05:34:26 -04:00
|
|
|
|
|
2021-06-20 23:03:48 -04:00
|
|
|
|
* Use multiple templates (see below) for different classes of domains, e.g. a
|
|
|
|
|
less trusted template, used for creation of less trusted app qubes, would get
|
|
|
|
|
various packages from less trusted vendors, while the template used for more
|
|
|
|
|
trusted app qubes will only get packages from the standard Fedora repos.
|
2019-09-02 05:34:26 -04:00
|
|
|
|
|
|
|
|
|
Some popular questions:
|
|
|
|
|
|
2021-06-20 23:03:48 -04:00
|
|
|
|
> So, why should we actually trust Fedora repos -- it also contains large
|
|
|
|
|
> amount of third-party software that might be buggy, right?
|
2019-09-02 05:34:26 -04:00
|
|
|
|
|
2021-06-20 23:03:48 -04:00
|
|
|
|
As far as the template's compromise is concerned, it doesn't really matter
|
|
|
|
|
whether `/usr/bin/firefox` is buggy and can be exploited, or not. What matters
|
|
|
|
|
is whether its *installation* scripts (such as %post in the rpm.spec) are
|
|
|
|
|
benign or not. A template should be used only for installation of packages, and
|
|
|
|
|
nothing more, so it should never get a chance to actually run
|
|
|
|
|
`/usr/bin/firefox` and get infected from it, in case it was compromised. Also,
|
|
|
|
|
some of your more trusted app qubes would have networking restrictions enforced
|
|
|
|
|
by the [firewall qube](/doc/firewall/), and again they should not fear this
|
|
|
|
|
proverbial `/usr/bin/firefox` being potentially buggy and easy to compromise.
|
2019-09-02 05:34:26 -04:00
|
|
|
|
|
|
|
|
|
> But why trust Fedora?
|
|
|
|
|
|
2021-06-20 23:03:48 -04:00
|
|
|
|
Because we chose to use Fedora as a vendor for the Qubes OS foundation (e.g.
|
|
|
|
|
for dom0 packages and for app qube packages). We also chose to trust several
|
|
|
|
|
other vendors, such as Xen.org, kernel.org, and a few others whose software we
|
|
|
|
|
use in dom0. We had to trust *somebody* as we are unable to write all the
|
|
|
|
|
software from scratch ourselves. But there is a big difference in trusting all
|
|
|
|
|
Fedora packages to be non-malicious (in terms of installation scripts) vs.
|
|
|
|
|
trusting all those packages are non-buggy and non-exploitable. We certainly do
|
|
|
|
|
not assume the latter.
|
|
|
|
|
|
|
|
|
|
> So, are the templates as trusted as dom0?
|
|
|
|
|
|
|
|
|
|
Not quite. Dom0 compromise is absolutely fatal, and it leads to Game
|
|
|
|
|
Over<sup>TM</sup>. However, a compromise of a template affects only a subset of
|
|
|
|
|
all your app qubes (in case you use more than one template, or also some
|
|
|
|
|
standalones). Also, if your app qubes are network disconnected, even though
|
|
|
|
|
their filesystems might get compromised due to the corresponding template
|
|
|
|
|
compromise, it still would be difficult for the attacker to actually leak out
|
|
|
|
|
the data stolen in an app qube. Not impossible (due to existence of covert
|
|
|
|
|
channels between VMs on x86 architecture), but difficult and slow.
|
2019-09-02 05:34:26 -04:00
|
|
|
|
|
2021-06-18 04:34:07 -04:00
|
|
|
|
### Note on treating app qubes' root filesystem non-persistence as a security feature
|
2018-07-04 07:46:22 -04:00
|
|
|
|
|
2021-06-20 23:03:48 -04:00
|
|
|
|
Any app qube that is based on a template has its root filesystem non-persistent
|
|
|
|
|
across qube reboots. In other words, whatever changes the qube makes (or the
|
|
|
|
|
malware running in this qube makes) to its root filesystem, are automatically
|
|
|
|
|
discarded whenever one restarts the qube.
|
|
|
|
|
|
|
|
|
|
This might seem like an excellent anti-malware mechanism to be used inside the
|
|
|
|
|
qube. However, one should be careful with treating this property as a reliable
|
|
|
|
|
way to keep the qube malware-free. This is because the non-persistence, in the
|
|
|
|
|
case of normal qubes, applies only to the root filesystem and not to the user
|
|
|
|
|
filesystem (on which the `/home`, `/rw`, and `/usr/local` are stored) for
|
|
|
|
|
obvious reasons. It is possible that malware, especially malware that could be
|
|
|
|
|
specifically written to target Qubes, could install its hooks
|
|
|
|
|
inside the user home directory files only. Examples of obvious places for such
|
|
|
|
|
hooks could be: `.bashrc`, the Firefox profile directory which contains the
|
|
|
|
|
extensions, or some PDF or DOC documents that are expected to be opened by the
|
|
|
|
|
user frequently (assuming the malware found an exploitable bug in the PDF or
|
|
|
|
|
DOC reader), and surely many others places, all in the user's home directory.
|
|
|
|
|
|
|
|
|
|
One advantage of the non-persistent rootfs though, is that the malware is still
|
|
|
|
|
inactive before the user's filesystem gets mounted and "processed" by
|
|
|
|
|
system/applications, which might theoretically allow for some scanning programs
|
|
|
|
|
(or a skilled user) to reliably scan for signs of infections of the app qube.
|
|
|
|
|
But, of course, the problem of finding malware hooks in general is hard, so
|
|
|
|
|
this would work likely only for some special cases (e.g. an app qube which
|
|
|
|
|
doesn't use Firefox, as otherwise it would be hard to scan the Firefox profile
|
|
|
|
|
directory reliably to find malware hooks there). Also note that the user
|
|
|
|
|
filesystem's metadata might got maliciously modified by malware in order to
|
|
|
|
|
exploit a hypothetical bug in the app qube kernel whenever it mounts the
|
|
|
|
|
malformed filesystem. However, these exploits will automatically stop working
|
|
|
|
|
(and so the infection might be cleared automatically) after the hypothetical
|
|
|
|
|
bug got patched and the update applied (via template update), which is an
|
|
|
|
|
exceptional feature of Qubes OS.
|
|
|
|
|
|
|
|
|
|
Also note that disposable qubes do not have persistent user filesystem, and so
|
|
|
|
|
they start up completely "clean" every time. Note the word "clean" means in
|
|
|
|
|
this context: the same as their template filesystem, of course.
|
2018-07-04 07:46:22 -04:00
|
|
|
|
|
2019-09-02 05:34:26 -04:00
|
|
|
|
### Important Notes
|
2018-01-31 08:35:12 -05:00
|
|
|
|
|
2021-06-20 23:03:48 -04:00
|
|
|
|
* `qvm-trim-template` is no longer necessary or available in Qubes 4.0 and
|
|
|
|
|
higher. All qubes are created in a thin pool and trimming is handled
|
|
|
|
|
automatically. No user action is required. See [Disk Trim](/doc/disk-trim)
|
|
|
|
|
for more information.
|
|
|
|
|
|
|
|
|
|
* RPM-installed templates are "system managed" and therefore cannot be backed
|
|
|
|
|
up using Qubes' built-in backup function. In order to ensure the preservation
|
|
|
|
|
of your custom settings and the availability of a "known-good" backup
|
|
|
|
|
template, you may wish to clone the default system template and use your
|
|
|
|
|
clone as the default template for your app qubes.
|
|
|
|
|
|
|
|
|
|
* Some templates are available in ready-to-use binary form, but some of them
|
|
|
|
|
are available only as source code, which can be built using the [Qubes
|
|
|
|
|
Builder](/doc/qubes-builder/). In particular, some template "flavors" are
|
|
|
|
|
available in source code form only. For the technical details of the template
|
|
|
|
|
system, please see [Template Implementation](/doc/template-implementation/).
|
|
|
|
|
Take a look at the [Qubes Builder](/doc/qubes-builder/) documentation for
|
|
|
|
|
instructions on how to compile them.
|