setup.sh 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #!/bin/sh
  2. # Provision Keiji's service identity and private directories on Linux.
  3. set -eu
  4. if [ "$(id -u)" -ne 0 ]; then
  5. echo 'Run this script as root (for example, sudo ./deploy/setup.sh).' >&2
  6. exit 1
  7. fi
  8. if [ ! -x /sbin/nologin ]; then
  9. echo '/sbin/nologin is not available; refusing to create the service user.' >&2
  10. exit 1
  11. fi
  12. # Do not silently repurpose an existing human account or change its shell.
  13. if getent group keiji >/dev/null; then
  14. :
  15. else
  16. groupadd --system keiji
  17. fi
  18. if getent passwd keiji >/dev/null; then
  19. entry=$(getent passwd keiji)
  20. existing_gid=$(printf '%s\n' "$entry" | cut -d: -f4)
  21. existing_shell=$(printf '%s\n' "$entry" | cut -d: -f7)
  22. group_gid=$(getent group keiji | cut -d: -f3)
  23. if [ "$existing_shell" != /sbin/nologin ] || [ "$existing_gid" != "$group_gid" ]; then
  24. echo 'Existing keiji account has a different shell or primary group; review it manually.' >&2
  25. exit 1
  26. fi
  27. else
  28. useradd --system --no-create-home --gid keiji --shell /sbin/nologin keiji
  29. fi
  30. # Refuse symlinks at managed paths rather than following them as root.
  31. for directory in /etc/keiji /var/lib/keiji /var/lib/keiji/images; do
  32. if [ -L "$directory" ] || { [ -e "$directory" ] && [ ! -d "$directory" ]; }; then
  33. echo "Not a safe directory: $directory" >&2
  34. exit 1
  35. fi
  36. done
  37. # Config is root-managed, readable by the service group, never service-writable.
  38. install -d -o root -g keiji -m 0750 /etc/keiji
  39. # Existing configuration contents are deliberately not changed recursively.
  40. # An administrator must install individual secrets as root:keiji mode 0640.
  41. # SQLite needs write access to its directory for journal and sidecar files.
  42. install -d -o keiji -g root -m 0700 /var/lib/keiji /var/lib/keiji/images
  43. # Do not recursively change ownership or modes on existing application data.
  44. cat <<'MSG'
  45. Keiji identity and directories are ready.
  46. Install your environment file as root:keiji mode 0640, for example:
  47. install -o root -g keiji -m 0640 /path/to/keiji.env /etc/keiji/keiji.env
  48. Existing files were not modified. Review their ownership, permissions and ACLs.
  49. This script does not install or start Keiji.
  50. MSG