多站点共用 php-fpm 池时,最安全的隔离方式是使用 open_basedir 限制每个站点的文件访问范围,并配合 chroot 或 chdir 进一步锁定工作目录。通过为不同站点配置独立的 php_admin_value,可以确保即使代码存在漏洞,攻击者也无法读取其他站点的敏感文件(如配置文件、数据库凭证)。此外,必须严格设置文件权限,确保 web 用户仅拥有必要的只读或写入权限,避免使用 root 运行 php-fpm 进程。

如何配置 open_basedir 实现路径隔离?
在 Nginx 或 Apache 的虚拟主机配置中,可以通过 fastcgi_param 或 SetEnv 传递 open_basedir 参数,或者直接在 PHP-FPM 池配置中使用 php_admin_value[open_basedir]。这样,每个站点只能访问其指定的目录及其子目录。例如,站点 A 只能访问 /var/www/site_a,而站点 B 只能访问 /var/www/site_b。这种配置能有效防止跨站文件包含(LFI)攻击导致的数据泄露。

server {
listen 80;
server_name site_a.com;
location / {
root /var/www/site_a;
index index.php;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php-fpm/site_a.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
# PHP-FPM pool config for site_a
[site_a]
user = www-data
group = www-data
listen = /run/php-fpm/site_a.sock
php_admin_value[open_basedir] = /var/www/site_a:/tmp
php_admin_value[disable_functions] = exec,passthru,shell_exec,system
上述配置中,[site_a] 池独立运行,open_basedir 限制了文件访问路径。如果站点 A 的代码尝试访问 /etc/passwd 或 /var/www/site_b/config.php,PHP 会抛出警告并拒绝访问。同时,disable_functions 禁用了危险函数,进一步降低风险。
立即学习“PHP免费学习笔记(深入)”;
为什么需要 chroot 和 chdir 增强隔离?
虽然 open_basedir 提供了应用层的隔离,但系统层面的隔离同样重要。chroot 可以将 PHP-FPM 进程的工作根目录更改到指定目录,使其无法访问该目录之外的任何文件系统内容。结合 chdir,可以确保进程启动后位于正确的站点目录。这种双重隔离机制能显著减少因路径遍历漏洞导致的越权访问风险。

# PHP-FPM pool config with chroot and chdir [site_b] user = www-data group = www-data listen = /run/php-fpm/site_b.sock chroot = /var/www/site_b chdir = / php_admin_value[open_basedir] = .:/tmp php_admin_value[disable_functions] = exec,passthru,shell_exec,system
在 [site_b] 池中,chroot = /var/www/site_b 将进程的根目录设置为 /var/www/site_b,这意味着进程内部看到的根目录就是 /var/www/site_b,无法访问 /var/www/site_b 之外的任何文件。即使攻击者利用路径遍历漏洞尝试访问 /../../etc/passwd,由于 chroot 的限制,实际访问的是 /var/www/site_b/../../etc/passwd,即 /var/www/etc/passwd,这通常不存在或为空。配合 open_basedir,安全性得到极大提升。
当 open_basedir 被绕过时,还有哪些补救措施?
尽管 open_basedir 是有效的隔离手段,但在某些情况下可能被绕过,例如通过符号链接或特定的文件包含技巧。为了应对这种情况,可以采取以下补救措施:首先,确保所有上传的文件存储在非 Web 可访问目录,并通过脚本处理后再提供服务;其次,定期更新 PHP 版本,以修复已知的 open_basedir 绕过漏洞;最后,使用 WAF(Web 应用防火墙)监控异常请求,拦截潜在的攻击行为。此外,最小化 PHP-FPM 进程的权限,仅授予必要的文件读写权限,也能有效降低风险。



















