Работа с правами доступа в Linux
Как устроены владельцы, группы и права доступа в Linux: chmod, chown, числовая запись, диагностика Permission denied и безопасная настройка каталогов.
Содержание статьи
- Зачем нужны права доступа
- Что нужно для практики
- Владелец, группа и остальные пользователи
- Три базовых права
- Символьная запись прав
- Числовая запись: 755 и 644
- Владелец и группа
- Как диагностировать ошибку Permission denied
- Особые права: setgid и umask
- Безопасная последовательность изменения прав
- Частые ошибки
- Использовать `chmod 777`
- Забыть про право каталога `x`
- Выдать `x` всем файлам рекурсивно
- Менять владельца работающего сервиса без проверки
- Что дальше
Зачем нужны права доступа
Права доступа в Linux определяют, кто может читать, изменять и запускать файл. Это не формальность: корректная модель прав защищает конфигурации, секреты и данные сервисов от случайного изменения и лишнего доступа.
В этой статье разберём владельца и группу файла, три базовых права (r, w, x), числовую запись вроде 755, команды chmod, chown и chgrp, а также типичные ошибки при настройке каталогов.
Что нужно для практики
Понадобится Linux-система или виртуальная машина с терминалом. Команды можно выполнять обычным пользователем в домашнем каталоге. Для изменения владельца и некоторых системных файлов понадобится sudo.
Создадим безопасный учебный каталог:
mkdir -p ~/linux-permissions-lab/project
cd ~/linux-permissions-lab
printf 'черновик\n' > project/notes.txt
printf '#!/bin/sh\nprintf "hello\\n"\n' > project/hello.sh
Не проводите эксперименты с chmod -R в /, /etc, /var или в каталоге приложения без резервной копии и понимания последствий.
Владелец, группа и остальные пользователи
Для просмотра прав используйте ls -l:
ls -l project
Пример строки:
-rw-r--r-- 1 alice developers 18 Aug 23 16:20 notes.txt
Первый символ обозначает тип объекта: - — обычный файл, d — каталог, l — символическая ссылка. Следующие девять символов разбиты на три тройки:
-rw- r-- r--
Они относятся к:
- владельцу файла;
- группе файла;
- всем остальным пользователям.
В строке также видны количество жёстких ссылок, владелец, группа, размер и время изменения. Получить владельца и группу в более удобном виде можно так:
stat -c '%A %a %U %G %n' project/notes.txt
В macOS формат stat отличается, поэтому для этой статьи команды выполняются именно в Linux.
Три базовых права
Для обычного файла права имеют следующий смысл:
r(read) — читать содержимое;w(write) — изменять или очищать содержимое;x(execute) — запускать файл как программу.
Для каталога значения немного другие:
r— просматривать список имён внутри каталога;w— создавать, удалять и переименовывать элементы;x— заходить в каталог и обращаться к объектам внутри него по имени.
Особенно важно право x для каталогов. Например, пользователь может видеть имена файлов при наличии r, но без x не сможет открыть конкретный файл. И наоборот, при наличии x можно обратиться к известному имени, даже если список каталога недоступен.
Символьная запись прав
Сделаем скрипт исполняемым только для владельца:
chmod u+x project/hello.sh
./project/hello.sh
Здесь u — владелец (user), + добавляет право, а x означает запуск. Для группы используется g, для остальных — o, для всех сразу — a:
chmod g+r project/notes.txt
chmod o-r project/notes.txt
chmod a-x project/notes.txt
Можно задать права точнее, перечислив каждую группу:
chmod u=rw,g=r,o= project/notes.txt
После этой команды владелец читает и изменяет файл, группа только читает, остальные не имеют доступа.
Для каталога часто нужны права rwx владельцу и rx остальным:
chmod u=rwx,g=rx,o=rx project
Команда chmod изменяет права самого объекта. Если нужно изменить всё содержимое каталога, применяется -R, но использовать его нужно осторожно:
chmod -R u=rwX,go=rX project
Заглавная X добавляет право выполнения только каталогам и файлам, которые уже были исполняемыми. Это безопаснее, чем бездумно выдавать +x всем файлам проекта.
Числовая запись: 755 и 644
Каждое право имеет числовое значение:
r= 4;w= 2;x= 1.
Значения складываются для владельца, группы и остальных:
7 = 4 + 2 + 1 = rwx
6 = 4 + 2 = rw-
5 = 4 + 1 = r-x
4 = 4 = r--
0 = = ---
Например:
chmod 644 project/notes.txt
chmod 755 project/hello.sh
chmod 755 project
644 означает rw-r--r--: владелец может читать и изменять файл, остальные — только читать. 755 означает rwxr-xr-x: владелец может изменять и запускать, остальные — читать и запускать.
Для приватного файла с секретом обычно используют:
chmod 600 .env
Это rw-------: доступ есть только у владельца. Для приватного каталога:
chmod 700 private-data
Не копируйте 777 как универсальное решение. Права rwxrwxrwx позволяют любому пользователю изменять и запускать содержимое, что часто превращает проблему доступа в уязвимость.
Владелец и группа
Посмотреть текущего пользователя и его группы:
id
whoami
groups
Изменить группу файла можно командой chgrp:
sudo chgrp developers project/notes.txt
Изменить владельца и группу — chown:
sudo chown alice:developers project/notes.txt
Для каталога вместе с содержимым используется -R:
sudo chown -R alice:developers /srv/example-app
Перед рекурсивным изменением проверьте путь командой pwd и содержимое через ls. Ошибка в пути после sudo может затронуть чужие файлы.
Практичная схема для каталога приложения: владелец — пользователь или сервис, который должен изменять файлы, группа — команда эксплуатации, остальные — без доступа либо только с чтением. Конкретная схема зависит от сервиса; нельзя менять владельца работающего приложения по шаблону без проверки документации.
Как диагностировать ошибку Permission denied
Если команда вернула Permission denied, не начинайте с chmod 777. Сначала выясните, на каком объекте возникает отказ:
namei -l /path/to/file
ls -ld /path /path/to /path/to/file
id
namei -l показывает права каждого каталога в пути. Для чтения файла нужны права на сам файл и право прохода x на всех каталогах выше него.
Проверьте, что файл действительно исполняемый и содержит корректный интерпретатор:
ls -l ./project/hello.sh
head -n 1 ./project/hello.sh
file ./project/hello.sh
Если файл запускается через оболочку, можно временно проверить содержимое без права выполнения:
sh ./project/hello.sh
Это помогает отделить проблему прав от ошибки в скрипте.
Особые права: setgid и umask
Для совместной рабочей директории удобно установить setgid на каталог. Новые файлы будут наследовать его группу:
sudo chgrp -R developers /srv/team
sudo chmod 2775 /srv/team
Первая цифра 2 включает setgid для каталога. Все участники должны состоять в группе developers, а политика создания файлов должна учитывать umask.
Посмотреть текущую маску:
umask
umask ограничивает права, которые выдаются новым файлам и каталогам. Например, значение 022 обычно приводит к созданию файлов с базовыми правами 644, а каталогов — 755. Не меняйте глобальную umask в профиле пользователя, пока не понимаете, какие скрипты и сервисы от неё зависят.
Безопасная последовательность изменения прав
Перед изменением прав действуйте по шагам:
- Определите, какой пользователь и сервис должны работать с объектом.
- Сохраните текущие права:
stat -c '%A %a %U %G %n' путь. - Проверьте путь и содержимое каталога.
- Измените только необходимое право, например
chmod u+x script.sh. - Проверьте доступ от имени нужного пользователя.
- Посмотрите логи сервиса, если проблема связана с приложением.
Для конфигураций с секретами отдельно проверьте права после копирования и восстановления из backup:
find /srv/example-app -maxdepth 2 -type f -name '*.env' -exec stat -c '%a %U:%G %n' {} \;
Backup должен сохранять владельцев и права. При архивировании это зависит от используемых параметров и пользователя, который выполняет операцию; восстановление всегда нужно проверять отдельно.
Частые ошибки
Использовать chmod 777
Это скрывает первопричину и даёт лишние полномочия всем пользователям. Лучше определить владельца, группу и минимальный набор прав.
Забыть про право каталога x
Права файла могут выглядеть правильно, но доступ будет запрещён из-за одного каталога в пути.
Выдать x всем файлам рекурсивно
Текстовые файлы, конфигурации и backup не должны становиться исполняемыми без причины. Для каталогов и скриптов задавайте права отдельно или используйте X.
Менять владельца работающего сервиса без проверки
Процесс может запускаться от отдельного системного пользователя. После chown он потеряет доступ к файлам или, наоборот, получит доступ к секретам, который ему не нужен.
Что дальше
Теперь можно перейти к поиску файлов и фильтрации вывода: find, grep, awk, sort и xargs. Эти инструменты особенно полезны после понимания прав доступа — иначе поиск и диагностика часто упираются в Permission denied.
Следующая статья серии: Поиск и фильтрация в Linux.