По умолчанию, на сегодняшний день, связка Nginx+PHP-FPM в VetaCP не позволяет подключить open_basedir. Однако, панель работает с системой шаблонов, и с их помощью мы можем сделать всё необходимое.
Настраиваем open_basedir.
1. Для php-fpm шаблоны VestaCP хранит в директории /usr/local/vesta/data/templates/web/ Переходим туда, и либо создаём новый файл-шаблона, либо редактируем уже имеющийся, нужный нам (socket.tpl в моём случае).
2. Открываем файл socket.tpl и прописываем в нём строку:
php_admin_value[open_basedir] = /home/%user%/web/:/home/%user%/tmp/
В данном случае, мы разрешаем доступ к двум директориям конкретного пользователя — к директории с файлами доменов, и к директории для временных файлов. Файл сохраняем.
3. В панели переходим к настройкам доменного имени, и для Backend Template выбираем наш шаблон.
Сохраняем изменения, и проверяем phpinfo();, в котором переменная open_basedir примет заданные нами ранее значения.
Проверяем ограничения.
Проверить, срабатывает ли open_basedir легко. В директории с сайтом создадим вот такой простой php скрипт:
# cat in223.php <?php echo file_get_contents('/etc/passwd'); ?>
И попробуем обратиться к нему из браузера. https://domain.com/in223.php
В логах должно осесть примерно следующее:
PHP message: PHP Warning: file_get_contents(): open_basedir restriction in effect. File(/etc/passwd) is not within the allowed path(s): (/home/user/web/:/home/user/tmp/) in /home/user/web/domain.com/public_html/in223.php on line 2 PHP message: PHP Warning: file_get_contents(/etc/passwd): failed to open stream: Operation not permitted in /home/user/web/domain.com/public_html/in223.php on line 2" while reading response header from upstream, client: 1.2.3.4, server: sysadmin.pm, request: "GET /in223.php HTTP/2.0", upstream: "fastcgi://unix:/var/run/php-domain.com.sock:", host: "domain.com"
Это означает, что запрос к файлу вне разрешённых директорий был ограничен системой.
Дополнительно здесь стоит учесть, что даже при активном open_basedir, в PHP имеются функции, с помощью которых можно обойти ограничения. Например, с помощью shell_exec можно прочитать содержимое файла, либо выполнить нужную команду. Такие функции лучше сразу же отключить в disable_functions. Тогда и с их помощью прочитать что-то лишнее не удастся:
PHP message: PHP Warning: shell_exec() has been disabled for security reasons in /home/user/web/domain.com/public_html/in222.php on line 2", client: 1.2.3.4, server: domain.com, request: "GET /in222.php HTTP/2.0", host: "domain.com"