← Все статьи
INFRASTRUCTURE

Работа с правами доступа в Linux

Как устроены владельцы, группы и права доступа в Linux: chmod, chown, числовая запись, диагностика Permission denied и безопасная настройка каталогов.

Содержание статьи
  1. Зачем нужны права доступа
  2. Что нужно для практики
  3. Владелец, группа и остальные пользователи
  4. Три базовых права
  5. Символьная запись прав
  6. Числовая запись: 755 и 644
  7. Владелец и группа
  8. Как диагностировать ошибку Permission denied
  9. Особые права: setgid и umask
  10. Безопасная последовательность изменения прав
  11. Частые ошибки
  12. Использовать `chmod 777`
  13. Забыть про право каталога `x`
  14. Выдать `x` всем файлам рекурсивно
  15. Менять владельца работающего сервиса без проверки
  16. Что дальше

Зачем нужны права доступа

Права доступа в 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--

Они относятся к:

  1. владельцу файла;
  2. группе файла;
  3. всем остальным пользователям.

В строке также видны количество жёстких ссылок, владелец, группа, размер и время изменения. Получить владельца и группу в более удобном виде можно так:

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 в профиле пользователя, пока не понимаете, какие скрипты и сервисы от неё зависят.

Безопасная последовательность изменения прав

Перед изменением прав действуйте по шагам:

  1. Определите, какой пользователь и сервис должны работать с объектом.
  2. Сохраните текущие права: stat -c '%A %a %U %G %n' путь.
  3. Проверьте путь и содержимое каталога.
  4. Измените только необходимое право, например chmod u+x script.sh.
  5. Проверьте доступ от имени нужного пользователя.
  6. Посмотрите логи сервиса, если проблема связана с приложением.

Для конфигураций с секретами отдельно проверьте права после копирования и восстановления из 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.

Материал подготовил Злой админ