@karpo518

Как правильно настроить права на web-сервере?

После установки web-сервера я привык назначать пользователем apache/nginx владельца каталога, в котором лежат файлы сайтов. То есть, если сайты лежат в /home/user1/www, то я устанавливаю пользователем nginx user1.
Это всегда избавляло меня от кучи проблем. Я использую только одного пользователя, поэтому ранее проблем с такой схемой не возникало. Тем не менее, я понимаю, что такая схема не может корректно работать для нескольких пользователей. Сейчас я в очередной раз настраиваю сервер на ubuntu + vestacp и хочу сделать всё "правильно" . Я оставил у nginx дефолтного пользователя и столкнулся со следующими проблемами:

1. Папкам на сайте положено назначать права 755. Такие права не позволяют пользователю www-data редактировать и удалять файлы. Можно добавить пользователя www-data в группу user1, но потребуется сменить права на папки/файлы на 775/664. Является ли это правильным в плане безопасности web-сервера?

2. Движок сайта тоже создаёт файлы, и у этих файлов будет владелец www-data. Мне было бы удобно иметь возможность редактировать эти файлы от имени своего пользователя. Как этого добиться? Теперь получается, что мне нужно ещё и наоборот добавить пользователя user1 в группу user1 и позаботиться о том, чтобы движок тоже создавал файлы папки создавались с правильными правами (775/664). Я хотел бы заметить, что для коробочных CMS это может оказаться неовзможно. Но спрошу лишь, насколько такая система прав является верной с точки зрения администратора web-сервера.

3. Мне нужно было запускать команды bash с помощью php-функции shell_exec и я обнаружил, что переменная LC_ALL для команд, запущенных таким образом не установлена. Я смог установить значение для пользователей root и user1, но с пользователем www-data возникла проблема. Я клал .bashrc с экспортом нужны переменных в папку /var/www, задавал /etc/default/locale. Но ничего не помогло. Мне подсказали использовать /etc/environment, но, как я понял - это совсем не best parctices, поэтому предпочёл использовать для установки LC_ALL php-функцию setlocale. Проблема в том, что эта функция задаёт переменную только для среды PHP. Переменная в bash остаётся недоступной. Возможно есть способ задать временную переменную окружения для bash с помощью shell_exec перед выполнением самой команды, но я так и не разобрался как это сделать.

Так как в итоге правильно настроить права, чтобы не было проблем c доступом к файлам, и переменная LC_ALL не была пустой?
  • Вопрос задан
  • 72 просмотра
Пригласить эксперта
Ответы на вопрос 2
OnYourLips
@OnYourLips
1. Пофигу. Если вредоносный код проник настолько, что внедлирся в ваше приложение и может исполнять код, то бессмысленно ограничивать доступ к файлам на запись, все уже максимально плохо.

2. Самое правильное решение - движок не должен создавать файлы. Используйте специализированные хранилища. Даже вордпресс это умеет через плагины: https://ru.wordpress.org/plugins/amazon-s3-and-clo...
Все кеши кодогенерации, если она есть. прогревайте заранее.

3. shell_exec("LC_ALL=<value> <command>");
Но правильно не использовать такой интерфейс взаимодействия.

Так как в итоге правильно настроить права, чтобы
Правильно не последствия проблемы разгребать. а проблему устранить.
Я рекомендую полностью ограничить право на запись для всех директорий и файлов проекта, чтобы обнаружить проблему как можно раньше. Для всех сохранений файлов используйте хранилища.
Ответ написан
@Germanjon
1. А насколько важно давать права 775/664? Если мне не изменяет память, они выдаются для нескольких нужных папок, а остальные пусть сидят 755/644.
2. Что мешает "точечно" изменять права доступа только на нужные файлы перед редактированием?
3. Добавьте в запускаемый bash-скрипт строчку, которая устанавливает нужную локаль (через export например) или запускайте команду так "LC_ALL=локаль somecomand"
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы