# Users To run containers securely; in an environment with fewer privileges, a user is necessary. ## Wheel Before creating the user install `doas`, to use when root is required: ``` # apk add doas ``` Configure `doas` through `/etc/doas.d/main.conf`: ``` permit persist :wheel as root ``` ## Adding a user Adding a user in Alpine Linux can be done using the `setup-user` script. Here we can specify the name, groups and more: ``` # setup-user -g wheel,_power # passwd ``` > Make sure that the home dataset is decrypted and mounted, before creating a user. You may have to change the shell of the user in `/etc/passwd` from `/sbin/nologin` to a shell from `/etc/shells`. Alpine Linux comes with `/bin/ash` by default: ``` :x:1234:1234::/home/:/bin/ ``` If you have checked that `doas` works with the user then you can lock the root account because it imposes security risks if it is kept open. This can be done with: ``` # passwd -l root ``` and editing `/etc/passwd` to change the login shell from `/bin/ash` to `/sbin/nologin`: ``` root:x:0:0:root:/root:/sbin/nologin ``` ## User services The user will have its own init system, for the management of user containers and other user services. The `runsvdir` command of the `runit` init system will be used to create a local init system for the user. ``` # apk add runit ``` Create `/etc/init.d/runsvdir-user`, which will be the init script for the local init system of the user. ``` #!/sbin/openrc-run user="${RC_SVCNAME##*.}" svdir="/home/${user}/.local/service" pidfile="/run/runsvdir-user.${user}.pid" command="/usr/bin/runsvdir" command_args="$svdir" command_user="$user" command_background=true depend() { after mount-home } ``` Make `/etc/init.d/runsvdir-user` an executable ``` # chmod +x /etc/init.d/runsvdir-user ``` Link the user to `/etc/init.d/runsvdir-user` ``` # ln -s /etc/init.d/runsvdir-user /etc/init.d/runsvdir-user. ``` Finally, add the service to the manual runlevel ``` # rc-update add runsvdir-user. manual ``` > This process can of course be repeated for several users. ### Mounting home Before the user init system can be started, the home dataset should be decrypted and mounted. This process will be partially automated by adding it to the manual runlevel. Create `/etc/init.d/mount-home` ``` #!/sbin/openrc-run depend() { need localmount } start() { zfs load-key -L prompt tank/home zfs mount tank/home } stop() { zfs unmount tank/home zfs unload-key tank/home } ``` Make `/etc/init.d/mount-home` an executable ``` # chmod +x /etc/init.d/mount-home ``` Add the service to the manual runlevel ``` # rc-update add mount-home manual ``` Now the scripts can be started accordingly with ``` # openrc -n manual ``` > Note that after a reboot this command should be performed to decrypt the home partition and to start the user services.