7.0 KiB
Security policy
Snap packages run confined under a restrictive security sandbox by default. The security policies and store policies work together to allow developers to quickly update their applications and to provide safety to end users.
This document describes how to configure the security policies for snap
packages and builds upon the packaging declaration as defined in meta.md.
How policy is applied
Security policy is typically defined by declaring a security template and any additional security groups to extend the policy provided by the template. If unspecified, default confinement allows the snap to run as a network client.
Applications are tracked by the system by using the concept of an
ApplicationId. The APP_ID is the composition of the package name, the
service/binary name and package version. The APP_ID takes the form of
<pkgname>_<appname>_<version>. For example, if this is in package.yaml:
name: foo
version: 0.1
...
services:
- name: bar
start: bin/bar
Then the APP_ID for the bar service is foo_bar_0.1. The APP_ID is used
throughout the system including in the enforcement of security policy by the
app launcher. The launcher will:
- setup various environment variables (eg,
SNAP_APP_ARCH,SNAP_APP_DATA_PATH,SNAP_APP_PATH,SNAP_APP_TMPDIR,SNAP_APP_USER_DATA_PATH,SNAP_OLD_PWD,HOMEandTMPDIR(set toSNAP_APP_TMPDIR). See the snappy FHS for details. - chdir to
SNAP_APP_PATH(the install directory) - setup the seccomp filter
- exec the app under AppArmor profile under a default nice value
The launcher will be used when launching both services and when using CLI binaries. The launcher enforces application isolation as per the snappy FHS.
AppArmor
Upon snap package install, package.yaml is examined and AppArmor profiles are
generated for each service and binary to have names based on the APP_ID.
As mentioned, AppArmor profiles are template based and may be extended through
policy groups, which are expressed in the yaml as caps.
Seccomp
Upon snap package install, package.yaml is examined and seccomp filters are
generated for each service and binary. As mentioned, seccomp filters are
template based and may be extended through filter groups, which are expressed
in the yaml as caps.
Defining snap policy
The package.yaml need not specify anything for default confinement. Several
options are available to modify the confinement:
caps: (optional) list of (easy to understand, human readable) additional security policies to add. The system will translate these to generate AppArmor and seccomp policy. Note: these are separate fromcapabilities(7)- AppArmor access is deny by default and apps are restricted to their
app-specific directories, libraries, etc (enforcing ro, rw, etc).
Additional access beyond what is allowed by the declared
security-templateis declared via this option - seccomp is deny by default. Enough safe syscalls are allowed so that apps
using the declared
security-templateshould work. Additional access beyond what is allowed by thesecurity-templateis declared via this option security-template: (optional) alternate security template to use instead ofdefaultsecurity-override: (optional) high level overrides to use whensecurity-templateandcapsare not sufficient - see Advanced usage for detailsapparmor: path/to/security overrideseccomp: path/to/filter overridesecurity-policy: (optional) hand-crafted low-level raw security policy to use instead of using default template-based security policyapparmor: path/to/profileseccomp: path/to/filter
Eg, consider the following:
name: foo
version: 1.0
services:
- name: bar
- name: baz
caps:
- network-client
- norf-framework_client
- name: qux
security-template: nondefault
- name: quux
security-policy:
apparmor: meta/quux.profile
seccomp: meta/quux.seccomp
binaries:
- name: cli-exe
caps: none
With the above:
APP_IDforbarisfoo_bar_1.0. It uses thedefaulttemplate andnetwork-client(default) capAPP_IDforbazisfoo_baz_1.0. It uses thedefaulttemplate and thenetwork-clientandnorf-framework_clientcapsAPP_IDforquxisfoo_qux_1.0. It uses thenondefaulttemplate andnetwork-client(default) capAPP_IDforquuxisfoo_quux_1.0. It does not use asecurity-templateorcapsbut instead ships its own AppArmor policy inmeta/quux.profileand seccomp filters inmeta/quux.seccompAPP_IDforcli-exeisfoo_cli-exe_1.0. It uses thedefaulttemplate and nocaps
As mentioned, security policies and store policies work together to provide
flexibility, speed and safety. Use of some of the above will trigger a manual
review in the official Ubuntu store for snaps that are type: app (the
default):
security-policy- always triggers a manual review because it allows specifying access beyond the application specific areascaps- will only trigger a manual review if specifying areservedcapsecurity-template- will only trigger a manual review if specifying areservedtempate (eg,unconfined)security-override- will only trigger a manual review if specifying access beyond that provided bycommonaccess.
Apps should typically only use common groups with caps and common templates
with security-template and avoid security-policy and security-override.
Snaps that are of type: framework (see frameworks.md) will use any of the
above (since framework snaps' purpose is to extend the system and require
additional privilege).
TODO
- provide command line for determining available security policy on the system
Future
The following is planned:
- launcher:
- setup cgroups (tag network traffic, block devices, memory)
- setup iptables using cgroup tags (for internal app access)
- drop privileges to uid of service
sockets: (optional)AF_UNIXabstract socket definition for coordinated snap communications. Abstract sockets will be namespaced and yaml is such that (client) apps wanting to use the socket don't have to declare anything extra, but they don't have access unless the (server) binary declaring the socket says that app is ok).names: (optional) list of abstract socket names (<name>_<binaryname>is prepended)allowed-clients:<name>or<name>_<binaryname>(ie, omit version andbinarynameto allow all from snap<name>or omit version to allow onlybinarynamefrom snap<name>)
Eg:
name: foo
...
services:
- name: bar
sockets:
names:
- sock1
- sock2
- ...
allowed-clients:
- baz
- norf_qux
- ...