aboutsummaryrefslogtreecommitdiffstats
path: root/docs/06_Component_Documentation/Application_Framework/04_Application_Sandboxing.md
blob: 356c0eb4261e67f5bdeb801bd4cb284762d0bace (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
---
title: Application Sandboxing
---

One of the motivations for leveraging systemd in `applaunchd` was to allow the use of its
advanced features such as [sandboxing](https://www.freedesktop.org/software/systemd/man/systemd.exec.html#Sandboxing),
[system call filtering](https://www.freedesktop.org/software/systemd/man/systemd.exec.html#System%20Call%20Filtering),
[process limits](https://www.freedesktop.org/software/systemd/man/systemd.exec.html#Process%20Properties), and
Linux CGroup configuration via [slices](https://www.freedesktop.org/software/systemd/man/systemd.slice.html).
The scope of potential systemd configurations involving these options is broad, and so far AGL has focused on providing
some simple examples of basic sandboxing integrated with the application templates discussed above.

## Network Access Restriction

The systemd [`PrivateNetwork`](https://www.freedesktop.org/software/systemd/man/systemd.exec.html#PrivateNetwork=)
service configuration option can be used to disable network access for the service started by a unit file.
The `applaunchd` packaging installs a systemd drop-in configuration file named `no-network.conf` in the
directory `/usr/lib/systemd/system/sandboxing` that may be used to disable network access with `PrivateNetwork`.
To use it, `no-network.conf` should be symlinked in an appropriate unit file drop-in override directory per
systemd naming expectations (see systemd unit file
[man page](https://www.freedesktop.org/software/systemd/man/systemd.unit.html#Description)).
The following is a `BitBake` recipe snippet showing installation of the drop-in for an application named `foo`
that is using the generic application template:

```text
...

inherit agl-app

AGL_APP_NAME = "Foo"

do_install() {
    # Enable systemd sandboxing override as a demonstration
    install -d ${D}${systemd_system_unitdir}/agl-app@${AGL_APP_ID}.service.d/
    ln -sf ${systemd_system_unitdir}/sandboxing/no-network.conf ${D}${systemd_system_unitdir}/agl-app@${AGL_APP_ID}.service.d/
}

FILES:${PN} = " \
    ${sysconfdir}/systemd/system/agl-app@${AGL_APP_ID}.service.d \
"

...
```

This results in a `/usr/lib/systemd/system/agl-app@foo.service.d/no-network.conf` symlink being created
in the `foo` packaging, disabling network access when `foo` is started by `applaunchd` or directly via
`systemctl` on the command line.

## Private Temporary Directories

The systemd [`PrivateTmp`](https://www.freedesktop.org/software/systemd/man/systemd.exec.html#PrivateTmp=)
service configuration option can be used to prevent access to the host `/tmp` and `/var/tmp` directories
for the service started by a unit file.  The service will instead have private temporary mounts of these
directories in a new mount namespace.  The `applaunchd` packaging installs a systemd drop-in configuration
file named `private-tmp.conf` in the directory `/usr/lib/systemd/system/sandboxing` that may be used to
create private temporary directory mounts with `PrivateTmp`. To use it, `private-tmp.conf` should be
symlinked in an appropriate unit file drop-in override directory per systemd naming expectations (see
systemd unit file [man page](https://www.freedesktop.org/software/systemd/man/systemd.unit.html#Description)).
See above for an example `BitBake` recipe snippet showing installation of a drop-in file when using the
generic application template.

## Other Sandboxing Options

In addition to the above, some other notable systemd sandbox options worth further consideration for
applications include:

- [PrivateDevices](https://www.freedesktop.org/software/systemd/man/systemd.exec.html#PrivateDevices=)  
  This option could be used to remove access to device files in /dev for applications that do not
  require them, but it is likely that `DeviceAllow` may also need to be used to enable functionality in
  some applications.
- [ProtectSystem](https://www.freedesktop.org/software/systemd/man/systemd.exec.html#ProtectSystem=)  
  The default and `full` modes of this option likely can be enabled with little impact to most
  applications, as they should not need write access to the directories that are made read-only.
  Using the `strict` option would need investigation into interactions with usage of directory
  hierarchies like `/run`.
- [ProtectHome](https://www.freedesktop.org/software/systemd/man/systemd.exec.html#ProtectHome=)  
  This option seems worthwhile if the system ends up with more than one active user for running
  applications, but interactions with default application caching and configuration locations
  needs to be investigated.  It is likely that enforcing use of locations outside of `/home`
  for these would need to be settled upon and documented for application developers.  For
  example using the [XDG directory scheme](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html)
  similar to the previous AGL application framework.
- [ReadWritePaths, etc.](https://www.freedesktop.org/software/systemd/man/systemd.exec.html#ReadWritePaths=)  
   These options provide a more fine-grained approach to some of the above ones, and could be
   used to enable something like an application only seeing its own files and the contents of
   a specific set of directories like `/etc` and `/usr/lib`.  Implementing such would likely
   require settling on a custom application installation hierarchy as was done in the previous
   AGL application framework.

The above list is not exhaustive, and does not include some other likely possibilities involving
system call filtering and resource limits.  Future AGL releases may expand the examples provided
with `applaunchd` along these lines.