Возможно ли зарегистрировать «виртуальные» идентификаторы пользователей / групп в системе Linux?

Существует ли в Linux стандартизованный механизм, который можно использовать для привязки имен пользователей к идентификаторам пользователей без фактического создания учетной записи системы, которая может войти в систему?

Казалось бы, что-то подобное возможно, учитывая, что есть возможность подключиться к серверу Windows и дать UID пользователям. Обычно в большом количестве.

То, что мне нужно / нужно для этого, – это иметь возможность назначать значимые имена для групп и пользователей, которые существуют только в качестве подчиненных идентификаторов ( userns ).

Я бы подумал, что это может быть достигнуто с чем-то связанным с nss (5), но пришло с пустыми руками.


Немного фона

Визуальное представление об использовании

В системе хоста обычно используются 64-битные UID (и GID), однако 0..2^32-1 – это диапазон доступных идентификаторов пользователей. Таким образом, мы можем назначить поддиапазоны из этого общего диапазона в качестве подчиненных идентификаторов для данных пользователей. Например, можно сказать, что диапазон 100000..2^32-1 присваивается пользователю root в корневом пространстве имен.

В терминах LXC ( lxc ), который использует использование, корневое пространство имен живет на хосте, а подчиненные идентификаторы отображаются в дочерние пространства имен, так что диапазон UID на хосте 100000..165535 внутри дочернего пространства имен будет отображаться как 0..65535 .

Соответственно, файлы, принадлежащие root внутри дочернего пространства имен, будут принадлежать UID 100000 на хосте .

Поэтому было бы полезно, если бы я мог назначить значимое имя этому «виртуальному» UID 100000 в хост-системе без фактического создания учетной записи пользователя.

Это то, что я ищу.


Сейчас я использую этот вспомогательный скрипт в качестве обходного пути. Не стесняйтесь использовать его в соответствии с условиями, установленными условиями StackExchange или Public Domain / CC0:

 #!/usr/bin/env bash LXCPATH=$(lxc-config lxc.lxcpath) function create-group { local NAME=$1 local GUEST=$3 local GUESTCONF="/etc/lxc/guests/lxc.$GUEST.conf" local BASEID=$(awk '$1 ~ /^lxc\.id_map$/ && $3 ~ /^g$/ {print $5}' "$GUESTCONF" || echo "0") local ID=$(($2+$BASEID)) echo "groupadd -g $ID $NAME" } function create-user { local NAME=$1 local GUEST=$3 local GUESTCONF="/etc/lxc/guests/lxc.$GUEST.conf" local BASEID=$(awk '$1 ~ /^lxc\.id_map$/ && $3 ~ /^u$/ {print $5}' "$GUESTCONF" || echo "0") local ID=$(($2+$BASEID)) echo "useradd -M -N -u $ID -s /usr/sbin/nologin $NAME" } function create-entry { local GUEST=$1 local DATABASE=$2 local FUNCTION=$3 local entry; local NAME; local ID for entry in $(awk -F : '{print $1 ":" $3}' "$DATABASE"); do NAME=$GUEST.${entry%:*} if getent ${DATABASE##*/} $NAME; then echo "Entry $NAME (${DATABASE##*/}) already exists" else $FUNCTION $NAME ${entry#*:} $GUEST fi done } for guest in $(lxc-ls -1); do create-entry $guest "$LXCPATH/$guest/rootfs/etc/group" create-group create-entry $guest "$LXCPATH/$guest/rootfs/etc/passwd" create-user done|sort -u|while read cmd; do echo "$cmd" $cmd done 

Это требует awk ( mawk или gawk ), bash , getent , groupadd , useradd . Если вы закомментируете строку:

  $cmd 

вы просто получите вывод всех команд, которые он мог бы запустить. Он добавляет идентификаторы пользователей и групп в порядке возрастания. Тем не менее, предполагается, что запись lxc.id_map находится в файле, названном после гостя LXC, с именем файла по схеме /etc/lxc/guests/lxc.${guestname}.conf . Вы можете настроить эту настройку.

Вы можете повторно запустить скрипт, если вы добавите пользователей в своих гостей.

Это будет