Зачем нам отдельная учебная учётная запись
До этого мы работали в системе под одной учётной записью и уже разобрали её UID, группы и права. Мы создавали файлы, меняли права, запускали скрипты — и всё это делал один и тот же пользователь. Но в администрировании часто нужно смотреть на систему не только своими глазами, но и глазами другого пользователя. Например, проверить, что файл действительно закрыт для группы, или убедиться, что каталог с режимом 700 закрыт для других обычных учётных записей. Для таких проверок недостаточно рассуждать о правах абстрактно — нужна вторая учётная запись, из-под которой можно выполнять команды.
Нашу учебную запись мы назовём courseguest. Это имя выбрано не случайно: слово guest сразу говорит, что запись временная и предназначена для практики, а префикс course связывает её с нашим курсом. Прежде чем создавать, нужно проверить, что такое имя в системе не занято. Для этого подойдёт команда getent passwd courseguest.
Команда getent читает настроенную базу учётных данных. Это не то же самое, что просто открыть файл /etc/passwd: в реальных системах данные о пользователях могут приходить из разных источников, и getent умеет обращаться к тому источнику, который настроен. Первым аргументом мы указываем тип базы: passwd — база учётных записей, group — база групп. Вторым — искомое имя. Если поиск не нашёл запись и не возникло ошибки обращения к базе, имя свободно. Если запись найдена, выберите другое имя и используйте его во всех дальнейших командах.
getent passwd courseguest
Пустой вывод — это хороший знак. Если бы имя было занято, мы увидели бы строку с данными пользователя. Разберём её формат, но с оговоркой: пароль в этой строке не хранится. Раньше в /etc/passwd действительно был хеш пароля, но сегодня он вынесен в отдельную базу, а в поле пароля стоит символ-заглушка, обычно x. Сама строка содержит поля, разделённые двоеточиями: имя, заглушку вместо пароля, UID, GID, полное имя или комментарий, домашний каталог, командную оболочку. Нам сейчас важны поля, которые показывают идентификаторы и привязку к домашнему каталогу.
Перед созданием проверим также имена обеих групп:
getent group courseguest
getent group courseteam
Продолжаем с этими именами только если они не заняты. Если заняты — выбираем другие, существующие записи не меняем.
Создаём учётную запись без пароля
Для создания учётной записи в Ubuntu используется команда adduser. Это отдельная программа, написанная как сценарий-обёртка, который вызывает низкоуровневые инструменты и заодно создаёт домашний каталог с копией стандартного скелета. Нам нужен вызов с двумя опциями:
sudo adduser --disabled-password --comment "" courseguest
Разберём обе опции, потому что за ними стоит важное различие. --comment "" задаёт пустое поле комментария. В выводе getent passwd оно называется GECOS-полем и обычно содержит полное имя пользователя. При интерактивном создании adduser задала бы вопросы об имени, телефоне и прочем — нам это не нужно, поэтому мы явно передаём пустую строку, чтобы команда не ждала ввода.
Опция --disabled-password требует большего внимания. Она отключает вход по паролю, но не блокирует учётную запись полностью. Это тонкий момент. В Ubuntu пароль хранится отдельно, и если его нет, войти по паролю нельзя. Однако существуют и другие способы аутентификации, например ключи SSH, о которых речь пойдёт в одном из следующих блоков. Для учебной записи мы не задаём пароль и не рассчитываем входить в неё по паролю. Ниже запустим нужную команду от её имени через уже знакомый механизм sudo.
После выполнения adduser система сообщит о создании пользователя и домашнего каталога. В Ubuntu 24.04 LTS, как и в предыдущих выпусках, по умолчанию создаётся персональная группа с тем же именем, что и пользователь. Поэтому у записи courseguest появится UID, GID и каталог /home/courseguest. Внутри каталога будет лежать копия файлов из /etc/skel — стандартного скелета домашнего каталога.
Проверим, что запись появилась:
getent passwd courseguest
Вывод условный, идентификаторы зависят от среды:
courseguest:x:1002:1002::/home/courseguest:/bin/bash
Пустой комментарий виден как два соседних двоеточия после GID. UID и GID в вашей системе могут быть другими.
Добавляем группу и включаем в неё пользователя
Теперь создадим отдельную группу courseteam. Она понадобится для упражнений с групповыми правами, но и сама по себе даст повод разобрать механизм дополнительных групп.
sudo addgroup courseteam
addgroup — аналог adduser для групп. В Ubuntu эта команда тоже существует в виде сценария, который добавляет группу в системную базу. Проверить результат можно тем же getent:
getent group courseteam
Вывод покажет строку с именем группы, заглушкой вместо пароля, GID и списком участников. Сразу после создания список участников пуст:
courseteam:x:1003:
Теперь добавим туда нашего пользователя. Для изменения учётной записи используется usermod — команда, которая умеет менять разные параметры пользователя, от комментария до списка групп. Нам нужна опция -aG: -G задаёт список дополнительных групп, а -a означает «добавить к уже существующему списку, а не заменить его».
sudo usermod -aG courseteam courseguest
Без -a опция -G перезаписала бы весь список дополнительных групп пользователя. Представьте, что пользователь уже состоит в группах cdrom и audio. Выполнение usermod -G courseteam courseguest оставило бы его только в courseteam, убрав прежние членства. С -a новые группы дополняют список. Это частая причина ошибок, когда администратор случайно убирает пользователя из всех групп одной командой.
Проверим, что членство применилось:
id courseguest
id с именем пользователя смотрит данные в базе учётных записей и показывает UID, первичную группу и все дополнительные группы:
uid=1002(courseguest) gid=1002(courseguest) groups=1002(courseguest),1003(courseteam)
Обратите внимание: та же команда без аргумента показывает идентификаторы текущего процесса, а не базы данных. Если выполнить id в нашем сеансе, вывод будет относиться к нам, а не к courseguest. С аргументом мы спрашиваем систему: какие группы назначены этой учётной записи? Без аргумента — под какой учётной записью выполняется текущий процесс? Разница кажется мелкой, но она важна: процесс может работать от имени пользователя, чьи групповые членства изменились, но процесс этого не увидит до пересоздания сеанса.
Проверяем работу от имени другого пользователя
Теперь у нас есть учётная запись, но пароля у неё нет. Как выполнить от её имени команду? Для этого существует механизм sudo с опцией -u. Мы уже использовали sudo для административных действий, но у sudo есть и другая роль — запустить команду от имени указанного пользователя.
sudo -u courseguest id
Разберём, что произошло. sudo без -u по умолчанию запускает команду от имени root. С опцией -u courseguest мы просим запустить id от имени учебной записи. В стандартной учебной установке административная учётная запись обычно имеет такое разрешение. Если политика sudo запрещает действие, не пытайтесь обходить её: для практики нужна ваша учебная Ubuntu с административным доступом. Сам courseguest в sudo мы не добавляем — учебная запись должна оставаться обычной.
Вывод этой команды покажет идентификаторы процесса, запущенного от имени courseguest:
uid=1002(courseguest) gid=1002(courseguest) groups=1002(courseguest),1003(courseteam)
Внешне он совпадает с предыдущим, но смысл другой. В первом случае id courseguest читала базу данных. Во втором случае sudo -u courseguest id создала новый процесс, который принадлежит пользователю courseguest, и уже внутри этого процесса id без аргументов прочитала идентификаторы текущего процесса. Совпадение не случайно: процесс получил ровно те группы, которые назначены записи.
Когда меняются группы процесса
Изменение записи через usermod не переписывает группы уже запущенных процессов. Для получения нового набора обычно нужен новый сеанс. Здесь мы сначала добавили группу, а потом запустили id через sudo -u, поэтому новый процесс получил актуальный набор.
Удаляем учебные объекты
Учебная запись выполнила свою задачу: мы создали её, посмотрели на неё изнутри и поняли, как устроены дополнительные группы. Теперь её нужно удалить, чтобы не оставлять в системе лишних пользователей. Перед продолжением убедитесь, что это именно созданная сейчас учебная запись, а её домашний каталог не использовался для нужных файлов. Следующая команда удаляет запись и её домашние данные. Для удаления в Ubuntu есть команда deluser:
sudo deluser --remove-home courseguest
Опция --remove-home удаляет домашний каталог вместе со всем содержимым. Это опасное действие, если внутри лежат нужные файлы. В нашем случае каталог /home/courseguest был создан несколько минут назад, и содержит только стандартные файлы, скопированные при создании. Удаление этой записи не заденет других пользователей и их данные.
После удаления пользователя убедимся, что запись исчезла:
getent passwd courseguest
Пустой вывод подтверждает, что база учётных данных больше не содержит такой записи.
Теперь удалим группу:
sudo delgroup courseteam
delgroup откажется удалять группу, если она всё ещё является первичной для какого-либо пользователя. Группа courseteam была только дополнительной для нашей удалённой записи. Автоматическое удаление персональной группы courseguest зависит от настройки deluser; это можно отдельно проверить через getent group courseguest.
Проверим, что и группа исчезла:
getent group courseteam
Пустой вывод означает, что в базе групп такой записи больше нет.
Мы создали отдельную учебную учётную запись courseguest, проверив предварительно через getent passwd, что имя свободно. Для создания использовалась команда sudo adduser --disabled-password --comment "" courseguest: первая опция не стала задавать пароль, а вторая — пустой комментарий. Затем мы создали группу courseteam командой sudo addgroup courseteam и добавили в неё пользователя через sudo usermod -aG courseteam courseguest. Опция -a добавила группу к списку, не заменив остальные; без неё -G перезаписала бы все дополнительные группы записи.
Проверки показали, что id courseguest читает данные из базы учётных записей, а id без аргумента — идентификаторы текущего процесса. Запуск sudo -u courseguest id создал процесс от имени учебной записи, и он увидел актуальный список групп. В конце мы удалили созданные объекты: сначала пользователя с домашним каталогом командой sudo deluser --remove-home courseguest, затем группу командой sudo delgroup courseteam. Системные учётные записи и группы мы не изменяли и не удаляли.
Вы готовите стенд для проверки групповых прав и хотите временно завести учётную запись courseguest. Главное — не задеть существующие учётные данные и точно понимать разницу между добавлением группы и перезаписью всего списка.
Предсказать результат usermod -aG и usermod -G
Пользователь уже состоит в дополнительных группах cdrom и audio. Нужно добавить его в courseteam, не потеряв прежние членства.
Итоговый список дополнительных групп после usermod -G courseteam courseguest?
Безопасная процедура работы с учебной записью
Нужно создать временную учётную запись для проверки групповых прав. Вы не хотите задавать ей пароль и не хотите оставлять следов после завершения практики.
Опишите последовательность команд для безопасного создания учебной записи courseguest с отключённым входом по паролю, добавления её в новую группу courseteam и последующего удаления всех созданных объектов. Укажите, какие проверки нужно выполнить перед созданием и после удаления. Формат: нумерованный список команд с краткими комментариями. Это план для отдельного учебного стенда: команды создания и удаления в ответе выполнять не нужно. Проверяйте также, что домашний каталог не содержит уже существующих данных.