Задать вопрос

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

Добрый день.

Проблема такая:
Арендовали хороший VPS пополам с другом. На сервере будет несколько сайтов. Половина сайтов моя, половина - друга.

В целях безопасности я хочу правильно настроить связку nginx + php5-fpm, так чтобы владелец одного сайта не мог зайти на другой сайт. Сильно никто ломиться в чужие папки не собирается, но получить доступ к сайту условно может разработчик другого сайта, размещенного на том же VPS или кто-то, кто взломает любой из сайтов на VPS. Всякие виртуализации городить не хочется, иначе смысла в разделение хостинга на двоих нет.

Пока у меня решение такое (но оно решает только часть задач).

Для каждого сайта создаю свой отдельный пул php5-fpm, вешаю его на отдельный порт и запускаю от отдельного юзера.
Например:

[host1]
listen = 127.0.0.1:9001
user = user1 
group = user1
pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 2
pm.max_spare_servers = 4
...
chdir = /
php_admin_value[log_errors] = on
php_admin_value[upload_tmp_dir] =    /var/www/$pool/mod-tmp/upload_tmp
php_admin_value[session.save_path] = /var/www/$pool/mod-tmp/sessions
php_admin_value[error_log] =         /var/www/$pool/logs/php-errors.log
и т.п.


Далее nginx в зависимости от server_name в локейшенах делает редирект на прокси. Например:
fastcgi_pass   127.0.0.1:9001; 	# - на один php пул, который работает от пользователя user1
fastcgi_pass   127.0.0.1:9002;  # - на другой php пул, который работает от пользователя user2


Те вопросы, с которыми уже столкнулся.

Nginx работает от пользователя www-data и раздает статику для всех сайтов.
Это означает, что все файлы у пользователя USER1 должны быть доступны для чтения не только пользователю USER1, а еще и другим пользователям. Если я поставлю на файлы права, например 0775 то пользователь USER2 сможет читать файлы пользователя USER1. А если я поставлю права 0770, то тогда nginx не сможет загружать статику. Т.е. пока получается, что пользователь одного сайта, зная структуру другого сайта может получить доступ к произвольному файлу, даже при том, что владельцы файлов разные.

Вторая проблема пользователь USER2 может сделать симлинк, например в корне сайта, например something.css -> /$homedirs/user1/$site/config.php. И тогда nginx будет легко отдавать "чужие секретные файлы", содержащие в том числе и пароли. Можно запретить nginx'у ходить по симлинкам, но это увеличивает нагрузку на него и линки иногда используются и в "законных" целях.

Частично мне могло бы помочь использование chroot в настройках пула php5-fpm. Решит ли это вопрос с симлинками, я не знаю. Но у меня возникла другая проблема. Один из сайтов (форум на phpbb) при использовании chroot выдал следующую ошибку
Can't connect to local MySQL server through socket '/var/run/mysqld mysqld.sock' (2) [2002]

Смысл понятен, что php не может получить доступ к сокету за пределами chroot. Значит у меня остается выбор или не использовать chroot или решить проблему с подключением к Mysql. Хотя в настройках phpbb указано подключение к Mysql через localhost на порт 3306 (про сокеты нигде настроек нет), почему то сообщение выдается об ошибке доступа к сокету. Заставить Phpbb подключаться именно через порт у меня не получается.

У меня есть опыт только настройки VPS под одного пользователя.
Поэтому хотелось бы или получить комментарий на конкретные описанные проблемы, или получить совет как правильно разделять хостинг на несколько сайтов.
  • Вопрос задан
  • 3281 просмотр
Подписаться 4 Оценить Комментировать
Решения вопроса 1
BuriK666
@BuriK666 Куратор тега Nginx
Компьютерный псих
ставьте права на файлы 640, директории 750 и владельцем user1:www-data, user2:www-data
у nginx группу www-data.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы