aboutsummaryrefslogtreecommitdiffhomepage
path: root/hst/config.go
blob: ee216faa138aa80b1ed63424cbae5592762b5d9a (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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package hst

import (
	"time"

	"hakurei.app/container"
	"hakurei.app/container/seccomp"
	"hakurei.app/system/dbus"
)

const Tmp = "/.hakurei"

var AbsTmp = container.MustAbs(Tmp)

// Config is used to seal an app implementation.
type (
	Config struct {
		// reverse-DNS style arbitrary identifier string from config;
		// passed to wayland security-context-v1 as application ID
		// and used as part of defaults in dbus session proxy
		ID string `json:"id"`

		// absolute path to executable file
		Path *container.Absolute `json:"path,omitempty"`
		// final args passed to container init
		Args []string `json:"args"`

		// system services to make available in the container
		Enablements *Enablements `json:"enablements,omitempty"`

		// session D-Bus proxy configuration;
		// nil makes session bus proxy assume built-in defaults
		SessionBus *dbus.Config `json:"session_bus,omitempty"`
		// system D-Bus proxy configuration;
		// nil disables system bus proxy
		SystemBus *dbus.Config `json:"system_bus,omitempty"`
		// direct access to wayland socket; when this gets set no attempt is made to attach security-context-v1
		// and the bare socket is mounted to the sandbox
		DirectWayland bool `json:"direct_wayland,omitempty"`

		// passwd username in container, defaults to passwd name of target uid or chronos
		Username string `json:"username,omitempty"`
		// absolute path to shell
		Shell *container.Absolute `json:"shell"`
		// directory to enter and use as home in the container mount namespace
		Home *container.Absolute `json:"home"`

		// extra acl ops to perform before setuid
		ExtraPerms []*ExtraPermConfig `json:"extra_perms,omitempty"`

		// numerical application id, used for init user namespace credentials
		Identity int `json:"identity"`
		// list of supplementary groups inherited by container processes
		Groups []string `json:"groups"`

		// abstract container configuration baseline
		Container *ContainerConfig `json:"container"`
	}

	// ContainerConfig describes the container configuration baseline to which the app implementation adds upon.
	ContainerConfig struct {
		// container hostname
		Hostname string `json:"hostname,omitempty"`

		// duration to wait for after interrupting a container's initial process in nanoseconds;
		// a negative value causes the container to be terminated immediately on cancellation
		WaitDelay time.Duration `json:"wait_delay,omitempty"`

		// extra seccomp flags
		SeccompFlags seccomp.ExportFlag `json:"seccomp_flags"`
		// extra seccomp presets
		SeccompPresets seccomp.FilterPreset `json:"seccomp_presets"`
		// disable project-specific filter extensions
		SeccompCompat bool `json:"seccomp_compat,omitempty"`
		// allow ptrace and friends
		Devel bool `json:"devel,omitempty"`
		// allow userns creation in container
		Userns bool `json:"userns,omitempty"`
		// share host net namespace
		HostNet bool `json:"host_net,omitempty"`
		// share abstract unix socket scope
		HostAbstract bool `json:"host_abstract,omitempty"`
		// allow dangerous terminal I/O
		Tty bool `json:"tty,omitempty"`
		// allow multiarch
		Multiarch bool `json:"multiarch,omitempty"`

		// initial process environment variables
		Env map[string]string `json:"env"`
		// map target user uid to privileged user uid in the user namespace
		MapRealUID bool `json:"map_real_uid"`

		// pass through all devices
		Device bool `json:"device,omitempty"`
		// container mount points;
		// if the first element targets /, it is inserted early and excluded from path hiding
		Filesystem []FilesystemConfigJSON `json:"filesystem"`
	}
)

// ExtraPermConfig describes an acl update op.
type ExtraPermConfig struct {
	Ensure  bool                `json:"ensure,omitempty"`
	Path    *container.Absolute `json:"path"`
	Read    bool                `json:"r,omitempty"`
	Write   bool                `json:"w,omitempty"`
	Execute bool                `json:"x,omitempty"`
}

func (e *ExtraPermConfig) String() string {
	if e == nil || e.Path == nil {
		return "<invalid>"
	}
	buf := make([]byte, 0, 5+len(e.Path.String()))
	buf = append(buf, '-', '-', '-')
	if e.Ensure {
		buf = append(buf, '+')
	}
	buf = append(buf, ':')
	buf = append(buf, []byte(e.Path.String())...)
	if e.Read {
		buf[0] = 'r'
	}
	if e.Write {
		buf[1] = 'w'
	}
	if e.Execute {
		buf[2] = 'x'
	}
	return string(buf)
}