Я занимаюсь перемещением каждого из моих веб-сайтов, находящихся на одном сервере, с одного экземпляра PHP (при этом все файлы на всех веб-сайтах принадлежали apache, и только библиотека php по умолчанию была установлена без php-fpm) ... и я устанавливаю пул php-fpm для каждого отдельного веб-сайта.
Моя цель - лучшая безопасность и разделение веб-сайтов, самая большая цель состоит в том, чтобы сценарии PHP на одном веб-сайте не могли получить доступ к сценариям PHP с другого веб-сайта.
Я видимо что-то не так делаю.
Моя среда:
Вот пример файла конфигурации пула php-fpm:
[root@host]# cat /etc/php-fpm.d/website1.com.conf
[website1.com]
user = user1
group = user1
listen = /var/run/php-fpm/website1.com.sock
listen.owner = user1
listen.group = user1
php_admin_value[disable_functions] = exec,passthru,shell_exec,system
php_admin_flag[allow_url_fopen] = on
php_admin_value[short_open_tag] = On
pm = ondemand
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
chdir = /home/www/website1.com/
А вот соответствующий ему файл vhost в Apache:
[root@host]# cat /etc/httpd/conf.d/website1.com.conf
<VirtualHost *:80>
ServerAdmin admin@my-host.com
ServerName website1.com
ServerAlias www.website1.com
DocumentRoot /home/www/website1.com/www
<Directory "/home/www/website1.com/www">
Options Includes FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
ErrorLog /home/www/website1.com/logs/errors
CustomLog /home/www/website1.com/logs/access_log common
<FilesMatch "\.php$">
SetHandler "proxy:unix:///var/run/php-fpm/website1.com.sock|fcgi://website1.com/"
</FilesMatch>
</VirtualHost>
Все файлы и папки принадлежат исключительно пользователю user1 (группа также имеет значение user1).
У меня есть PHP-скрипт внутри "website2", который все еще может получить доступ к содержимому "website1". Параметры в файле конфигурации пула php-fpm для "website2" и настройки в "website2" конфигурационном файле Apache vhost идентичны веб-сайту 1 (за исключением различных путей к папкам, домашнего каталога, chroot и т. Д.).
Это мой тестовый сценарий, расположенный в / home / www / website2 / www / и доступный через доменное имя website2.com:
<?php
$test = file_get_contents('/home/www/website1.com/www/wp-config.php');
echo $test;
#$files = scandir('/home/www');
#print_r($files);
?>
Однако вывод этого сценария несколько неожидан. Я не вижу полного содержимого wp-config.php. Вместо этого я вижу все, что находится за пределами определенного места в файле (если вы знакомы с wp-config.php, я вижу все после define('SECURE_AUTH_KEY','foo')
запись).
Почему этот тестовый сценарий, работающий с правами «user2», может вывести часть содержимого wp-config.php из каталога «user1»? Я думал, что chdir = /home/www/website1.com/
директива предотвратит подобные вещи.
Похоже, вы установили chdir
вместо того chroot
в конфигурации пула php-fpm.
В chdir
директива просто изменяет рабочий каталог для процессов php для этого пула; он не запускает процессы в chroot.
Видеть этот вопрос.