Пара 5: Пользователи, права доступа и файловые объекты

90 минут · 3 курс, ML.

Содержание и результат

Читать права Linux и устранять отказ в доступе без chmod 777.

План занятия

0–10: контекст и исходная задача. 10–40: устройство и механизмы. 40–55: демонстрация команд. 55–80: лабораторная работа. 80–90: разбор результата и фиксация исправлений.

Практика выполняется в своей учебной папке и на localhost. Подготовка окружения описана в lab/README.md.

Владелец, группа, остальные

Доступ проверяется для конкретного пользователя и объекта.

ls -l показывает тип, права, владельца и группу. Девять битов rwx разбиты на владельца, группу и остальных. Для файла r — читать, w — менять содержимое, x — запускать. Для каталога x позволяет проходить по пути, r — перечислять имена, w вместе с нужными правами позволяет менять записи. Удаление определяется правами родительского каталога, а не только правом записи самого файла. Это важный поворот для студентов: права — не характеристика «могу всё», а правила конкретной операции. Сначала выясняем пользователя id и путь namei -l, затем меняем минимальные права.

Аналогия: пропуск в коридор и ключ от комнаты — разные разрешения.

Числа прав

4 = чтение, 2 = запись, 1 = выполнение.

Числовая запись суммирует биты: 6 означает чтение и запись, 5 — чтение и выполнение, 7 — всё. 640 даёт владельцу rw, группе r и остальным ничего; 750 подходит для каталога или программы с ограниченным доступом. Символьная запись chmod u+x иногда понятнее числа, потому что добавляет конкретное право. umask ограничивает начальные права новых файлов, но не исправляет существующие. Не превращаем 777 в универсальный рецепт: это часто маскирует неправильного владельца, путь или пользователя процесса. В WSL изучаем права на Linux-файловой системе в /home, поведение /mnt/c может зависеть от параметров монтирования.

Права не шифруют файл и не защищают от администратора системы.

sudo и секреты

Повышаем привилегии только для обоснованной операции.

sudo запускает разрешённую команду с другой идентичностью, часто root. Root может повредить систему; наличие sudo не означает, что его нужно ставить перед python или git. Секреты не кладём в репозиторий и не показываем на общем экране. .env — просто файл, а не защищённое хранилище. Ограничьте права учебного файла chmod 600 и добавьте .env в .gitignore позже. В учебных упражнениях применяем фиктивные значения. Если реальный секрет попал в историю Git, удалить строку недостаточно: секрет нужно отозвать и заменить. Здесь это принцип, а не требование настраивать корпоративный vault.

Аналогия: мастер-ключ не используют, чтобы открыть собственный письменный стол.

Команды и наблюдения

Окружение: Ubuntu / Bash.

cd ~/devops-course/sandbox
printf "demo-only
" > private.env
chmod 600 private.env
ls -l private.env
id
printf "#!/usr/bin/env bash
printf 'hello\n'
" > hello.sh
chmod u+x hello.sh
./hello.sh

Значение demo-only не является настоящим секретом. Обсудите разницу ./hello.sh и bash hello.sh: во втором случае файл читает интерпретатор.

Ожидаемый результат: private.env имеет -rw-------; hello.sh запускается после добавления x владельцу.

Вариант для macOS

Основные rwx и chmod переносимы. namei -l отсутствует: проверяйте каждый родительский каталог через ls -ld, а ACL через ls -le. macOS дополнительно применяет ACL, privacy-разрешения и системные защиты; Permission denied не всегда объясняется только девятью битами.

id
ls -l private.env
chmod 600 private.env
chmod u+x hello.sh
ls -lde . private.env

Практика: Исправить доступ по доказательствам

  1. Создайте run.sh без executable-бита; воспроизведите отказ через ./run.sh.
  2. Проверьте владельца и права, исправьте только право запуска владельца.
  3. Создайте вложенный каталог и уберите u+x; покажите проблему прохода, затем восстановите право.
  4. Объясните, почему chmod 777 и sudo bash не являются хорошим исправлением.

Результат: До/после прав и объяснение причины каждого отказа.

Проверка: Скрипт работает без sudo; секретный учебный файл имеет права 600.

Неисправность для разбора: Ошибка возникает на родительском каталоге, а не на самом файле.

Решение и диагностика

Проверьте id, ls -l run.sh, namei -l путь. Для собственного файла chmod u+x run.sh. Для собственного каталога chmod u+x nested. Не делайте рекурсивную смену прав на домашней папке. Если студент случайно ограничил каталог, сохраняйте открытый терминал и восстанавливайте права конкретного каталога из его родителя.

Основные выводы

Самостоятельная работа

Описать минимальные права для кода, конфигурации и каталога данных учебного сервиса.

Источники