Apache可通过组合配置实现CGI/FastCGI沙箱化:限定低权限用户、chroot或open_basedir限制文件访问、clear_env+白名单控制环境变量、disable_functions禁用危险函数、RLimit系列指令约束资源与超时。

Apache 本身不提供完整的进程级沙箱(如容器或 seccomp),但可通过组合配置和系统机制,显著收紧 CGI/FastCGI 的执行边界,防止脚本越权读写、逃逸或滥用资源。核心思路是:限制运行身份 + 隔离文件访问 + 控制环境变量 + 拦截危险系统调用。
限定执行用户与组(最小权限原则)
CGI/FastCGI 脚本默认可能以 Apache 主进程用户(如 www-data)运行,权限过大。应为每类脚本分配独立低权限用户:
- 创建专用用户:
sudo adduser --disabled-password --gecos "" cgi-php-user - 在 FastCGI 配置中指定用户(以 PHP-FPM 为例):
编辑/etc/php/*/fpm/pool.d/www.conf,设置:user = cgi-php-usergroup = cgi-php-userlisten.owner = cgi-php-userlisten.group = cgi-php-user - 确保 PHP-FPM socket 文件属主匹配(如
/run/php/php8.2-fpm.sock),否则 Apache 无法连接
限制文件系统可见范围(chroot 或 bind mount)
避免脚本遍历根目录或访问敏感路径(如 /etc、/home):
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- PHP-FPM 支持
chroot:在 pool 配置中添加chroot = /var/www/chroot-php
并将所需文件(/dev/null、/tmp、/usr/bin/env等)手动复制或 bind mount 进去 - 更轻量方式:使用
open_basedir(仅对 PHP 有效)
在 FPM pool 或.htaccess中设:php_admin_value open_basedir "/var/www/site/:/tmp/"
注意:该值必须包含脚本所在目录及所有需访问的路径,否则报错 - 对 CGI 脚本(如 Perl/Python),可在 wrapper 脚本中用
chroot或unshare --user --pid --mount启动,但需 root 权限配置
裁剪环境变量与禁用危险函数
大量环境变量(如 PATH、LD_LIBRARY_PATH)可能被利用加载恶意库或执行非预期命令:
- 在 PHP-FPM pool 中清除无关变量:
clear_env = yes
再显式设置必要项:env[PATH] = /usr/local/bin:/usr/bin:/binenv[TMPDIR] = /tmp - 禁用高危 PHP 函数(在
php.ini或 pool 中):disable_functions = exec,passthru,shell_exec,system,proc_open,popen,pcntl_exec - 对 CGI 脚本,Apache 的
CGIPassEnv默认传递全部环境变量;建议改用SetEnvIf白名单控制:SetEnvIf Request_URI ".*" CGI_ENV_ALLOWED=1
并在 wrapper 中只导出明确允许的变量
限制资源与超时(防 DoS)
防止恶意脚本耗尽 CPU、内存或打开过多文件句柄:
- PHP-FPM 提供精细控制:
process.max = 50rlimit_files = 1024rlimit_core = 0slowlog = /var/log/php-slow.logrequest_slowlog_timeout = 5s - Apache 层补充:
在虚拟主机或目录块中启用:RLimitCPU 30 60(软限30秒,硬限60秒)RLimitMEM 104857600(最大内存100MB)RLimitNPROC 20(最多20个进程) - FastCGI 连接超时也需匹配:
ProxyTimeout 30FcgidIOTimeout 30(若用 mod_fcgid)
不复杂但容易忽略——安全不是加一层“防护罩”,而是层层收窄执行上下文。从用户身份开始,到文件路径、环境、资源,每一步都做减法,才能让 CGI/FastCGI 真正跑在可控的轨道上。

















