Полный гайд по правам доступа к файлам в Linux: chmod, chown и не только
Права доступа к файлам в Linux определяют, кто может читать, изменять, выполнять файлы и каталоги или получать к ним доступ. Они влияют на повседневную работу с сервером, включая развёртывание, SSH-ключи, скрипты, загрузку файлов, резервные копии, журналы и общие папки.
Этот гайд предназначен для разработчиков, администраторов, начинающих DevOps-специалистов, владельцев сайтов и всех, кто работает с Linux через терминал. Вам понадобятся только доступ к командной строке и базовые инструменты, такие как ls, chmod, chown, chgrp и find.
Если вы управляете сайтами, приложениями, скриптами или базами данных на Linux VPS-сервере, понимание прав доступа к файлам помогает находить настоящую причину проблем с доступом, а не полагаться на небезопасные решения вроде chmod 777.
Модель прав доступа в Linux
Права доступа в Linux построены вокруг трёх уровней доступа: пользователь, группа и остальные. Пользователь - это владелец файла или каталога. Группа позволяет нескольким учётным записям совместно иметь контролируемый доступ. Остальные - это все прочие в системе.
Эта модель проста, но практична для реальной работы с сервером. Пользователь для развёртывания может управлять файлами приложения, группа веб-сервера может читать то, что ей нужно, а посторонним пользователям можно запретить изменять конфиденциальные данные.
Linux также использует три основных типа прав: чтение, запись и выполнение. Они кажутся простыми, но для файлов и каталогов ведут себя по-разному, и именно с этого начинаются многие ошибки с правами доступа.
Пользователи, группы и остальные, чтение, запись, выполнение: что даёт каждое право
У каждого файла и каталога есть владелец и группа. При запросе доступа Linux проверяет права в следующем порядке: сначала владелец, затем группа, затем остальные. Используется только первая подходящая категория, поэтому права не суммируются.
Каждая категория может иметь доступ на чтение, запись и выполнение. Для файлов чтение означает просмотр содержимого, запись означает редактирование, а выполнение означает запуск файла как скрипта или программы. Для каталогов чтение означает просмотр списка элементов, запись означает создание или удаление элементов, а выполнение означает вход в каталог.
Последний пункт очень важен. Без права на выполнение для каталога пользователь может видеть его имя, но всё равно не сможет получить доступ к файлам внутри. Именно поэтому проверка прав должна охватывать весь путь, а не только конечный файл.
Как проверить права доступа к файлам в Linux
Самая распространённая команда для проверки прав доступа к файлам в Linux:
ls -l
Типичная строка вывода может выглядеть так:
-rwxr-xr-- 1 deploy www-data 2048 May 8 app.sh
Первый символ показывает тип файла. Обычный файл начинается с -, а каталог - с d. Следующие девять символов показывают права для владельца, группы и остальных. В этом примере rwx принадлежит владельцу, r-x принадлежит группе, а r-- принадлежит остальным.
Владелец - deploy, а группа - www-data. Это означает, что пользователь deploy получает права владельца, а пользователи группы www-data получают права группы. Все остальные получают права для остальных.
Как читать вывод ls -l, восьмеричная и символьная нотация
Строка прав всегда имеет одинаковую структуру. Первый символ определяет тип объекта. Следующие три символа принадлежат владельцу. Следующие три принадлежат группе. Последние три принадлежат остальным.
Например:
drwxr-xr-x
Это каталог, поскольку строка начинается с d. Владелец может читать его, записывать в него и входить в него. Группа может читать его и входить в него. Остальные также могут читать его и входить в него, но не могут создавать или удалять в нём файлы.
Для обычного файла вы можете увидеть:
-rw-r--r--
Это означает, что владелец может читать и записывать, а группа и остальные могут только читать. Это распространённый шаблон прав для публичных файлов сайта, статических ресурсов и документов, которые должны быть доступны для просмотра, но не для редактирования всеми.
Права доступа в Linux можно записывать в символьной или восьмеричной нотации. Символьная нотация использует буквы, такие как r, w и x. Восьмеричная нотация использует числа, где чтение равно 4, запись 2, а выполнение 1.
Для каждого уровня доступа числа складываются. Чтение и запись дают 6. Чтение и выполнение дают 5. Чтение, запись и выполнение дают 7. Отсутствие прав даёт 0. Значение вроде 755 означает, что владелец получает 7, группа 5, а остальные 5. В символьной форме это rwxr-xr-x. Значение вроде 644 означает, что владелец может читать и записывать, а группа и остальные могут только читать.
Как изменить права доступа к файлам с помощью chmod
Команда chmod изменяет права доступа к файлам и каталогам. Она поддерживает два формата: символьный режим и числовой режим.
Символьный режим лучше всего подходит для небольших изменений, например чтобы добавить скрипту право на выполнение, ничего больше не меняя. Числовой режим быстрее, когда вы уже знаете точное значение прав, например 755 для каталогов или 644 для обычных файлов.
Распространённые значения прав: символьный режим (chmod u+x, chmod go-w), числовой режим (chmod 755, chmod 644)
Символьный режим использует буквы категорий, операторы и буквы прав. Буквы категорий: u для пользователя, g для группы, o для остальных и a для всех. Операторы: + чтобы добавить право, - чтобы убрать право, и = чтобы задать права точно.
Например:
chmod u+x script.sh
Эта команда добавляет право на выполнение для владельца. Её часто используют, когда скрипт существует, но его нельзя запустить напрямую.
Ещё одна полезная команда:
chmod go-w file.txt
Она убирает право на запись у группы и остальных. Это полезно, когда файл должен оставаться доступным для чтения, но редактировать его должен только владелец.
Числовой режим задаёт полное значение прав одной командой. Например:
chmod 755 script.sh
Это позволяет владельцу читать, записывать и выполнять файл, а группе и остальным читать и выполнять его.
Ещё одна распространённая команда:
chmod 644 index.html
Это позволяет владельцу редактировать файл, а группе и остальным только читать его. Это распространённая настройка для файлов сайта.
|
Значение прав |
Типичное применение |
Что это означает |
Примечание по безопасности |
|
755 |
Каталоги и исполняемые скрипты |
Владелец может читать, записывать и выполнять. Группа и остальные могут читать и выполнять |
Хорошо подходит для каталогов, которые должны быть доступны, но не открыты для записи всем |
|
644 |
Обычные файлы сайта, документы, публичные файлы для чтения |
Владелец может читать и записывать. Группа и остальные могут только читать |
Хорошее значение по умолчанию для многих веб-файлов и статических ресурсов |
|
777 |
Почти никогда не подходит для продакшна |
Все могут читать, записывать и выполнять |
Опасно, поскольку любой пользователь или процесс может изменить элемент |
Значение 777 заслуживает строгого предупреждения. Оно даёт полный доступ всем в системе. На публичном сервере, в общей среде или на Rocky Linux VPS это может позволить уязвимым скриптам, скомпрометированным пользователям или вредоносным процессам изменять файлы, которые должны быть защищены. В большинстве случаев chmod 777 не решает настоящую проблему. Эта команда лишь скрывает более глубокую проблему с владельцем, членством в группе, служебными пользователями или настройками приложения.
Смена владельца файла с помощью chown и chgrp
Права определяют, что могут делать владелец, группа и остальные. Владение определяет, кто именно является владельцем и группой. Именно поэтому chmod и chown решают разные задачи.
Базовый синтаксис для смены владельца:
chown user file
Чтобы сменить и владельца, и группу, используйте:
chown user:group file
Чтобы сменить только группу, используйте:
chown :group file
Сменить только группу также можно так:
chgrp group file
Например:
chown deploy:www-data /var/www/example.com
Эта команда делает deploy владельцем, а www-data группой. В веб-проекте это позволяет пользователю для развёртывания управлять файлами, одновременно предоставляя веб-серверу контролируемый доступ через группу.
Рекурсивно сменить владельца можно с помощью:
chown -R user:group directory
Рекурсию следует использовать осторожно, поскольку она меняет владельца для каждого элемента внутри целевого каталога. Прежде чем рекурсивно менять владельца, проверьте путь с помощью pwd, просмотрите цель с помощью ls и убедитесь, что по ошибке не применяете изменения к широкому системному каталогу.
Практическая разница проста. Используйте chmod, когда файл принадлежит правильному пользователю, но уровень доступа неверный. Используйте chown или chgrp, когда файл принадлежит не тому пользователю или группе.
Рекурсивное изменение прав
Рекурсивное изменение прав применяет правило ко всему дереву каталогов. Оно полезно при развёртывании, миграциях, резервном копировании и очистке, но вместе с тем это один из самых быстрых способов создать проблемы с правами доступа.
Рискованная команда выглядит так:
chmod -R 755 /var/www/example.com
Она применяет 755 к каждому файлу и каталогу. Каталогам часто нужно право на выполнение, поскольку пользователи и службы должны входить в них, но обычным файлам право на выполнение, как правило, не нужно. Если применить одинаковое значение ко всему, обычные файлы могут без причины стать исполняемыми.
Более безопасный подход - использовать find и применить отдельные права для каталогов и файлов:
find /var/www/example.com -type d -exec chmod 755 {} \;
find /var/www/example.com -type f -exec chmod 644 {} \;
Такой шаблон распространён в веб-проектах. Каталоги остаются доступными, обычные файлы остаются доступными для чтения, а изменять содержимое может только владелец. Когда приложения работают на серверах BlueVPS, такая предсказуемая структура также упрощает поиск неисправностей, поскольку файлы и каталоги по понятной причине подчиняются разным правилам.
Рекурсивные команды всегда следует проверять перед выполнением. Небольшая опечатка в пути может изменить тысячи файлов. При работе с продакшн-системами лучше проверить цель с помощью find path -type f | head или find path -type d | head, прежде чем применять изменения.
Специальные права: SUID, SGID и sticky bit
Linux также поддерживает специальные биты прав, которые меняют обычное поведение доступа. Они полезны в отдельных случаях, но применять их следует осторожно, особенно в продакшн-системах.
SUID позволяет исполняемому файлу запускаться с правами владельца файла. Это может быть мощным инструментом, поскольку программа может выполнять действия, которые текущий пользователь обычно выполнять не может, поэтому SUID следует использовать только при наличии чёткой причины.
SGID работает с файлами и каталогами. Для файлов он запускает исполняемый файл с правами группы файла. Для каталогов он делает так, что новые файлы наследуют группу каталога, что удобно для общих папок проектов.
Sticky bit часто используют для общих каталогов с правом записи, таких как /tmp. Он позволяет пользователям создавать файлы, но не даёт им удалять файлы, принадлежащие другим.
Распространённые примеры:
chmod u+s file
chmod g+s directory
chmod +t directory
Специальные права не являются повседневными настройками для большинства файлов сайта. Их лучше всего использовать, когда есть конкретное требование к контролю доступа, особенно в продакшн-системах.
Устранение ошибок, связанных с правами доступа
Ошибки прав доступа не всегда вызваны конечным файлом. Причиной могут быть владелец, родительские каталоги, служебные пользователи, правила для SSH-ключей, параметры монтирования файловой системы и системы безопасности, такие как SELinux или AppArmor.
Правильный процесс поиска неисправностей начинается с проверки активного пользователя, затем целевого файла, а затем каждого родительского каталога в пути. Это важно, поскольку файл может иметь правильные права, а один из родительских каталогов всё равно будет блокировать доступ.
|
Ошибка или симптом |
Вероятная причина |
Практическое решение |
|
У активного пользователя нет нужного права на чтение, запись или выполнение |
Проверьте whoami, выполните ls -l, а затем скорректируйте минимально необходимое значение прав или владельца |
|
|
Скрипт не запускается |
У файла нет права на выполнение |
Выполните chmod u+x script.sh, а затем запустите его с помощью ./script.sh |
|
Не удаётся войти в каталог |
У каталога нет права на выполнение |
Добавьте право на выполнение для нужного пользователя или группы |
|
403 Forbidden на веб-сервере |
Пользователь веб-сервера не имеет доступа к файлам или родительским каталогам |
Проверьте владельца, доступ группы и права каталогов по всему пути |
|
Приватный SSH-ключ отклоняется |
Права на приватный ключ слишком широкие |
Выполните chmod 600 ~/.ssh/id_rsa и проверьте владельца каталога .ssh |
|
Приложение не может загружать файлы |
У служебного пользователя нет права на запись в каталог загрузок |
Смените владельца или группу каталога загрузок, а затем предоставьте право на запись только там, где это нужно |
|
Изменения через chmod не помогают |
Неверный владелец, проблема с родительским каталогом, SELinux, AppArmor или ограничения монтирования |
Используйте namei -l path, проверьте служебного пользователя, а затем просмотрите политику безопасности, если она включена |
На VPS в США такой поиск неисправностей обычно выполняется удалённо через SSH, поэтому чёткая последовательность действий экономит время. Проверьте пользователя, просмотрите целевой файл, проверьте родительские каталоги, убедитесь в правильности владельца, а затем внесите минимально необходимое безопасное изменение.
Краткая справка: шпаргалка по chmod
Используйте эту справочную таблицу, когда нужно быстро вспомнить команду для повседневных задач с правами доступа в Linux: от проверки прав доступа до исправления владельца и применения безопасных значений по умолчанию для файлов и каталогов.
|
Задача |
Команда |
|
Показать права доступа к файлу |
ls -l file |
|
Показать права по всему пути |
namei -l /path/to/file |
|
Сделать скрипт исполняемым для владельца |
chmod u+x script.sh |
|
Убрать право на запись у группы и остальных |
chmod go-w file |
|
Задать стандартные права для файла |
chmod 644 file |
|
Задать стандартные права для каталога |
chmod 755 directory |
|
Защитить приватный SSH-ключ |
chmod 600 ~/.ssh/id_rsa |
|
Сменить владельца файла |
chown user file |
|
Сменить владельца и группу |
chown user:group file |
|
Сменить только группу |
chgrp group file |
|
Применить 755 только к каталогам |
find path -type d -exec chmod 755 {} \; |
|
Применить 644 только к файлам |
find path -type f -exec chmod 644 {} \; |
|
Добавить sticky bit для общего каталога |
chmod +t directory |
|
Добавить SGID для общего каталога проекта |
chmod g+s directory |
Blog