core.user
Управление локальными пользователями OS: создание и удаление аккаунтов.
core.user приводит набор локальных аккаунтов к нужному составу через useradd / userdel. Семантика present — present-or-create: если пользователь уже есть, шаг ничего не реконсилит (uid/shell/home/groups не правятся) и сообщает changed=false, а опциональные параметры действуют только при создании (usermod не вызывается). Требует root.
Требования
- Rootтребуется
- Сторона
soul-side - Коллекция
soulstack.system - Категория
system
run_as_rootexec_subprocessuseradd / userdel — busybox-совместимое подмножество флагов; на Alpine это пакет shadow или встроенные команды busybox, оба понимают используемые флаги.
Состояния
core.user.present — Пользователь существует (создаётся через useradd, если его нет).
Пользователя не было и он создан.
Пользователь уже существует — uid/shell/home/groups/system/group не реконсилятся.
Параметры
| Параметр | Тип | Обяз. / дефолт | Описание |
|---|---|---|---|
name | string | required | Имя пользователя. |
uid | int | optional | Явный uid (useradd -u). Действует только при создании. |
shell | string | optional | Login shell (useradd -s). Действует только при создании. |
home | string | optional | Домашний каталог (useradd -d). Действует только при создании. |
groups | list<string> | optional | Supplementary-группы (useradd -G). Действует только при создании. |
system | bool | optional | Системный аккаунт (useradd -r) для сервис-аккаунтов. Только при создании. |
group | string | optional | Primary-группа (useradd -g); должна уже существовать. Только при создании. |
Пример — Системный сервис-аккаунт (primary-группа заведена ДО)
# Primary-группа создаётся ДО пользователя (core.user -g требует существующую).- name: Ensure the app system group exists module: core.group.present params: name: appsvc system: true
- name: Ensure the app system user exists module: core.user.present params: name: appsvc system: true group: appsvc shell: /usr/sbin/nologin home: /var/lib/appsvcOutput
| Поле | Тип | Описание |
|---|---|---|
name | string | |
exists | true | |
created | bool |
core.user.absent — Пользователь удалён.
Пользователь был и удалён (userdel).
Пользователя нет.
Параметры
| Параметр | Тип | Обяз. / дефолт | Описание |
|---|---|---|---|
name | string | required | Имя пользователя. |
Output
| Поле | Тип | Описание |
|---|---|---|
name | string | |
exists | false |
Заметки
- present — present-or-create: существующий пользователь не реконсилится (uid/shell/home/groups/system/group не сверяются и не правятся), опциональные параметры применяются только при создании — usermod не вызывается. Чтобы пересобрать аккаунт, удалите его через absent и создайте заново.
- home передаётся с флагом -M: домашний каталог модуль не создаёт. Primary-группа (group) должна существовать заранее — заведите её через core.group ДО пользователя.
- Модуль валидирует форму ввода, не ужесточая ограничения useradd: name/group/groups — по NAME_REGEX shadow-utils (^[a-z_][a-z0-9_-]*\$?$, длина ≤ 32), uid — в диапазоне [0, 2147483647], shell/home — абсолютный путь (существование файла и каталога не проверяется). Перед позиционным именем ставится -- (useradd -- <name>), argv строится напрямую без sh — так отсекаются arg-injection и заведомо-битый ввод.
Безопасность и умолчания
- Проверяется форма ввода, но не привилегированность смысла. uid: 0 создаёт второй root-эквивалентный аккаунт; groups: ["sudo"] / ["wheel"] / ["docker"] даёт носителю фактический путь к root — оба значения валидны по формату. Формат-валидация отсекает инъекцию, но не «опасный, но валидный» смысл: это не авторизация.
- Привилегированные значения — часть attack surface: если uid/groups/name приходят из input.* / register.* / soulprint.*, им должен доверять автор Destiny/scenario, а не внешний ввод. Для сервис-аккаунта фиксируйте безопасные значения — system: true, без sudo/wheel/docker, shell /usr/sbin/nologin.
- present — present-or-create: понизить привилегии ранее созданного аккаунта повторным present нельзя (uid/groups не реконсилятся). Отзыв привилегий — только пересозданием через absent.
- required_capabilities [run_as_root, exec_subprocess] — декларация для статической сверки soul-lint с allowed_capabilities хоста, а не runtime-повышение прав: useradd/userdel исполняются с привилегиями процесса soul-агента (под root).