Настройка gzip и Brotli в Nginx: сжатие HTML, CSS и JavaScript, выбор уровня компрессии, снижение нагрузки на сервер, проверка и решение типичных проблем.
Блог компании 3v-Hosting
8 мин.
Одна из самых частых ошибок в Linux, которая знакома едва ли не всем администраторам - это ошибка Permission denied. В общем случае она означает, что пользователь или запущенный процесс пытается выполнить операцию, для которой у него недостаточно прав доступа. Например, веб-сервер не может прочитать конфигурационный файл, PHP-приложение отказывается сохранять загруженные изображения или ваш Bash-скрипт не запускается, хотя сам файл существует и находится на своём месте.
Причины появления этой ошибки могут быть различными, но чаще всего подобные проблемы возникают после переноса сайта на новый VPS, восстановления резервной копии или, например, изменения настроек веб-сервера.
Самое простое решениеданной проблемы, которое часто предлагают на форумах - это выполнить команду chmod 777 {file_name}. Да уж, ошибка после этого действительно может исчезнуть, но вот вместе с ней исчезнут и ограничения доступа для остальных пользователей системы. На рабочем сервере, где хранятся важные файлы и данные, такой подход может создать огромные проблемы с безопасностью. Поэтому НИКОГДА так не делайте, пока не удостоверились, что для данного конкретного файла действительно нужны такие права (что вряд ли).
К счастью, в Linux есть несколько простых инструментов для работы с правами доступа к файлам и директориям, которые позволяют выяснить, кому принадлежит тот или иной файл, какие операции с ним можно выполнять и почему система отказывает в доступе к файлу.
В данной краткой статье мы с вами рассмотрим основные команды для проверки прав доступа и способы исправления наиболее распространённых ошибок, связанных с правами доступа.
Система прав доступа в Linux досталась ему в наследство от Unix, где подобный механизм появился ещё в 1970-х годах. Уже тогда Unix разрабатывалась как многопользовательская операционная система в которой несколько человек могли одновременно работать на одном компьютере. И чтобы пользователи не могли произвольно читать, изменять или удалять чужие файлы, понадобился механизм разграничения доступа.
Linux сохранил эту модель практически без изменений, так как она очень проста и в то-же время элегантна. Несмотря на её возраст, она до сих пор используется на серверах, рабочих станциях и других устройствах под управлением различных дистрибутивов ОС Linux.
Суть метода довольно проста. У каждого файла и каталога есть владелец, группа и набор разрешений. При попытке открыть или изменить файл ядро Linux проверяет, от имени какого пользователя выполняется операция и какие действия ему разрешены.
Для этого используются три категории:
Для каждой категории предусмотрены разрешения r (чтение), w (запись) и x (выполнение). Также их можно комбинировать. Например, владелец может читать и изменять файл, пользователи группы - только читать, а остальные вообще не иметь к нему доступа.
А вот при работе с каталогами есть нюанс. Разрешение r позволяет просматривать список имён файлов, x - обращаться к объектам внутри каталога по известным именам, а w - изменять его содержимое. То есть для создания и удаления файлов обычно нужны одновременно w и x права.
Поэтому часто бывают случаи, когда даже файл с разрешённым чтением может оказаться недоступным, так как у пользователя нет права прохода через один из родительских каталогов.
Такая система достаточно проста для повседневного администрирования, хотя и у неё есть ограничения. Так, для более гибкого управления доступом в Linux системах используются и дополнительные механизмы, такие, как например ACL (Access Control Lists), которые позволяют назначать отдельные разрешения конкретным пользователям и группам.
Теперь, когда мы разобрались с сутью, приступим к практике.
Самый простой способ посмотреть разрешения конкретного файла - это выполнить команду:
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.
Допустим, что файл имеет права 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. Они позволяют быстро проверить разрешения, владельца файла и доступность родительских каталогов. Однако никогда не стоит забывать о безопасности своего сервера. Поэтому стоит подходить к работе с правами с умом, заранее спланировав те или иные действия и проверив, какие права и кому вы выдаёте.
Пошаговое руководство по настройке репликации PostgreSQL 16 между двумя VPS. Настройка Primary и Standby, Streaming Replication, передача WAL, мониторинг и пере...
Как работает маскировка домена и как скрыть настоящий URL сайта с помощью iframe и Reverse Proxy. Настройка Nginx, влияние на SEO, безопасность и частые ошибки.
Что делать после первого входа на VPS, как правильно настроить Linux-сервер, защитить SSH, закрыть лишние порты и подготовить систему к запуску сайта.