温馨提示×

centos php-fpm安全设置指南

小樊
46
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 运行,进程、监听套接字与日志文件均归专用低权限用户/组(如 apachenginx)所有。

二 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:9000listen.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 = 60spm.max_requests = 500~1000(防内存泄漏)。
  • 安全相关的 FPM 指令:
    • 关闭在页面显示错误:php_admin_flag[display_errors] = off
    • 开启错误日志:php_admin_flag[log_errors] = onphp_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:nginxapache: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()(仅内网验证)、日志与监控面板核查生效与异常。

0