Добрый день.
Проблема такая:
Арендовали хороший 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 под одного пользователя.
Поэтому
хотелось бы или получить комментарий на конкретные описанные проблемы, или получить совет как правильно разделять хостинг на несколько сайтов.