PHP-FPM + Apache2 安全

PHP-FPM + Apache2 安全

我的问题与两年前 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

相关内容