当前位置: 代码网 > it编程>编程语言>Php > Nginx+ThinkPHP最小权限安全配置实战

Nginx+ThinkPHP最小权限安全配置实战

2026年09月16日 Php 我要评论
摘要宝塔面板默认常用 www 用户运行 nginx 和 php-fpm,网站文件属主也常是 www。这会导致 web 进程权限过大,一旦 thinkphp 应用出现漏洞,攻击者就能直接修改文件、写入

摘要

宝塔面板默认常用 www 用户运行 nginx 和 php-fpm,网站文件属主也常是 www。这会导致 web 进程权限过大,一旦 thinkphp 应用出现漏洞,攻击者就能直接修改文件、写入 webshell。本文以 thinkphp 为例,讲解如何创建独立用户、分离属主、设置最小权限,并在 nginx 和 php 层禁止 webshell 执行。

一、背景:宝塔默认配置的风险

宝塔面板安装后,默认配置通常是:

  • nginx 运行用户:www
  • php-fpm 运行用户:www
  • 网站目录属主:www

这种配置方便,但存在严重安全隐患:

  • web 进程用户 = 网站文件属主;
  • 一旦应用出现文件上传、rce 等漏洞,攻击者可以以 www 身份执行代码;
  • 由于 www 是文件属主,它可以 chmod 目录和文件;
  • 即使目录是 555,也能先改成 777,写入 webshell,再改回去。

因此,必须打破“web 进程用户 = 文件属主”这个等式。

二、核心原则

  • web 进程运行用户 ≠ 网站文件属主。
  • 代码目录只读。
  • runtimestorage 等运行时目录可写,但禁止执行 php。
  • 最小权限,按需开放。

三、创建专用运行用户

通过 ssh 登录服务器,创建一个无登录权限的系统用户,例如 tpuser

# 创建无登录权限的系统用户
sudo useradd -r -s /sbin/nologin tpuser

# 将 tpuser 加入 www 组,方便统一管理
sudo usermod -a -g www tpuser

说明:

  • -r:创建系统用户;
  • -s /sbin/nologin:禁止登录;
  • tpuser:专门用于运行 php-fpm。

四、设置项目属主与基线权限

假设 thinkphp 项目目录为:

/www/wwwroot/your-thinkphp-app

执行以下命令:

# 项目属主设为 tpuser,组为 www
sudo chown -r tpuser:www /www/wwwroot/your-thinkphp-app

# 目录基线:750
sudo find /www/wwwroot/your-thinkphp-app -type d -exec chmod 750 {} \;

# 文件基线:640
sudo find /www/wwwroot/your-thinkphp-app -type f -exec chmod 640 {} \;

说明:

  • tpuser:部署用户,拥有代码;
  • www:web 进程组,只读;
  • web 进程无法写代码目录,也无法 chmod

五、单独开放 runtime 和 storage

thinkphp 需要写缓存、日志、会话、上传文件,这些目录必须可写。

# runtime 目录
sudo chown -r tpuser:www /www/wwwroot/your-thinkphp-app/runtime
sudo chmod -r 770 /www/wwwroot/your-thinkphp-app/runtime
sudo find /www/wwwroot/your-thinkphp-app/runtime -type f -exec chmod 660 {} \;

# public/storage 上传目录
sudo chown -r tpuser:www /www/wwwroot/your-thinkphp-app/public/storage
sudo chmod -r 770 /www/wwwroot/your-thinkphp-app/public/storage
sudo find /www/wwwroot/your-thinkphp-app/public/storage -type f -exec chmod 660 {} \;

注意:

  • 目录 770 表示属主和组可读写执行,因为目录需要 x 才能进入;
  • 但目录可写 ≠ 可以执行 php,必须在 nginx 层禁止。

六、修改 php-fpm 运行用户

宝塔面板操作:

  1. 进入 软件商店 → 找到正在使用的 php 版本 → 点击 设置
  2. 选择 配置修改 选项卡;
  3. 找到:
user = www
group = www
  1. 修改为:
user = tpuser
group = www
  1. 点击 保存,然后重启 php-fpm 服务。

注意:

  • 如果服务器有多个站点共用这个 php 版本,改全局用户会影响所有站点;
  • 多站点建议为站点单独配置 php-fpm 池,或使用容器/独立环境;
  • 单站点可以直接改。

七、nginx 禁止敏感目录执行 php

进入宝塔面板:

网站 → 找到你的站点 → 设置配置文件

server 块内添加:

# 禁止 runtime、storage、uploads 目录执行 php
location ~ ^/(runtime|storage|uploads)/.*\.php$ {
    return 403;
}
# 禁止直接访问 runtime
location ^~ /runtime/ {
    deny all;
}

说明:

  • 如果站点根目录指向 public,url 中通常没有 public
  • storage 的 url 可能是 /storage/...
  • 根据实际 web 根调整路径。

八、php 层加固

在宝塔 php 配置或站点 fastcgi 配置中加:

open_basedir = /www/wwwroot/your-thinkphp-app/:/tmp/:/proc/

可选禁用危险函数:

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

注意:

  • 可能影响 thinkphp 正常功能,需测试;
  • open_basedir 限制 php 只能访问项目目录和 /tmp

九、验证与排查

执行以下命令检查配置:

# 查看 php-fpm 进程用户
ps aux | grep php-fpm

# 查看目录权限
ls -ld /www/wwwroot/your-thinkphp-app
ls -l /www/wwwroot/your-thinkphp-app/public

# 查看 acl
getfacl -p /www/wwwroot/your-thinkphp-app

# 查找最近修改的 php 文件
find /www/wwwroot/your-thinkphp-app -type f -name "*.php" -mtime -7 -ls

测试:

  • runtime 写文件,确认应用正常;
  • 访问 http://站点/storage/shell.php,应返回 403
  • 确认 web 进程不能写代码目录。

十、总结与检查清单

检查项期望状态
web 根目录指向 public/
代码文件属主tpuser,不是 www
代码目录权限750,文件 640
runtime/storage可写,但禁止执行 php
php-fpm 用户tpuser,不是 www
nginx禁止敏感目录执行 php
open_basedir限制在项目目录和 /tmp
危险函数按需禁用

一句话核心:

web 进程用户 ≠ 网站文件属主;代码只读,运行时目录可写但禁止执行 php。

按照这套方案配置后,即使 thinkphp 应用出现漏洞,攻击者也难以直接写入并执行 webshell,服务器安全性将显著提升。

以上就是nginx+thinkphp最小权限安全配置实战的详细内容,更多关于nginx thinkphp最小权限安全配置的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com