| # Copyright 2015 The ChromiumOS Authors | |
| # Use of this source code is governed by a BSD-style license that can be | |
| # found in the LICENSE file. | |
| description "Starts platform guest networking services" | |
| author "chromium-os-dev@chromium.org" | |
| start on starting system-services or starting openssh-server | |
| stop on stopping system-services | |
| respawn | |
| respawn limit 3 10 | |
| # Do not respawn if the service is terminated on purpose. | |
| normal exit 0 | |
| # Minijail actually forks off the desired process. | |
| expect fork | |
| # Killable for memory leaks. | |
| oom score -100 | |
| # This limit is high to accommodate the adb-proxy child process which will | |
| # attempt to mmap over 200MB on first connect. | |
| limit as 400000000 unlimited | |
| pre-start script | |
| # CAP_BPF and `--no-default-runtime-environment` to enable bpf operations. | |
| # `-G` to inherit bpf-access group. Note that this is just a one-shot program | |
| # but not a daemon. Always ingore the non-zero exit code since it will make | |
| # the pre-start script failed and thus block the main patchpanel process. | |
| minijail0 -u patchpaneld -g patchpaneld -G --no-default-runtime-environment \ | |
| -c cap_bpf=e /usr/bin/patchpanel_bpf_loader || true | |
| end script | |
| script | |
| # Record the patchpanel start event at /run/bootstat/uptime-patchpanel-start. | |
| bootstat patchpanel-start | |
| # Start constructing minijail0 args... | |
| args="" | |
| # Make sure minijail0 exits right away and won't block upstart. | |
| args="${args} -i" | |
| # Run as patchpaneld user and group. | |
| args="${args} -u patchpaneld -g patchpaneld" | |
| # Inherit supplementary groups. | |
| args="${args} -G" | |
| # Prevent that execve gains privileges, required for seccomp filters. | |
| args="${args} -n" | |
| # Avoid locking SECURE_KEEP_CAPS flag. | |
| args="${args} -B 20" | |
| # So that child processes can inherit runtime capabilities. | |
| args="${args} --ambient" | |
| # --no-default-runtime-environment to enable BPF operations. | |
| args="${args} --no-default-runtime-environment" | |
| # Start constructing arg for capabilities... | |
| # CAP_NET_ADMIN and CAP_NET_RAW are required by a variety of functionalities | |
| # in patchpanel for network management. | |
| caps="cap_net_admin,cap_net_raw" | |
| # TODO(b/294449735): Find a way to remove these two CAPs. | |
| # CAP_SYS_CHROOT and CAP_CHOWN are required by entering the mount namespace of | |
| # ARC container and changing the owner of several files in that. | |
| caps="${caps},cap_sys_chroot,cap_chown" | |
| # CAP_SETUID and CAP_SETGID are used to change user and group to nobody when | |
| # forking processes. The transition is protected by SafeSetID LSM. | |
| caps="${caps},cap_setuid,cap_setgid" | |
| # CAP_SETPCAP is required to set CAPs when forking processes. | |
| caps="${caps},cap_setpcap" | |
| # CAP_NET_BIND_SERVICE is required by DHCP server. | |
| caps="${caps},cap_net_bind_service" | |
| # CAP_SYS_ADMIN is required by several operations related to namespaces. | |
| # TODO(b/293389589#comment8): Investigate how to drop it from the main | |
| # process. | |
| caps="${caps},cap_sys_admin" | |
| # CAP_SYS_PTRACE is required by `ip netns` command to read the netns owned by | |
| # other processes. | |
| caps="${caps},cap_sys_ptrace" | |
| # CAP_SYS_MODULE is required for loading kernel modules on behalf of ARC. | |
| caps="${caps},cap_sys_module" | |
| # CAP_BPF is required for attaching BPF programs by iptables. | |
| # TODO(b/311100871): Revisit the usage of CAP_BPF. | |
| caps="${caps},cap_bpf" | |
| args="${args} -c ${caps}=e" | |
| # Execute patchpaneld. | |
| args="${args} /usr/bin/patchpaneld" | |
| exec minijail0 ${args} | |
| end script | |
| # Mark service as started after D-Bus service is ready. Also log the metrics, | |
| # which can be found at /run/bootstat/uptime-patchpanel-started. | |
| post-start script | |
| minijail0 -u patchpaneld -g patchpaneld \ | |
| /usr/bin/gdbus wait --system --timeout 60 org.chromium.PatchPanel | |
| bootstat patchpanel-started | |
| end script |