Как правильно установить разрешения на доступ к файлам и папкам сайта на VPS?

Как правильно установить права на папки и файлы сайта, находящиеся по адресу /var/www/site.ru, при переносе сайта на VPS-сервер с использованием системы Debian 12 и установленного LAMP-стека? Ранее я использовал обычный виртуальный хостинг, где на файлы стояли права 664, а на папки — 755. Однако, на VPS-сервере, если я устанавливаю такие же права, сайт не открывается. Мне приходится задавать права 755 на все файлы и папки, но я сомневаюсь в их безопасности. Может быть, я что-то неправильно настроил и нужно дать определенные права какому-то пользователю или группе? Пожалуйста, подскажите. Меня смущает, что на виртуальном хостинге файлы имели права 664, что, видимо, делает их безопаснее.
  • 5 ноября 2023 г. 5:49
Ответы на вопрос 2
Права доступа для файлов и папок на VPS-сервере должны быть установлены таким образом, чтобы обеспечить безопасность и функциональность сайта. Вот некоторые рекомендации по установке прав доступа на VPS-сервере с Debian 12 и LAMP-стеком:

1. Создайте группу и пользователя для вашего сайта. Для примера, давайте назовем группу "www-data" и пользователя "www-data":

```
sudo groupadd www-data
sudo useradd -g www-data www-data
```

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

```
ps aux | grep apache2
```

3. Убедитесь, что все файлы и папки в директории вашего сайта (/var/www/site.ru) принадлежат указанной группе и пользователю. Используйте команды chown и chgrp для установки соответствующих прав:

```
sudo chown -R www-data:www-data /var/www/site.ru
```

4. Установите права доступа для папок на 755, а для файлов на 644:

```
sudo find /var/www/site.ru -type d -exec chmod 755 {} \;
sudo find /var/www/site.ru -type f -exec chmod 644 {} \;
```

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

```
sudo chmod 755 /var/www/site.ru/uploads
sudo chmod 664 /var/www/site.ru/uploads/example.jpg
```

6. Перезапустите веб-сервер Apache для применения изменений:

```
sudo systemctl restart apache2
```

Важно отметить, что безопасность вашего сайта не зависит только от прав доступа к файлам и папкам. Также необходимо обеспечить безопасность вашего кода, базы данных, установить обновления, использовать SSL и т. д.
Первое число в правах доступа относится к владельцу, второе - к группе, третье - к остальным пользователям. Различие между 5 и 7, а также 6 и 4 заключается в наличии бита x (исполняемый). Этот бит обычно устанавливают на каталоги, но необязательно на файлы (за исключением скриптов и бинарных файлов, которые нужно запускать). Если речь идет о скриптах, то наличие бита x не является обязательным условием для их запуска - можно просто указать путь к файлу (/путь/к/файлу). 

Возможно, у вас скрипты находятся на бэкэнде, который требует установки флага +x. Используете ли вы CGI? Почему код работает? Потому что вы установили права 5 для всех пользователей. 

Веб-сервер работает от имени пользователя www (apache, http или другой, который настроен у вас). Вероятно, файлы вы загружаете от имени пользователя root или созданного вами пользователя для работы. 

Что можно сделать? Добавить своего пользователя в группу www или настроить веб-сервер, чтобы он работал с правами вашего пользователя. Можно также авторизоваться при копировании файлов от имени www (хотя это не рекомендуется) или же принудительно установить владельца файлов как www. 

Теперь о безопасности... Пользователи веб не видят и не имеют доступа к файлам, независимо от установленных прав доступа. Права на файлы устанавливаются в настройках веб-сервера. Однако в веб-приложениях или настройках веб-сервера часто находят уязвимости, позволяющие, например, изменять файлы от имени www. Если запретить веб-серверу это делать, эксплуатация такой уязвимости будет либо очень сложной, либо невозможной. То есть простыми административными настройками можно повысить безопасность уязвимого сервера (хоть и не до максимума, но все же).

Правильным решением является грамотная настройка прав доступа. Веб-сервер должен иметь только чтение (и, возможно, запуск, если требуется для вашего бэкэнда), кроме того, можно вынести настройки базы данных в отдельный сервис, чтобы из файлов не было возможности узнать пароль. Есть и другие меры безопасности, такие как запуск веб-сервиса в chroot/docker с минимальной функциональностью, без shell и различных утилит, только веб-сервер (как это делают для FTP). Следующим шагом может быть подписание скриптов и бинарных файлов с запрещением запуска неподписанных, это еще более сложная задача, но значительно повышает уровень безопасности.
Похожие вопросы