Linux环境下PHP-FPM安全设置的关键要点
确保PHP-FPM以**非特权用户(如www-data、nginx)**运行,避免使用root用户。需修改配置文件(通常为/etc/php/{version}/fpm/pool.d/www.conf),设置user和group为非root用户(如user = www-data、group = www-data)。若使用Unix socket通信,还需设置listen.owner和listen.group为同一非特权用户,并将listen.mode设为0660,限制socket文件的访问权限。
pm.max_children(最大子进程数)、pm.start_servers(启动时的子进程数)、pm.min_spare_servers(最小空闲进程数)、pm.max_spare_servers(最大空闲进程数)参数,避免过多进程消耗系统资源(如pm.max_children = 50)。/run/php/php{version}-fpm.sock)的权限仅允许Web服务器用户访问;若监听TCP端口(如9000),需通过防火墙(如ufw)限制仅可信IP(如Web服务器本地IP)可访问。php.ini中设置display_errors = Off,避免将错误信息暴露给用户;开启log_errors = On,将错误日志记录到安全位置(如/var/log/php-fpm/error.log)。disable_functions指令禁用可能执行系统命令的危险函数(如exec、system、shell_exec、passthru),防止恶意代码执行。allow_url_fopen和allow_url_include,防止远程文件包含攻击(RFI)。通过open_basedir指令限制PHP脚本只能访问指定目录(如网站根目录/var/www/html和临时目录/tmp),防止脚本访问敏感系统文件(如/etc/passwd)。示例配置:open_basedir = /var/www/html/:/tmp/。
使用防火墙(如ufw、iptables)限制对PHP-FPM的访问:
sudo ufw allow from 127.0.0.1 to any port 9000);listen 443 ssl),加密客户端与服务器之间的通信,防止数据泄露。request_slowlog_timeout(如10s)和slowlog(如/var/log/php-fpm/www-slow.log),记录执行时间超过阈值的请求,便于排查性能问题或恶意请求。/var/log/php-fpm/error.log)和慢日志,识别异常行为(如大量错误请求、超长执行时间的脚本)。setsebool命令关闭不必要的布尔值(如httpd_can_network_connect_db 0);AppArmor可通过编辑/etc/apparmor.d/usr.sbin.php-fpm文件,限制PHP-FPM只能访问必要目录。定期更新PHP-FPM、PHP核心及系统软件包,修复已知安全漏洞。使用包管理器(如apt、yum)自动更新:sudo apt update && sudo apt upgrade -y(Ubuntu/Debian)或sudo yum update -y(CentOS/RHEL)。