Блог компании 3v-Hosting

Как проверить права доступа к файлам в Linux

Администрирование

8 мин.


Одна из самых частых ошибок в Linux, которая знакома едва ли не всем администраторам - это ошибка Permission denied. В общем случае она означает, что пользователь или запущенный процесс пытается выполнить операцию, для которой у него недостаточно прав доступа. Например, веб-сервер не может прочитать конфигурационный файл, PHP-приложение отказывается сохранять загруженные изображения или ваш Bash-скрипт не запускается, хотя сам файл существует и находится на своём месте.

Причины появления этой ошибки могут быть различными, но чаще всего подобные проблемы возникают после переноса сайта на новый VPS, восстановления резервной копии или, например, изменения настроек веб-сервера.

Самое простое решениеданной проблемы, которое часто предлагают на форумах - это выполнить команду chmod 777 {file_name}. Да уж, ошибка после этого действительно может исчезнуть, но вот вместе с ней исчезнут и ограничения доступа для остальных пользователей системы. На рабочем сервере, где хранятся важные файлы и данные, такой подход может создать огромные проблемы с безопасностью. Поэтому НИКОГДА так не делайте, пока не удостоверились, что для данного конкретного файла действительно нужны такие права (что вряд ли).

К счастью, в Linux есть несколько простых инструментов для работы с правами доступа к файлам и директориям, которые позволяют выяснить, кому принадлежит тот или иной файл, какие операции с ним можно выполнять и почему система отказывает в доступе к файлу.

В данной краткой статье мы с вами рассмотрим основные команды для проверки прав доступа и способы исправления наиболее распространённых ошибок, связанных с правами доступа.

 

 

 

 

Как устроены права доступа в Linux

Система прав доступа в Linux досталась ему в наследство от Unix, где подобный механизм появился ещё в 1970-х годах. Уже тогда Unix разрабатывалась как многопользовательская операционная система в которой несколько человек могли одновременно работать на одном компьютере. И чтобы пользователи не могли произвольно читать, изменять или удалять чужие файлы, понадобился механизм разграничения доступа.

Linux сохранил эту модель практически без изменений, так как она очень проста и в то-же время элегантна. Несмотря на её возраст, она до сих пор используется на серверах, рабочих станциях и других устройствах под управлением различных дистрибутивов ОС Linux.

Суть метода довольно проста. У каждого файла и каталога есть владелец, группа и набор разрешений. При попытке открыть или изменить файл ядро Linux проверяет, от имени какого пользователя выполняется операция и какие действия ему разрешены.

Для этого используются три категории:

  • Owner (u) - владелец файла.
  • Group (g) - пользователи группы, которой принадлежит файл.
  • Others (o) - все остальные пользователи системы.

Для каждой категории предусмотрены разрешения r (чтение), w (запись) и x (выполнение). Также их можно комбинировать. Например, владелец может читать и изменять файл, пользователи группы - только читать, а остальные вообще не иметь к нему доступа.

А вот при работе с каталогами есть нюанс. Разрешение r позволяет просматривать список имён файлов, x - обращаться к объектам внутри каталога по известным именам, а w - изменять его содержимое. То есть для создания и удаления файлов обычно нужны одновременно w и x права.

Поэтому часто бывают случаи, когда даже файл с разрешённым чтением может оказаться недоступным, так как у пользователя нет права прохода через один из родительских каталогов.

Такая система достаточно проста для повседневного администрирования, хотя и у неё есть ограничения. Так, для более гибкого управления доступом в Linux системах используются и дополнительные механизмы, такие, как например ACL (Access Control Lists), которые позволяют назначать отдельные разрешения конкретным пользователям и группам.

Теперь, когда мы разобрались с сутью, приступим к практике.

 

 

 

 

Проверка прав командой ls -l

Самый простой способ посмотреть разрешения конкретного файла - это выполнить команду:

ls -l /var/www/html/index.php

Пример результата:

-rw-r--r-- 1 www-data www-data 2450 Oct 20 12:30 index.php

Последовательность -rw-r--r-- показывает тип файла и его права. Первый символ - означает обычный файл (d обозначает каталог). Остальные символы разделены на группы по три.

 

В этом примере владелец www-data может читать и изменять файл, а группа и остальные пользователи - только читать.

Для проверки самого каталога используется команда:

ls -ld /var/www/html

Параметр -d нужен, чтобы получить информацию о каталоге, а не о его содержимом.

 

 

 

 

Как посмотреть права в числовом формате

В Linux разрешения часто записывают числами: 644, 755, 600. Каждому действию соответствует значение:

  • r = 4 - чтение.
  • w = 2 - запись.
  • x = 1 - выполнение.

 

Числа складываются отдельно для каждой категории пользователей.

Например, 755 означает полный доступ для владельца (7 = 4 + 2 + 1) и разрешение на чтение и выполнение для остальных (5 = 4 + 1).

Проверить числовые права можно через команду stat:

stat -c '%a %n' /var/www/html/index.php

Результат:

644 /var/www/html/index.php

 

Самыми общеупотребительными комбинациями являются следующие сочетания:

Права Типичное применение
644 Обычные файлы сайта
755 Каталоги и исполняемые файлы
600 Приватные ключи и файлы, доступные строго владельцу
700 Личные каталоги пользователя
640 Конфигурации сайта с паролями (например, .env или wp-config.php)

Здесь мы привели только самые распространённые варианты, но конкретные разрешения зависят от требований вашего приложения или условий безопасности вашего сервера.

 

 

 

 

Как проверить владельца файла

Иногда ошибка с правами доступа может возникнуть из-за неправильного владельца файла или каталога. Такое часто бывает после переноса сайта между серверами или восстановления файлов сайта из резервной копии.

