Перейти к содержимому

core.user

← Каталог модулей

soul-sidesoulstack.systemsystemroot требуется

Управление локальными пользователями OS: создание и удаление аккаунтов.

core.user приводит набор локальных аккаунтов к нужному составу через useradd / userdel. Семантика present — present-or-create: если пользователь уже есть, шаг ничего не реконсилит (uid/shell/home/groups не правятся) и сообщает changed=false, а опциональные параметры действуют только при создании (usermod не вызывается). Требует root.

Требования

  • Rootтребуется
  • Сторонаsoul-side
  • Коллекцияsoulstack.system
  • Категорияsystem
Capabilitiesrun_as_rootexec_subprocess
Детект backend

useradd / userdel — busybox-совместимое подмножество флагов; на Alpine это пакет shadow или встроенные команды busybox, оба понимают используемые флаги.

Состояния

core.user.present — Пользователь существует (создаётся через useradd, если его нет).

Меняется, когда

Пользователя не было и он создан.

Не меняется, когда

Пользователь уже существует — uid/shell/home/groups/system/group не реконсилятся.

Параметры

ПараметрТипОбяз. / дефолтОписание
namestringrequiredИмя пользователя.
uidintoptionalЯвный uid (useradd -u). Действует только при создании.
shellstringoptionalLogin shell (useradd -s). Действует только при создании.
homestringoptionalДомашний каталог (useradd -d). Действует только при создании.
groupslist<string>optionalSupplementary-группы (useradd -G). Действует только при создании.
systembooloptionalСистемный аккаунт (useradd -r) для сервис-аккаунтов. Только при создании.
groupstringoptionalPrimary-группа (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/appsvc

Output

ПолеТипОписание
namestring
existstrue
createdbool

Заметки

  • 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).

См. также