Linux PHP-FPM安全配置详解
LinuxPHP-FPM安全配置需从十个环节入手:更新系统版本、以非特权用户运行、优先使用UnixSocket监听、限制进程资源、禁用危险PHP函数与远程文件访问、设置open_basedir访问范围、配置防火墙、启用慢日志监控、使用SELinux或AppArmor增强防护,并定期审计配置与备份文件,以提升服务器抗攻击能力。
Linux下PHP-FPM安全配置指南——这活儿看着基础,但真要做好,还真得把每个环节都踩实了。PHP-FPM作为PHP应用的“发动机”,它的安全配置直接决定了服务器能不能扛得住攻击。下面这十个步骤,都是从实战里沉淀出来的经验,按顺序走一遍,能省不少后顾之忧。
1. 更新系统与PHP-FPM至最新版本
保持系统和PHP-FPM更新,是堵上已知安全漏洞的第一步,也是最基础的防线。用包管理器走一下:
sudo apt update && sudo apt upgrade php-fpm php-cli
别忘了把依赖包也同步更新,旧版本的漏洞往往就藏在那里。
2. 以非特权用户运行PHP-FPM
绝对不要用root身份跑PHP-FPM——这个道理大家都懂,但实际配置里总有人图省事跳过。编辑进程池配置文件(通常在/etc/php/{版本号}/fpm/pool.d/www.conf),把这两项改了:
user = www-data
group = www-data
改完记得重启:
sudo systemctl restart php{版本号}-fpm
3. 选择安全的监听方式(Unix Socket优先)
能用Unix Socket就别碰TCP端口。Socket只允许本地进程访问,天然比暴露一个网络端口安全得多。配置里把listen改成:
listen = /run/php/php{版本号}-fpm.sock
然后确认Socket文件的权限(属主www-data,权限755):
sudo chown www-data:www-data /run/php
sudo chmod 755 /run/php
如果非要用TCP端口(比如多机部署),务必把监听地址限制在127.0.0.1,再用防火墙锁死。
4. 限制PHP-FPM进程资源
资源控制是防资源耗尽攻击的硬招。动态进程管理模式下,这几个参数得根据服务器内存精打细算:
pm = dynamic
pm.max_children = 50 # 最大子进程数(2GB内存建议30-40)
pm.start_servers = 5 # 启动时子进程数
pm.min_spare_servers = 5 # 最小空闲数
pm.max_spare_servers = 35 # 最大空闲数
数值调太大会被拖垮,调太小影响并发,得在安全和性能之间找个平衡。
5. 禁用危险PHP函数与功能
这个环节是重中之重。先把那些能执行系统命令的函数封死:
disable_functions = exec,passthru,shell_exec,system,eval
远程文件访问也得关掉——allow_url_fopen和allow_url_include设为Off,防止远程文件包含攻击。再顺手把expose_php关了,别让攻击者知道你用的是哪个PHP版本:
allow_url_fopen = Off
allow_url_include = Off
expose_php = Off
错误信息也别直接在页面上显示,转到日志里更安全:
display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
6. 限制PHP脚本访问范围(open_basedir)
open_basedir就像给PHP脚本画了一个圈,不允许它访问圈外的系统文件。配置样例:
open_basedir = /var/www/html/:/tmp/
多个目录用冒号分隔,务必把网站根目录和临时目录都包括进去。
7. 配置防火墙限制访问
如果用了Unix Socket,防火墙这步可以跳过——反正本地进程都走不了网络。但要是用了TCP端口,比如9000,那就得用ufw把端口锁死在本地:
sudo ufw allow from 127.0.0.1 to any port 9000/tcp
sudo ufw enable
同时别忘了给SSH(22)、HTTP(80)、HTTPS(443)这些必要服务开放端口。
8. 启用慢日志监控性能与异常
慢日志不仅用来调优,还能揪出潜在的后门脚本——攻击者往往通过耗时的循环来试探系统。在进程池配置里加上:
request_slowlog_timeout = 10s
slowlog = /var/log/php-fpm/www-slow.log
定期翻翻这个日志,能发现不少蹊跷。
9. 使用安全模块增强防护
SELinux和AppArmor可以给PHP-FPM再加一道锁。以SELinux为例:
sudo apt install selinux-basics selinux-policy-default
sudo setenforce 1
AppArmor的配置类似:
sudo apt install apparmor apparmor-utils
sudo aa-enforce /etc/apparmor.d/usr.sbin.php-fpm
根据实际情况调整策略就好,别一上来就全开,容易搞挂服务。
10. 定期审计与备份
配置完不是终点。定期检查配置文件的权限(www.conf、php.ini的属主应为root,权限644),确认没有被人偷偷改过。网站文件、数据库和配置文件也要定时备份,防止一夜回到解放前。
做完以上十步,PHP-FPM的安全水平能提升一大截。最后别忘了重启服务让所有变更生效:
sudo systemctl restart php{版本号}-fpm