Группы пользователей Linux и права доступа к файлам

LinuxBeginner
Практиковаться сейчас

Введение

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

В этой лабораторной работе вы создадите небольшую командную среду с отдельными учебными учётными записями. Вы создадите пользователя, настроите членство в группах, защитите файл, проверите блокировку учётной записи, зададите права по умолчанию с помощью umask, а также настроите каталоги со sticky-битом и setgid. Все действия выполняются внутри лабораторной среды и не изменяют стандартный путь входа labex.

Проверка идентификаторов и создание учебного пользователя

На этом шаге вы проверите текущую учётную запись и создадите отдельную учётную запись для упражнений с правами доступа. Linux представляет пользователя именем и числовым идентификатором пользователя (UID). Также система хранит идентификатор основной группы (GID) и список дополнительных групп.

Сначала проверьте идентификатор пользователя текущей оболочки:

whoami

В выводе должно быть labex. Теперь выведите UID, основную группу и дополнительные группы этой учётной записи:

id

Точные числовые идентификаторы могут отличаться, но в выводе они будут обозначены как uid, gid и groups.

Создание учётной записи изменяет системные файлы, поэтому требует административных прав. sudo означает «выполнить от имени суперпользователя»: после проверки разрешений текущей учётной записи команда запускается с повышенными правами. Используйте sudo только для команды, которой действительно нужны административные права, и полностью прочитайте команду перед нажатием Enter.

В следующей команде useradd используются три параметра:

  • -m создаёт домашний каталог.
  • -U создаёт одноимённую основную группу.
  • -s /bin/bash назначает Bash оболочкой входа в систему.

Создайте учебного пользователя с именем jack:

sudo useradd -m -U -s /bin/bash jack

Проверьте новую учётную запись и её домашний каталог:

id jack
ls -ld /home/jack

В выводе id должно быть указано, что jack — это и пользователь, и основная группа. В списке каталога должно быть видно, что /home/jack существует и принадлежит jack:jack.

Управление дополнительными группами

На этом шаге вы создадите командную группу и добавите пользователей в дополнительные группы. Основная группа пользователя обычно становится владельцем группы для новых файлов. Дополнительные группы предоставляют доступ к другим общим ресурсам.

Создайте группу с именем developers:

sudo groupadd developers

Параметры usermod -aG означают «добавить в дополнительные группы». Параметр -a важен: без него -G может заменить существующее членство в дополнительных группах. Добавьте jack в группы developers и sudo:

sudo usermod -aG developers,sudo jack

Также добавьте labex в группу developers. Текущая оболочка не получит новые групповые права сразу; безопасно обновить их вы сможете на последнем шаге.

sudo usermod -aG developers labex

Проверьте обе учётные записи:

groups jack
groups labex

В первом выводе должны присутствовать jack, developers и sudo. Во втором должна присутствовать developers. Членство в sudo позволяет аутентифицированной учётной записи запрашивать повышенные права; предоставляйте его только доверенным администраторам.

Управление владельцем и правами доступа к файлу

На этом шаге вы защитите командный отчёт, назначив ему определённых владельца, группу и режим доступа. Подробный список сначала показывает тип файла, а затем три тройки прав для владельца, группы и остальных пользователей.

Создайте пустой отчёт в каталоге проекта:

touch /home/labex/project/secure-report.txt

Измените владельца и группу с помощью формы user:group команды chown:

sudo chown jack:developers /home/labex/project/secure-report.txt

Установите режим 640:

sudo chmod 640 /home/labex/project/secure-report.txt

В числовой записи право чтения обозначается 4, записи — 2, выполнения — 1. Поэтому:

  • Владелец 6 означает чтение и запись (4 + 2).
  • Группа 4 означает только чтение.
  • Остальные пользователи 0 не имеют доступа.

Проверьте результат:

ls -l /home/labex/project/secure-report.txt
stat -c 'owner=%U group=%G mode=%a' /home/labex/project/secure-report.txt

Стабильные поля stat должны показать owner=jack group=developers mode=640.

Проверка и изменение блокировки учётной записи

На этом шаге вы временно заблокируете и разблокируете отдельную учётную запись. Linux хранит хеши паролей и состояние учётных записей в /etc/shadow. Символ ! в начале поля пароля означает, что аутентификация по паролю заблокирована.

В рамках подготовки была создана учебная учётная запись contractor. Выведите только первый символ её поля пароля, чтобы сам хеш никогда не отображался. Читайте конвейер слева направо: getent shadow contractor получает запись учётной записи из shadow-базы; первый cut использует : как разделитель и выбирает поле 2; второй cut оставляет первый символ этого поля:

sudo getent shadow contractor | cut -d: -f2 | cut -c1

Обычно первым символом должен быть $ — начало современного формата хеша пароля. Заблокируйте учётную запись с помощью usermod -L:

sudo usermod -L contractor

Снова проверьте первый символ:

sudo getent shadow contractor | cut -d: -f2 | cut -c1

Теперь это должен быть !. Разблокируйте учётную запись с помощью usermod -U и убедитесь, что ! исчез:

sudo usermod -U contractor
sudo getent shadow contractor | cut -d: -f2 | cut -c1

В рамках этого сценария подрядчик больше не работает в команде. Заблокируйте учётную запись в последний раз, сохранив её файлы:

sudo usermod -L contractor

Блокировка аутентификации по паролю не удаляет учётную запись, не удаляет её домашний каталог и не обязательно завершает уже существующие сеансы. Это не то же самое, что удаление пользователя; такой способ полезен, когда файлы нужно сохранить для проверки.

Управление правами по умолчанию с помощью umask