Узнать владельца и группу можно командой:

stat -c '%U %G' /var/www/html/config.php

Например:

root www-data

Здесь владельцем является root, а группой - www-data.

 

Если приложение работает от имени www-data, то нужно проверить, может ли этот пользователь прочитать данный файл:

sudo -u www-data test -r /var/www/html/config.php && echo "Чтение разрешено"

Если сообщение не появилось, то проверка завершилась без успешного подтверждения доступа.

 

Обратите внимание, что команда test -r проверяет права только самого файла. И если сообщение не появилось, то проблема может быть не в самом файле, а, например, в отсутствии права на выполнение x у пользователя www-data на один из родительских каталогов.

Аналогично можно проверить права на запись, заменив в команде параметр -r на параметр -w.

 

 

 

 

Почему файл доступен, но возникает Permission denied

Допустим, что файл имеет права 644, однако приложение всё равно не может его открыть. А причина такого поведения может крыться в родительском каталоге. И в этом случае удобно проверить всю цепочку каталогов, на пути к нужному файлу. Делается это командой:

namei -l /srv/project/data/report.txt

Она покажет разрешения каждого элемента пути и если у пользователя, от имени которого выполняется данная команда, отсутствует право на исполнение x хотя бы на одном из родительских каталогов, то доступ к файлу будет заблокирован.

 

Бывают и менее очевидные причины. Например, дополнительные ACL правила или ограничения SELinux и AppArmor.

Заметить их можно прямо в выводе команды ls -l. Так, если на файле настроены ACL правила, то в конце списка прав появляется знак плюс (например, -rw-r-----+), а при использовании SELinux - точка (например, -rw-r--r--.).

 

Проверить ACL правила можно командой:

getfacl /var/www/html/config.php

 

А если файл не запускается при корректных разрешениях, тогда нужно проверить параметры монтирования:

findmnt -T /var/www/html/script.sh -o TARGET,OPTIONS

Пример вывода для файловой системы, смонтированной с параметром noexec:

TARGET    OPTIONS
/var/www  rw,nosuid,nodev,noexec,relatime

Здесь rw означает, что файловая система доступна для чтения и записи, а noexec запрещает непосредственный запуск исполняемых файлов с этого раздела.

 

Если же файловая система смонтирована в режиме "только для чтения", то вывод может выглядеть так:

TARGET    OPTIONS
/var/www  ro,relatime

 

А вот при обычном монтировании, без этих ограничений, вывод должен быть таким:

TARGET    OPTIONS
/var/www  rw,relatime

 

Конечно, это условные примеры и реальные параметры зависят от конфигурации вашего сервера. Но суть, мы думаем, вы поняли.

 

 

 

 

 

Как изменить права доступа

Для изменения разрешений на файлы и каталоги используется команда chmod (от Change Mode):

chmod 640 /var/www/html/config.php

Теперь владелец может читать и изменять файл, группа - только читать, а все остальные пользователи не имеют доступа к данному файлу.

 

Если же проблема связана с владельцем, тогда применяется команда chown (от Change Owner):

sudo chown www-data:www-data /var/www/html/config.php

Отметим, что назначать владельцем пользователя www-data нужно только в тех случаях, когда это действительно требуется вашему приложению, например, если веб-сервер или PHP-процесс должен создавать и изменять файлы в определённом каталоге. Для обычных файлов сайта, которые достаточно только читать, такая смена владельца обычно не нужна. Более того, если все файлы принадлежат пользователю www-data, то уязвимость в веб-приложении может позволить злоумышленнику изменять исходный код или конфигурацию вашего сайта. Поэтому права на запись лучше предоставлять только тем каталогам и файлам, где они действительно необходимы.

 

После переноса сайта иногда приходится исправлять разрешения сразу для множества объектов. Для каталогов и обычных файлов их лучше задавать отдельно:

find /var/www/html -type d -exec chmod 755 {} +
find /var/www/html -type f -exec chmod 644 {} +

Это типичная схема для файлов публичного сайта, но применять её ко всему проекту без проверки опасно. Закрытые конфигурации могут требовать более строгих прав, а исполняемые файлы, например, разрешения на исполнение.

ВАЖНО! Ещё раз повторим, что особенно нежелательно использовать chmod -R 777, так как эта команда открывает запись и исполнение всем пользователям системы, что создаёт лишние риски.

 

 

Итого, для устранения большинства проблем с правами доступа в Linux достаточно знания команд ls -l, stat и namei. Они позволяют быстро проверить разрешения, владельца файла и доступность родительских каталогов. Однако никогда не стоит забывать о безопасности своего сервера. Поэтому стоит подходить к работе с правами с умом, заранее спланировав те или иные действия и проверив, какие права и кому вы выдаёте.

3v-Hosting Team

Автор

3v-Hosting Team

Команда 3v-Hosting - это группа преданных своему делу инженеров и операторов, которые занимаются созданием и поддержкой основы наших сервисов. Каждый день мы погружаемся в мир виртуальных и выделенных серверов, занимаясь всем, от развертывания и мониторинга до устранения реальных проблем, возникающих в производственных средах. Большинство наших статей основано на практическом опыте, а не просто на теории. Мы делимся своими наблюдениями о проблемах, с которыми сталкиваемся: перебоях в производительности, ошибках в настройке, тонкостях сетевых решений и архитектурных выборах, влияющих на стабильность и надежность. Наша миссия проста - мы хотим делиться знаниями, которые позволят вам управлять своими проектами с меньшим количеством неожиданностей и гораздо большей предсказуемостью.