VestaCP open_basedir php-fpm

По умолчанию, на сегодняшний день, связка 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"

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *