温馨提示×

ubuntu php-fpm如何安全加固

小樊
42
2026-10-21 22:31:26
栏目: 编程语言

下面从系统层、PHP-FPM 层、PHP 层、运维层四个维度,给你一份在 Ubuntu 上安全加固 php-fpm的实用清单(以 Ubuntu 20.04/22.04 + PHP 8.x 为例,其他版本思路一致)。


一、系统与用户隔离(最重要)

1. 使用独立低权限用户

不要使用 www-data 跑所有站点。

sudo adduser --disabled-login --no-create-home phpapp1

php-fpm pool 配置:

[app1]
user = phpapp1
group = phpapp1
listen.owner = www-data
listen.group = www-data

2. 每个站点一个 pool

/etc/php/8.1/fpm/pool.d/app1.conf
/etc/php/8.1/fpm/pool.d/app2.conf

避免一个站点被攻破影响全部。


二、PHP-FPM 安全配置

1. 限制 listen 方式(推荐 socket)

listen = /run/php/php8.1-fpm-app1.sock
listen.mode = 0660

不要用 listen = 9000 暴露端口。

2. 限制进程资源

pm = dynamic
pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 10

防止 Dos / 资源耗尽。

3. 禁止执行系统命令(关键)

disable_functions = exec,passthru,shell_exec,system,proc_open,popen

如业务需要,逐个开放。


三、PHP 本身安全加固

编辑 php.ini:

expose_php = Off
display_errors = Off
log_errors = On
allow_url_fopen = Off
allow_url_include = Off
enable_dl = Off
file_uploads = On
upload_tmp_dir = /var/www/uploads_tmp
open_basedir = /var/www/app1:/tmp

禁用危险扩展(如不用)

sudo phpdismod sockets sysvsem

四、文件系统权限

1. 目录权限

/var/www/app1     755
/var/www/app1/public 755
storage/cache     750 (phpapp1:phpapp1)

2. 禁止执行 PHP 的目录

location ~* /uploads/.*\.php$ {
    deny all;
}

五、Web 服务器配合(Nginx 示例)

location ~ \.php$ {
    include fastcgi_params;
    fastcgi_pass unix:/run/php/php8.1-fpm-app1.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

仅允许 index.php 入口:

location / {
    try_files $uri $uri/ /index.php?$query_string;
}

六、日志与监控

/var/log/php8.1-fpm.log
/var/log/nginx/access.log

建议:

  • fail2ban 限制暴力
  • 审计 disable_functions 是否被绕过
  • 定期 apt update && apt upgrade

七、进阶(可选但推荐)

  • ✅ AppArmor / SELinux
  • ✅ PHP-FPM chroot
  • ✅ Read-only root FS(容器场景)
  • ✅ Suhosin(旧版本)
  • ✅ OpenResty + WAF

最小安全模板(总结)

user = app1
group = app1
listen = /run/php/php8.1-fpm-app1.sock
listen.mode = 0660
disable_functions = exec,shell_exec,system
pm.max_children = 20
expose_php = Off
display_errors = Off
open_basedir = /var/www/app1:/tmp

如果你愿意,我可以:

  • 给你 nginx + php-fpm 完整安全配置
  • 针对 Laravel / WordPress / ThinkPHP 做专项加固
  • 写一份 checklist 脚本

你现在是哪种使用场景?

0 踩