На этом шаге вы используете umask, чтобы управлять битами прав, которые удаляются при создании новых файлов и каталогов оболочкой. Обычно программы начинают с максимального режима 666 для обычных файлов и 777 для каталогов. Маска 027 удаляет право записи у группы и все права у остальных пользователей.

Создайте рабочий каталог для эксперимента:

mkdir -p /home/labex/project/umask-demo

Сохраните текущую маску, чтобы позже восстановить её. Синтаксис $(command) называется подстановкой команды: оболочка выполняет команду в скобках и заменяет всё выражение её выводом. Присваивание сохраняет этот результат в переменной original_umask; как и в других присваиваниях оболочки, вокруг = не должно быть пробелов.

original_umask=$(umask)

Примените маску 027, затем создайте файл и каталог:

umask 027
touch /home/labex/project/umask-demo/private-note.txt
mkdir /home/labex/project/umask-demo/private-dir

Проверьте получившиеся числовые режимы:

stat -c '%a %n' /home/labex/project/umask-demo/private-note.txt /home/labex/project/umask-demo/private-dir

Файл должен иметь режим 640, а каталог — режим 750. Исполняемые права для файлов автоматически не назначаются. Восстановите исходную маску оболочки:

umask "$original_umask"

Изменение umask влияет на объекты, созданные после этого; права уже существующих объектов оно не изменяет.

Защита общего каталога с помощью sticky-бита

На этом шаге вы настроите общедоступный каталог для обмена файлами: любой пользователь сможет создавать файлы, но не сможет удалять файлы, принадлежащие другому пользователю. Обычный режим 777 предоставляет всем пользователям полный доступ к каталогу. Добавление sticky-бита изменяет правила удаления файлов внутри каталога.

Создайте общий каталог и установите режим 1777. Начальная 1 включает sticky-бит.

mkdir /tmp/shared-dropbox
chmod 1777 /tmp/shared-dropbox

С помощью sudo -u создайте по одному файлу от имени каждой учебной учётной записи:

sudo -u jack touch /tmp/shared-dropbox/jack-note.txt
sudo -u contractor touch /tmp/shared-dropbox/contractor-note.txt

Теперь попросите jack удалить файл подрядчика:

sudo -u jack rm /tmp/shared-dropbox/contractor-note.txt

Эта ошибка ожидаема. Вы должны увидеть Operation not permitted, а файл подрядчика должен остаться. Проверьте каталог:

ls -ld /tmp/shared-dropbox

Права должны заканчиваться строчной t, например drwxrwxrwt. Строчная t означает, что sticky-бит и право выполнения для остальных пользователей установлены. Прописная T означала бы, что sticky-бит установлен без соответствующего права выполнения.

Настройка командного каталога с setgid

На этом шаге вы подготовите закрытый каталог для совместной работы. Для каталога setgid заставляет новые дочерние объекты наследовать группу каталога, а не основную группу создателя. Благодаря этому файлы команды остаются связанными с одной общей группой.

Создайте каталог:

mkdir /home/labex/project/team-share

Назначьте jack владельцем, а developers — группой-владельцем:

sudo chown jack:developers /home/labex/project/team-share

Установите режим 2770. Начальная 2 включает setgid; 770 предоставляет полный доступ владельцу и группе и запрещает доступ остальным пользователям.

sudo chmod 2770 /home/labex/project/team-share

Проверьте результат:

ls -ld /home/labex/project/team-share
stat -c 'owner=%U group=%G mode=%a' /home/labex/project/team-share

В подробном списке должна отображаться s на месте права выполнения группы, например drwxrws---. Строчная s означает, что одновременно активны setgid и право выполнения для группы. Прописная S означала бы, что setgid установлен, но право выполнения для группы отсутствует.

Setuid, обозначаемый символом s на месте права выполнения владельца, — ещё один специальный бит, который часто встречается у тщательно контролируемых системных исполняемых файлов. Умейте распознавать его при чтении прав, но не добавляйте его к произвольным программам.

Обновление членства в группе и проверка наследования

На этом шаге вы активируете членство в developers во вложенной оболочке и убедитесь, что setgid управляет группой нового файла. Добавление пользователя в /etc/group не обновляет дополнительные группы уже запущенной оболочки.

Запустите вложенную оболочку, назначив developers активной группой:

newgrp developers

Приглашение оболочки может обновиться. Вы по-прежнему являетесь пользователем labex, но вложенная оболочка теперь использует developers как эффективную группу. Проверьте оба идентификатора:

id

Создайте файл в каталоге с setgid:

touch /home/labex/project/team-share/labex-note.txt

Проверьте новый файл:

stat -c 'owner=%U group=%G mode=%a' /home/labex/project/team-share/labex-note.txt

Владельцем должен быть labex, а группой — developers. Setgid наследует группу-владельца; права чтения и записи файла по-прежнему зависят от процесса, который его создаёт, и его umask.

Выйдите из вложенной оболочки и вернитесь к исходному сеансу терминала:

exit

После закрытия вложенной оболочки файл останется на месте.

Итоги

Вы изучили основную модель идентификации и управления доступом, используемую в системах Linux. Вы создали пользователя и командную группу, настроили членство в дополнительных группах, назначили владельцев и сопоставили числовые режимы прав с практическими правилами доступа. Кроме того, вы проверили блокировку учётной записи, не раскрывая её хеш пароля.

Затем вы рассмотрели возможности за пределами обычных прав: umask управлял правами по умолчанию, sticky-бит защищал файлы в общедоступном каталоге, а setgid сохранял групповое владение командными файлами в закрытом каталоге для совместной работы. В конце вы использовали newgrp для обновления членства в группе и проверили унаследованную группу на реальном файле.