centos php-fpm安全设置指南
小樊
43
2025-11-15 19:30:54
CentOS 上 PHP-FPM 的安全设置指南
一 基础加固与系统准备
- 保持系统与 PHP 为最新版本,及时修补漏洞:执行 sudo yum update -y。
- 仅开启必要服务与端口,使用 firewalld 放行 HTTP/HTTPS:
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload
- 启用 SELinux 并保持在 enforcing 模式,按需配置策略:
sudo setenforce 1;在 /etc/selinux/config 中设置 SELINUX=enforcing。
- 运行身份最小化:确保 PHP-FPM 不以 root 运行,进程、监听套接字与日志文件均归专用低权限用户/组(如 apache 或 nginx)所有。
二 PHP-FPM 进程与监听安全
- 使用 Unix 域套接字优先,限制仅本地访问并收紧权限:
- 配置:listen = /run/php-fpm/www.sock
- 权限:设置 listen.owner = apache、listen.group = apache、listen.mode = 0660(与 Web 服务器运行用户一致)。
- 如必须使用 TCP 监听,仅绑定 127.0.0.1:9000,并限制可连客户端:
- 配置:listen = 127.0.0.1:9000,listen.allowed_clients = 127.0.0.1。
- 进程池与资源控制(按内存与负载调优):
- 示例:pm.max_children = 50、pm.start_servers = 5、pm.min_spare_servers = 5、pm.max_spare_servers = 35
- 超时与回收:request_terminate_timeout = 60s,pm.max_requests = 500~1000(防内存泄漏)。
- 安全相关的 FPM 指令:
- 关闭在页面显示错误:php_admin_flag[display_errors] = off
- 开启错误日志:php_admin_flag[log_errors] = on,php_admin_value[error_log] = /var/log/php-fpm/www-error.log
- 可选状态页与访问控制:启用 pm.status_path = /status,通过 allow/deny 或防火墙仅允许内网/管理网访问。
三 php.ini 关键安全选项
- 错误与信息泄露防护:
- display_errors = Off、log_errors = On、error_log = /var/log/php_errors.log
- expose_php = Off(隐藏 X-Powered-By: PHP/…)。
- 远程包含与执行限制:
- allow_url_fopen = Off、allow_url_include = Off
- 如业务允许再考虑 open_basedir(示例:/var/www/html/:/tmp/),避免过度放宽。
- 危险函数禁用(按应用需求精简):
- 建议:disable_functions = eval,assert,system,shell_exec,passthru,exec,popen,curl_exec,curl_multi_exec,proc_open,parse_ini_file,show_source。
- 文件上传与请求大小:
- 示例:file_uploads = On、upload_max_filesize = 10M、post_max_size = 12M(post 略大于 upload)。
- 会话安全:
- session.cookie_httponly = On、session.cookie_secure = On、session.cookie_samesite = Strict。
- 执行环境与性能:
- enable_dl = Off;启用并安全配置 OPcache(示例:opcache.enable=1、opcache.memory_consumption=128、opcache.interned_strings_buffer=8、opcache.max_accelerated_files=4000、opcache.revalidate_freq=60)。
四 权限与 Web 服务器联动
- 运行用户一致性:
- PHP-FPM 与 Web 服务器使用同一低权限用户/组(如 nginx:nginx 或 apache:apache),避免跨用户读写。
- 目录与文件权限:
- 站点根目录(如 /var/www/html)属主与运行用户一致;仅对需写入的目录(如 uploads、缓存)赋予写权限。
- SELinux 上下文(若启用):
- 为 Web 内容设置正确类型:sudo semanage fcontext -a -t httpd_sys_content_t “/var/www/html(/.*)?”
- 应用策略:sudo restorecon -Rv /var/www/html。
- Nginx 示例(与 Unix 套接字联动):
- location ~ .php$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass unix:/run/php-fpm/www.sock; }
- 上传与敏感目录防护:
- 禁止上传/数据目录执行脚本:
location ~* /(upload|data|static)[/.]/..(php|php5|asp|aspx|jsp|sh)$ { deny all; }
- 如采用“单一入口”,可禁止源码目录直接访问:
location ~* /(protected|source)/ { deny all; }。
五 监控 日志与持续运维
- 日志集中与审计:
- 确保 PHP-FPM 与 PHP 错误日志输出到专用文件(如 /var/log/php-fpm/ 与 /var/log/php_errors.log),并设置 logrotate 定期轮转与保留。
- 访问控制与 WAF:
- 仅开放 80/443;管理接口(如 /status)限制来源 IP。
- 部署 ModSecurity 等 WAF 组件增强请求过滤。
- 入侵防护与可用性:
- 使用 Fail2Ban 监控异常请求与暴力行为并自动封禁。
- 变更与验证:
- 每次修改后执行 sudo systemctl restart php-fpm(及 nginx/httpd),并通过 phpinfo()(仅内网验证)、日志与监控面板核查生效与异常。