我的问题与两年前 Luis Machuca 的问题几乎相同(Apache + php-fpm:每个池、每个用户项目的适当权限?),但有一些附加条件。
我还配置了服务器(我的是 Ubuntu 22.04 机器),以便它由 Apache (v2.4.55) 和 php7.4-fpm 管理。当前配置允许每个虚拟主机分为特定的 php-fpm 池,并且每个池都由不同的用户运行。
一切正常,但仅与用户控制权限(或基于 open_basedir)相关的安全性无法阻止 shell_exec (我需要)访问,例如,内部的配置文件/etc
,或执行ls -l /var/
.
因此,我想要的是一种防止用户能够四处查看 Linux 标准文件夹的方法。
我不想打电话到这样的地步:
setfacl -Rm u:user_site1:--- /;
setfacl -Rm d:u:user_site1:--- /;
然后对各个基本文件夹进行一一授权。看起来太乱了。
因此,我曾想过在每个池中使用 chroot,但我无法这样做,因为总是存在与 paths 相关的问题AH01071: Got error 'Primary script unknown'
,并且所有在线解决方案都说修改ProxyPassMatch
基于端口 9000 的调用,但我使用SetHandler
套接字,并且我不想更改此设置。
有哪些可能的技术?我真的必须安装 SELinux 吗?
下面,我添加了我的配置以更好地了解情况。
/etc/apache2/sites-enabled/www.site.com.conf
<VirtualHost *:80>
Protocols h2 h2c http/1.1
H2Direct on
ServerAdmin [email protected]
ServerName www.site.com
DocumentRoot /var/www/vhosts/www.site.com/httpdocs
ErrorLog /var/www/vhosts/www.site.com/log/error.log
CustomLog /var/www/vhosts/www.site.com/log/access.log combined
<FilesMatch ".+\.ph(ar|p|tml)$">
SetHandler "proxy:unix:/run/php/php7.4-fpm-www_site_com.sock|fcgi://localhost"
</FilesMatch>
</VirtualHost>
<VirtualHost *:443>
Protocols h2 h2c http/1.1
H2Direct on
ServerAdmin [email protected]
ServerName www.site.com
DocumentRoot /var/www/vhosts/www.site.com/httpdocs
ErrorLog /var/www/vhosts/www.site.com/log/error_ssl.log
CustomLog /var/www/vhosts/www.site.com/log/access_ssl.log combined
SSLEngine on
SSLCertificateFile /etc/ssl/certs/www.site.com.crt
SSLCertificateKeyFile /etc/ssl/private/www.site.com.key
<FilesMatch "\.(?:cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
<FilesMatch ".+\.ph(ar|p|tml)$">
SetHandler "proxy:unix:/run/php/php7.4-fpm-www_site_com.sock|fcgi://localhost"
</FilesMatch>
</VirtualHost>
/etc/php/7.4/fpm/php-fpm.conf
[global]
pid = /run/php/php7.4-fpm.pid
error_log = "syslog"
syslog.ident = php-fpm
include=/etc/php/7.4/fpm/pool.d/*.conf
/etc/php/7.4/fpm/pool.d/www_site_com.conf
[www.site.com]
user = user_site1
group = user_site1
listen = /run/php/php7.4-fpm-www_site_com.sock
listen.owner = user_site1
listen.group = www-data
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3