Введение
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 для обновления членства в группе и проверили унаследованную группу на реальном файле.



