Estou no processo de mover cada um dos meus sites que estão em um único servidor a partir de uma única instância do PHP (pelo qual todos os arquivos em todos os sites eram de propriedade do apache e apenas a biblioteca php padrão foi instalada sem php -fpm) ... e estou instalando um pool php-fpm para cada site individual.
Melhor segurança e separação dos sites é meu objetivo, o maior objetivo é que os scripts PHP em um site não consigam acessar scripts PHP de outro site.
Aparentemente estou fazendo algo errado.
Meu ambiente:
- CentOS 7
- PHP 5.4.16
- Apache 2.4.6
Veja um exemplo do arquivo de configuração do pool 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/
E aqui está o seu arquivo vhost correspondente no Apache:
[root@host]# cat /etc/httpd/conf.d/website1.com.conf
<VirtualHost *:80>
ServerAdmin [email protected]
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>
Todos os arquivos e pastas são de propriedade exclusiva do usuário1 (o grupo também é definido como usuário1).
Eu tenho um script PHP dentro de "website2" que ainda é capaz de acessar o conteúdo "website1". As configurações no arquivo de configuração do conjunto php-fpm para "website2" e as configurações no arquivo de configuração "website2" do Apache são idênticas ao website 1 (com exceção de caminhos de pastas, diretórios home, chroot, etc ...).
Este é o meu script de teste, localizado em / home / www / website2 / www / e acessível através do nome de domínio website2.com:
<?php
$test = file_get_contents('/home/www/website1.com/www/wp-config.php');
echo $test;
#$files = scandir('/home/www');
#print_r($files);
?>
A saída deste script é um pouco inesperada, no entanto. Eu não vejo o conteúdo completo do wp-config.php. Em vez disso, o que eu vejo é tudo além de um certo ponto no arquivo (se você estiver familiarizado com o wp-config.php, eu vejo tudo depois da entrada define('SECURE_AUTH_KEY','foo')
).
Por que este script de teste, que está sendo executado sob o acesso "user2", ecoa alguns dos conteúdos do wp-config.php encontrados no diretório "user1"? Eu pensei que a diretiva chdir = /home/www/website1.com/
impediria esse tipo de coisa.